Overview
Comment: | Add Day 14 solutions |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
80485bbfcef6fedc6c3ed47ee7879d4e |
User & Date: | joel on 2018-12-24 13:29:30 |
Other Links: | manifest | tags |
Context
2019-11-25
| ||
13:27 | Day 15 first steps check-in: 440bf0 user: joel tags: day15 | |
2018-12-24
| ||
13:29 | Add Day 14 solutions Leaf check-in: 80485b user: joel tags: trunk | |
2018-12-22
| ||
19:04 | Add Day 13 solutions check-in: 381699 user: joel tags: trunk | |
Changes
Added day14.rkt version [b43645].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 | #lang racket (require rackunit) (define input 640441) ;; To try to get this code to finish running before Christmas, ;; going to try starting out with a mega-ass vector and keep ;; track of the index of the last value in a struct (define recipes (make-vector 30000000)) (define (append-recipes! r-count val) (cond [(> val 9) (vector-set! recipes r-count 1) (vector-set! recipes (add1 r-count) (- val 10)) (+ r-count 2)] [else (vector-set! recipes r-count val) (add1 r-count)])) (append-recipes! 0 3) (append-recipes! 1 7) (struct state (rcount elf1 elf2) #:transparent) ; To start: there are 2 recipes with elves at positions 1 and 0 (define start (state 2 1 0)) (define (score current-state) (match-define (state recipe-count e1 e2) current-state) (+ (vector-ref recipes e1) (vector-ref recipes e2))) (define (move-elf pos r-count) (modulo (+ pos (add1 (vector-ref recipes pos))) r-count)) ;; For debugging (define (list-recipes start end) (for/list ([i (in-range start end)]) (vector-ref recipes i))) ;; Get the ten recipes after the given recipe (define (get-10-after starting-state n) (let loop ([current-state starting-state]) (match-define (state recipe-count e1 e2) current-state) (cond [(>= (- recipe-count 11) n) (list-recipes n (+ n 10))] [else (define new-count (append-recipes! recipe-count (score current-state))) (loop (state new-count (move-elf e1 new-count) (move-elf e2 new-count)))]))) (define (day14-part1 n) (apply string-append (map number->string (get-10-after start n)))) (module+ test (check-equal? (time (day14-part1 9)) "5158916779") (check-equal? (time (day14-part1 5)) "0124515891") (check-equal? (time (day14-part1 18)) "9251071085") (check-equal? (time (day14-part1 2018)) "5941429882") (check-equal? (time (day14-part1 input)) "1041411104")) ; Correct answer for part 1 (define input-part2 #(6 4 0 4 4 1)) (define (found-yet? start) (cond [(< start 0) #f] [else (for/and ([i (in-range start (+ start 6))]) (equal? (vector-ref input-part2 (- i start)) (vector-ref recipes i)))])) ;; How many recipes to the left of the input sequence? (define (day14-part2) (let loop ([current-state start]) (match-define (state recipe-count e1 e2) current-state) (define new-count (append-recipes! recipe-count (score current-state))) (define found? (cond [(equal? 2 (- new-count recipe-count)) (or (found-yet? (- new-count 7)) (found-yet? (- new-count 6)))] [else (found-yet? (- new-count 6))])) (cond [(and found? (found-yet? (- new-count 7))) (- new-count 7)] [found? (- new-count 6)] [else (loop (state new-count (move-elf e1 new-count) (move-elf e2 new-count)))]))) (module+ test (check-equal? (time (day14-part2)) 20174745)) ; Correct answer for part 2 |