blob: 35ca47a5bd0e2b963ec05851c829d51194d96b86 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#lang racket
(require "../../lib/utils.rkt")
(define lines
(call-with-input-file "input"
(lambda (fp)
(get-lines fp))))
(define instructions (string->list (car lines)))
(define (make-instruction-generator)
(define cur instructions)
(lambda ()
(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 (is-start? str)
(char=? #\A (string-ref str 2)))
(define (is-end? str)
(char=? #\Z (string-ref str 2)))
(define (simulate start)
(let loop ((i 0) (cur start))
(if (is-end? cur)
i
(let ()
(define instruction (next-instruction))
(define (next-point point)
(define mapping (hash-ref the-map point))
(if (char=? instruction #\L)
(car mapping)
(cadr mapping)))
(loop (+ 1 i) (next-point cur))))))
(define starts
(let ()
(define lst (hash->list the-map))
(define keys (map car lst))
(filter is-start? keys)))
(apply lcm (map simulate starts))
|