12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- #lang racket
- (require "../lib/utils.rkt")
- (define lines
- (call-with-input-file "input"
- (λ (fp) (get-lines fp))))
- (define instructions (string->list (car lines)))
- (define (make-instruction-generator)
- (define cur instructions)
- (λ ()
- (when (null? cur)
- (set! cur instructions))
- (define ret (car cur))
- (set! cur (cdr cur))
- ret))
- (define next-instruction (make-instruction-generator))
- (set! lines (cddr lines))
- (define (parse-map str)
- (define p1 (string-split str "="))
- (define key (string-trim (car p1)))
- (define val-str (string-trim (cadr p1)))
- (define value (list (substring val-str 1 4) (substring val-str 6 9)))
- (cons key value))
- (define the-map (make-hash (map parse-map lines)))
- (define (simulate start end)
- (let loop ((i 0) (cur start))
- (if (string=? cur end)
- i
- (let ()
- (define instruction (next-instruction))
- (define mapping (hash-ref the-map cur))
- (define next
- (if (char=? instruction #\L)
- (car mapping)
- (cadr mapping)))
- (loop (+ 1 i) next)))))
- (simulate "AAA" "ZZZ")
|