#lang plai-typed (define-type Step [straight (distance : number)] [right] [left] [rand (option-1 : Program) (option-2 : Program) ]) (define-type-alias Program (listof Step)) ;; Template: ;(define (move-count (program : Program)) : ... ; (cond [(empty? program) ...] ; [(cons? program) ... (step-count (first program)) ; ... (move-count (rest program)) ...])) (define (move-count (program : Program)) : number (cond [(empty? program) 0] [(cons? program) (+ (step-count (first program)) (move-count (rest program)))])) (define (any-turns (program : Program)) : boolean (cond [(empty? program) #f] [(cons? program) (or (turn? (first program)) (any-turns (rest program)))])) (module+ test (test (any-turns empty) #f) (test (any-turns (list (left))) #t)) ;; Template: ;(define (step-count [step : Step]) : ... ; (type-case Step step ; [straight (distance) ...] ; [left () ...] ; [right () ...] ; [rand (option-1 option-2) ; ... (move-count option-1) ... (move-count option-2) ... ] )) (define (step-count [step : Step]) : number (type-case Step step [straight (distance) distance] [left () 1] [right () 1] [rand (option-1 option-2) (max (move-count option-1) (move-count option-2) ) ] )) (define (turn? (step : Step)) : boolean (type-case Step step [straight (distance) #f] [left () #t] [right () #t] [rand (option-1 option-2) (or (any-turns option-1) (any-turns option-2))])) (module+ test (test (turn? (straight 2)) #f) (test (turn? (left)) #t) (test (turn? (right)) #t) (test (turn? (rand (list (left)) (list (straight 2)))) #t) (test (turn? (rand (list (straight 2)) (list (straight 1)))) #f)) (test (step-count (straight 0)) 0) (test (step-count (straight 1)) 1) (test (step-count (left)) 1) (test (step-count (right)) 1) (test (step-count (rand empty empty)) 0) (test (step-count (rand (cons (straight 1) (cons (straight 0) empty)) empty)) 1) (test (step-count (rand (cons (straight 0) (cons (straight 1) empty)) empty)) 1) (test (move-count empty) 0) (test (move-count (cons (straight 1) empty)) 1) (test (move-count (cons (straight 2) empty)) 2) (test (move-count (cons (straight 1) (cons (left) empty))) 2)