aboutsummaryrefslogtreecommitdiff
path: root/2022
diff options
context:
space:
mode:
authorHunky Jimpjorps <thechairman@thechairman.info>2022-12-16 22:35:53 -0500
committerHunky Jimpjorps <thechairman@thechairman.info>2022-12-16 22:35:53 -0500
commit481deaca4a5429fa05131947c2caf29e0f4bef10 (patch)
treeba5ffa935413be48e5bed624736346ea64aff102 /2022
parent2b01d1682b805717a1fb50a67d62c47372f53c6f (diff)
downloadgleam_aoc-481deaca4a5429fa05131947c2caf29e0f4bef10.tar.gz
gleam_aoc-481deaca4a5429fa05131947c2caf29e0f4bef10.zip
day 16 part 1 done
Diffstat (limited to '2022')
-rw-r--r--2022/day-16/day-16.rkt68
1 files changed, 68 insertions, 0 deletions
diff --git a/2022/day-16/day-16.rkt b/2022/day-16/day-16.rkt
new file mode 100644
index 0000000..c7fe654
--- /dev/null
+++ b/2022/day-16/day-16.rkt
@@ -0,0 +1,68 @@
+#lang racket
+
+(require advent-of-code
+ fancy-app
+ graph
+ threading)
+
+(define (process-line str)
+ (match str
+ [(regexp #px"Valve (\\w\\w) has flow rate=(\\d+); tunnels? leads? to valves? (.+)"
+ (list _ name (app string->number rate) (app (string-split _ ", ") valves)))
+ (list name rate valves)]))
+
+(define cave-data
+ (~> (fetch-aoc-input (find-session) 2022 16 #:cache #true)
+ (string-split "\n")
+ (map process-line _)))
+
+(define cave-map
+ (for*/lists (tunnels #:result (directed-graph tunnels))
+ ([valve (in-list cave-data)] #:do [(match-define (list name _ valves) valve)]
+ [destination (in-list valves)])
+ (list name destination)))
+
+(define valve-flows
+ (for/hash ([valve (in-list cave-data)]
+ #:do [(match-define (list name flow _) valve)]
+ #:when (> flow 0))
+ (values name flow)))
+
+(define shortest-path-lengths (johnson cave-map))
+
+(define (reachable-destinations start dests minutes-left)
+ (for/list ([(dest _) (in-hash dests)]
+ #:do [(define travel-time
+ (hash-ref shortest-path-lengths (list start dest) minutes-left))]
+ #:when (<= 1 travel-time minutes-left))
+ (cons dest travel-time)))
+
+;; part 1
+(define (find-best-single-route start
+ [current-pressure 0]
+ [available-valves valve-flows]
+ [minutes-left 30])
+ (cond
+ [(>= minutes-left 1)
+ (for/fold ([running-pressure current-pressure])
+ ([candidate (reachable-destinations start available-valves minutes-left)])
+ (match-define (cons dest travel-time) candidate)
+ (define minutes-left* (- minutes-left (add1 travel-time)))
+ (define candidate-pressure
+ (find-best-single-route dest
+ (+ current-pressure (* (hash-ref valve-flows dest) minutes-left*))
+ (hash-remove available-valves dest)
+ minutes-left*))
+ (if (> candidate-pressure running-pressure) candidate-pressure running-pressure))]
+ [else current-pressure]))
+
+(find-best-single-route "AA")
+
+;; part 2
+(define (find-best-double-route start
+ [current-pressure 0]
+ [available-valves valve-flows]
+ [minutes-left 30])
+ 'todo)
+
+(find-best-double-route "AA")