1
+ ^{:nextjournal.clerk/visibility {:code :hide }}
1
2
(ns y2024.d12
2
3
(:require
3
4
[advent-of-code-clj.input :as input]
@@ -27,6 +28,7 @@ MIIISIJEEE
27
28
MMMISSJEEE" )
28
29
29
30
; Som matrise:
31
+ (def test-matrix (utils/text->matrix test-input))
30
32
31
33
(clerk/md
32
34
(with-out-str
@@ -57,6 +59,7 @@ MMMISSJEEE")
57
59
; Å finne en region er gjort ved å kjøre et bredde-først søk fra
58
60
; en gitt node, og lete etter alle noder som er av samme type (bokstav)
59
61
62
+ ^{:nextjournal.clerk/visibility {:result :hide }}
60
63
(defn find-region [coord-map node]
61
64
(into [] cat
62
65
(utils/breadth-search
@@ -66,10 +69,18 @@ MMMISSJEEE")
66
69
node))
67
70
node)))
68
71
72
+ ; *OBS:* Noder med samme bokstav er ikke nødvendigvis i samme region.
73
+ ; Se C'en som ligger for seg selv, den er en egen region:
74
+ (m/emap (fn [sym]
75
+ (if (= \C sym)
76
+ \C \.))
77
+ test-matrix)
78
+
69
79
; Å finne alle regioner gjøres ved å undersøke alle noder i matrisen,
70
80
; finne hele regionen noden tilhører. Vi unngår å finne samme region
71
81
; igjen ved å lagre alle oppdagede noder i et sett (visited)
72
82
83
+ ^{:nextjournal.clerk/visibility {:result :hide }}
73
84
(defn find-regions [coord-map]
74
85
(loop [visited #{}
75
86
regions []
@@ -88,25 +99,29 @@ MMMISSJEEE")
88
99
; som også er omkretsen. En firkantet region med 4 noder har
89
100
; omkrets lik 8, fordi hver node har to åpne sider.
90
101
102
+ ^{:nextjournal.clerk/visibility {:result :hide }}
91
103
(defn open-sides [node-set node]
92
104
(->> node
93
105
(apply utils/adjacent-hv)
94
106
(remove node-set)
95
107
count))
96
108
109
+ ^{:nextjournal.clerk/visibility {:result :hide }}
97
110
(defn circumference [nodes]
98
111
(let [node-set (set nodes)]
99
112
(transduce (map #(open-sides node-set %))
100
113
+ nodes)))
101
114
102
115
; "Prisen" i en region er areal multiplisert med omkrets:
103
116
117
+ ^{:nextjournal.clerk/visibility {:result :hide }}
104
118
(defn region-price [nodes]
105
119
(let [area (count nodes)]
106
120
(* area (circumference nodes))))
107
121
108
122
; Og løsningen på del 1 er summen av prisen i alle regioner:
109
123
124
+ ^{:nextjournal.clerk/visibility {:result :hide }}
110
125
(defn part-1 [input]
111
126
(let [coord-map (utils/coord-map-fixed (utils/text->matrix input))
112
127
regions (find-regions coord-map)]
0 commit comments