aboutsummaryrefslogtreecommitdiff
path: root/2020
diff options
context:
space:
mode:
authorHunky Jimpjorps <thechairman@thechairman.info>2022-12-12 09:57:37 -0500
committerHunky Jimpjorps <thechairman@thechairman.info>2022-12-12 09:57:37 -0500
commit591488cf7c85e4b8bfdbebdce2187bb23c41fa0d (patch)
tree64c38cc9607ae537e07fa8f63fc9339956bfdc87 /2020
parent2c50f6aefe5c385672312e8907fc1e6724e215d1 (diff)
parent69de3d8e95b8d66609e07dffcb2022dde901d837 (diff)
downloadgleam_aoc-591488cf7c85e4b8bfdbebdce2187bb23c41fa0d.tar.gz
gleam_aoc-591488cf7c85e4b8bfdbebdce2187bb23c41fa0d.zip
Merge branch 'main' of https://github.com/hunkyjimpjorps/AdventOfCode
Diffstat (limited to '2020')
-rw-r--r--2020/day-15/day-15.rkt22
-rw-r--r--2020/day-16/day-16.rkt34
2 files changed, 56 insertions, 0 deletions
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