about summary refs log tree commit diff
path: root/day20.rkt
diff options
context:
space:
mode:
authorLeah Neukirchen <leah@vuxu.org>2022-12-21 22:10:24 +0100
committerLeah Neukirchen <leah@vuxu.org>2022-12-21 22:10:24 +0100
commite342805d04e4b180774c37c41f9e58427d2b1d9d (patch)
tree61691db19393b1971ca3b3dce9f61a9af1c70453 /day20.rkt
parentd1024e0497bdf21c074387cfde053cd3439463ec (diff)
downloadadventofcode2022-e342805d04e4b180774c37c41f9e58427d2b1d9d.tar.gz
adventofcode2022-e342805d04e4b180774c37c41f9e58427d2b1d9d.tar.xz
adventofcode2022-e342805d04e4b180774c37c41f9e58427d2b1d9d.zip
day20
Diffstat (limited to 'day20.rkt')
-rw-r--r--day20.rkt94
1 files changed, 94 insertions, 0 deletions
diff --git a/day20.rkt b/day20.rkt
new file mode 100644
index 0000000..5284034
--- /dev/null
+++ b/day20.rkt
@@ -0,0 +1,94 @@
+#lang racket
+
+(require data/queue)
+
+(define data (for/list ([(n i) (in-indexed (file->list "day20-sterni"))])
+               (vector n i)))
+
+(define (move zip n)
+  (cond [(= n 0) zip]
+        [(< n 0) (if (null? (car zip))
+                   (move (cons (reverse (cdr zip)) '()) n)
+                   (move (cons (cdr (car zip))
+                               (cons (car (car zip)) (cdr zip)))
+                         (+ n 1)))]
+        [(> n 0) (if (null? (cdr zip))
+                   (move (cons '() (reverse (car zip))) n)
+                   (move (cons (cons (car (cdr zip)) (car zip))
+                               (cdr (cdr zip)))
+                         (- n 1)))]))
+
+(define (peek zip)
+  (if (null? (cdr zip))
+    (peek (move (move zip 1) -1))
+    (car (cdr zip))))
+
+(define (zip->list zip)
+  (append (reverse (car zip)) (cdr zip)))
+
+(define (find ring elt)
+  (let ([ring (move (move ring 1) -1)])
+    (if (equal? (vector-ref (peek ring) 1) elt)
+      ring
+      (find (move ring 1) elt))))
+
+(define (find-val ring elt)
+  (let ([ring (move (move ring 1) -1)])
+    (if (equal? (vector-ref (peek ring) 0) elt)
+      ring
+      (find-val (move ring 1) elt))))
+
+; (move (cons (list 1 2 3) (list 4 5 6)) 2)
+; (move (move (cons (list 1 2 3) (list 4 5 6)) 100) -100)
+
+(define ring (cons '() data))
+
+(define (shift ring n)
+  (let* ([n (remainder n (- (length data) 1))]
+         [ring (move (move ring 1) -1)]
+         [e (peek ring)]
+         [ring (cons (car ring) (cdr (cdr ring)))]  ; drop e
+         [ring (move ring n)]
+         [ring (cons (car ring) (cons e (cdr ring)))]  ; insert e
+         [ring (move ring (- n 1))]
+         )
+    ring))
+
+; (shift (cons (list #(1 1) #(2 2) #(3 3)) (list #(4 4) #(5 5) #(6 6))) 2)
+
+(for ([(_ i) (in-indexed data)])
+  (set! ring (find ring i))
+  (set! ring (shift ring (vector-ref (peek ring) 0))))
+
+(let* ([_ (set! ring (find-val ring 0))]
+       [_ (set! ring (move ring 1000))]
+       [a (vector-ref (peek ring) 0)]
+       [_ (set! ring (move ring 1000))]
+       [b (vector-ref (peek ring) 0)]
+       [_ (set! ring (move ring 1000))]
+       [c (vector-ref (peek ring) 0)])
+  (+ a b c))
+;; 16533
+
+
+(define data2 (for/list ([(n i) (in-indexed (file->list "day20"))])
+                (vector (* n 811589153) i)))
+
+(define ring2 (cons '() data2))
+
+(for ([_ (in-inclusive-range 1 10)])
+  (for ([(_ i) (in-indexed data2)])
+    (set! ring2 (find ring2 i))
+    (set! ring2 (shift ring2 (vector-ref (peek ring2) 0)))))
+
+(zip->list ring2)
+
+(let* ([_ (set! ring2 (find-val ring2 0))]
+       [_ (set! ring2 (move ring2 1000))]
+       [a (vector-ref (peek ring2) 0)]
+       [_ (set! ring2 (move ring2 1000))]
+       [b (vector-ref (peek ring2) 0)]
+       [_ (set! ring2 (move ring2 1000))]
+       [c (vector-ref (peek ring2) 0)])
+  (+ a b c))
+;; 4789999181006