From e342805d04e4b180774c37c41f9e58427d2b1d9d Mon Sep 17 00:00:00 2001 From: Leah Neukirchen Date: Wed, 21 Dec 2022 22:10:24 +0100 Subject: day20 --- day20.rkt | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 day20.rkt (limited to 'day20.rkt') 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 -- cgit 1.4.1