about summary refs log tree commit diff
path: root/day20.rkt
blob: 52840344f62c3950c185257dc37acfecaadf9533 (plain) (blame)
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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