diff options
| author | Mistivia <i@mistivia.com> | 2024-02-25 20:11:54 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2024-02-25 20:11:54 +0800 |
| commit | 515ecbf5a20a8e432a998b0a543bedcb1bd64cf4 (patch) | |
| tree | 6353c603a8cf0276553f420205f8d1c730a318ce /08/2.rkt | |
| parent | e191b610c11326b587cf0b01fd6fc37b8d07bb19 (diff) | |
reorg code
Diffstat (limited to '08/2.rkt')
| -rw-r--r-- | 08/2.rkt | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/08/2.rkt b/08/2.rkt new file mode 100644 index 0000000..a56d874 --- /dev/null +++ b/08/2.rkt @@ -0,0 +1,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))
\ No newline at end of file |
