aboutsummaryrefslogtreecommitdiff
path: root/08
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2024-02-25 20:11:54 +0800
committerMistivia <i@mistivia.com>2024-02-25 20:11:54 +0800
commit515ecbf5a20a8e432a998b0a543bedcb1bd64cf4 (patch)
tree6353c603a8cf0276553f420205f8d1c730a318ce /08
parente191b610c11326b587cf0b01fd6fc37b8d07bb19 (diff)
reorg code
Diffstat (limited to '08')
-rw-r--r--08/1.rkt47
-rw-r--r--08/2.rkt60
2 files changed, 107 insertions, 0 deletions
diff --git a/08/1.rkt b/08/1.rkt
new file mode 100644
index 0000000..91dbcea
--- /dev/null
+++ b/08/1.rkt
@@ -0,0 +1,47 @@
+#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 (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") \ No newline at end of file
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