aboutsummaryrefslogtreecommitdiff
path: root/2022
diff options
context:
space:
mode:
authorHunky Jimpjorps <thechairman@thechairman.info>2022-12-21 00:05:53 -0500
committerHunky Jimpjorps <thechairman@thechairman.info>2022-12-21 00:05:53 -0500
commit8c073d45608f3030ea755fd57d0190efbe89fa18 (patch)
tree441003e34b4127e650a4c718b4f7aa96ece27e18 /2022
parent545888b248db22805e9bd24b4fea1ce0524fb0be (diff)
parentf8c7d4e47f04fa2bfbbe5a9487f765bdf898c3ba (diff)
downloadgleam_aoc-8c073d45608f3030ea755fd57d0190efbe89fa18.tar.gz
gleam_aoc-8c073d45608f3030ea755fd57d0190efbe89fa18.zip
Merge branch 'main' of https://github.com/hunkyjimpjorps/AdventOfCode into main
Diffstat (limited to '2022')
-rw-r--r--2022/day-16/day-16.rkt10
-rw-r--r--2022/day-20/day-20.rkt48
2 files changed, 49 insertions, 9 deletions
diff --git a/2022/day-16/day-16.rkt b/2022/day-16/day-16.rkt
index 2503da1..0e5ab77 100644
--- a/2022/day-16/day-16.rkt
+++ b/2022/day-16/day-16.rkt
@@ -60,12 +60,4 @@
(values running-pressure remaining-valves*)))]
[else (cons current-pressure available-valves)]))
-(car (find-best-single-route "AA"))
-
-;; part 2
-; (define (find-best-double-route start)
-; (define done-by-me (find-best-single-route start 26))
-; (define done-by-elephant (find-best-single-route start 26 0 (cdr done-by-me)))
-; (+ (car done-by-me) (car done-by-elephant)))
-
-; (find-best-double-route "AA")
+(car (find-best-single-route "AA")) \ No newline at end of file
diff --git a/2022/day-20/day-20.rkt b/2022/day-20/day-20.rkt
new file mode 100644
index 0000000..6dd1070
--- /dev/null
+++ b/2022/day-20/day-20.rkt
@@ -0,0 +1,48 @@
+#lang racket
+(require advent-of-code
+ threading)
+
+(define data (port->list read (open-aoc-input (find-session) 2022 20 #:cache #true)))
+
+(define gps-lst data)
+(define gps-len (length gps-lst))
+(define gps-indexed (map cons (inclusive-range 1 gps-len) gps-lst))
+
+(define (mix pt data)
+ (match-define (list left ... (== pt) right ...) data)
+ (define start (index-of data pt))
+ (define move-by (modulo (cdr pt) (sub1 gps-len)))
+ (cond
+ [(= 0 move-by) data]
+ [(<= move-by (length right))
+ (match-define-values (new-left new-right)
+ (split-at (append left right) (modulo (+ move-by start) (sub1 gps-len))))
+ (append new-left (list pt) new-right)]
+ [else
+ (match-define-values (new-left new-right)
+ (split-at (append left right) (modulo (+ move-by start) (sub1 gps-len))))
+ (append new-left (list pt) new-right)]))
+
+(define (mix-gps data original)
+ (for/fold ([pts data]) ([pt original])
+ (mix pt pts)))
+
+(define (cycle-mixed-gps mixed)
+ (define lst (map cdr mixed))
+ (in-sequences (drop lst (index-of lst 0)) (in-cycle lst)))
+
+(define (calculate-answer seq)
+ (for/sum ([id '(1000 2000 3000)]) (sequence-ref seq id)))
+
+;; part 1
+(~> gps-indexed (mix-gps _ gps-indexed) cycle-mixed-gps calculate-answer)
+
+;; part 2
+(define encrypted-gps-indexed
+ (for/list ([pt (in-list gps-indexed)] #:do [(match-define (cons i v) pt)])
+ (cons i (* 811589153 v))))
+
+(~>> encrypted-gps-indexed
+ ((λ (data) (foldr (λ (_ pts) (mix-gps pts data)) data (range 10))))
+ cycle-mixed-gps
+ calculate-answer)