#lang plai-typed ;; move forward n ;; turn left ;; turn right ;; flip a coin and pick a program (define-type Step [left] [right] [forward (n : number)] [flip-coin (h : (listof Step)) (t : (listof Step))]) ;(define (fuel-for-step [s : Step]) ; (type-case Step s ; [left () ...] ; [right () ...] ; [forward (n) ... n ...] ; [flip-coin (h t) ... (fuel-for-program h) ... (fuel-for-program t) ...])) (define (fuel-for-step [s : Step]) : number (type-case Step s [left () 0] [right () 0] [forward (n) n] [flip-coin (h t) (max (fuel-for-program h) (fuel-for-program t))])) (module+ test (test (fuel-for-step (left)) 0) (test (fuel-for-step (right)) 0) (test (fuel-for-step (forward 42)) 42) (test (fuel-for-step (flip-coin (list (left) (forward 6) (right)) (list (forward 4)))) 6) (test (fuel-for-step (flip-coin (list (left) (forward 3) (right)) (list (forward 4)))) 4)) ;; A (listof Step) is either ;; - empty ;; - (cons [Step] [(listof Step)]) ;(define (fuel-for-program [p : (listof Step)]) ; (cond ; [(empty? p) ...] ; [(cons? p) .... (fuel-for-step (first p)) ... ; (fuel-for-program (rest p)) ...])) (define (fuel-for-program [p : (listof Step)]) (cond [(empty? p) 0] [(cons? p) (+ (fuel-for-step (first p)) (fuel-for-program (rest p)))])) (module+ test (test (fuel-for-program empty) 0) (test (fuel-for-program (cons (left) empty)) 0) (test (fuel-for-program (cons (forward 8) (cons (left) empty))) 8) (test (fuel-for-program (list (left) (forward 2) (forward 3))) 5))