From b625e4b1d4ef4f6e912b9edd062f579909faa3b1 Mon Sep 17 00:00:00 2001 From: Hunky Jimpjorps Date: Fri, 9 Dec 2022 23:47:58 -0500 Subject: 2020 day 15 complete, day 16 in progress --- 2020/day-15/day-15.rkt | 22 ++++++++++++++++++++++ 2020/day-16/day-16.rkt | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 2020/day-15/day-15.rkt create mode 100644 2020/day-16/day-16.rkt (limited to '2020') diff --git a/2020/day-15/day-15.rkt b/2020/day-15/day-15.rkt new file mode 100644 index 0000000..4dd9e88 --- /dev/null +++ b/2020/day-15/day-15.rkt @@ -0,0 +1,22 @@ +#lang rackjure + +(define first-numbers '(2 20 0 4 1 17)) + +(define number-hash + (for/hash ([(xs i) (in-indexed (drop-right first-numbers 1))]) + (values xs (add1 i)))) + +(define starting-round (~> number-hash hash-values (apply max _) (+ 2))) + +(define (find-spoken-number-at end) + (for/fold ([ns number-hash] [previous-number (last first-numbers)] #:result previous-number) + ([rnd (inclusive-range starting-round end)]) + (define next-spoken-number + (match (ns previous-number) + [#f 0] + [n (- (sub1 rnd) n)])) + (values (ns previous-number (sub1 rnd)) next-spoken-number))) + +(find-spoken-number-at 2020) + +(find-spoken-number-at 30000000) \ No newline at end of file diff --git a/2020/day-16/day-16.rkt b/2020/day-16/day-16.rkt new file mode 100644 index 0000000..64271c7 --- /dev/null +++ b/2020/day-16/day-16.rkt @@ -0,0 +1,34 @@ +#lang racket + +(require advent-of-code + relation + threading + rebellion/base/range) + +(struct field-rule (name range1 range2) #:transparent) + +(define (make-lines strs) + (string-split strs "\n")) +(define (seperate-fields strs) + (~>> (string-split strs ",") (map ->number))) + +(define (process-rules str) + (match str + [(regexp + #px"(.+): (\\d+)-(\\d+) or (\\d+)-(\\d+)" + (list _ name (app ->number min1) (app ->number max1) (app ->number min2) (app ->number max2))) + (field-rule name (closed-range min1 max1) (closed-range min2 max2))])) + +(match-define (list (app (λ~>> make-lines (map process-rules)) ticket-rules) + (app (λ~>> make-lines second seperate-fields) your-ticket) + (app (λ~>> make-lines rest (map seperate-fields)) other-tickets)) + (~> (fetch-aoc-input (find-session) 2020 16) (string-split "\n\n"))) + +(define (ticket-scanning-error-rate ticket rules) + (for/sum ([ticket-field (in-list ticket)] + [ticket-rule (in-list rules)] + #:do [(match-define (field-rule _ r1 r2) ticket-rule)] + #:unless (or (range-contains? r1 ticket-field) (range-contains? r2 ticket-field))) + ticket-field)) + +(for/sum ([ticket (in-list other-tickets)]) (ticket-scanning-error-rate ticket ticket-rules)) \ No newline at end of file -- cgit v1.2.3