blob: aa32e438ccedfb082e3d09952ffa9d0385def89e (
plain)
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
|
#lang racket
(require advent-of-code
threading
graph)
(define input
(~> (fetch-aoc-input (find-session) 2023 25 #:cache #true)
(string-split "\n")
(map (curryr string-split ": ") _)))
(define all-wires
(for*/list ([wire-diagram (in-list input)] [devices (in-list (string-split (second wire-diagram)))])
(list (car wire-diagram) devices)))
;; instead of trying to solve the minimum cut problem, I generated the graph and
;; rendered it in graphviz:
; (define out (open-output-file "graphviz"))
; (~> all-wires
; unweighted-graph/undirected
; graphviz
; (display out))
; (close-output-port out)
;; the bottleneck is very obvious on the graph --
;; there's two large clusters of nodes, connected by just three edges
;;
;; from the graphviz output, the three critical wires are
;; cpq-hlx
;; hqp-spk
;; chr-zlx
(define remove-these-three '(("cpq" "hlx") ("hqp" "spk") ("chr" "zlx")))
(define cut-wires
(for/list ([wire (in-list all-wires)] #:unless (member (sort wire string<?) remove-these-three))
wire))
(~> cut-wires
unweighted-graph/undirected
scc
(map length _)
(apply * _))
|