+16
resources/07-test.txt
+16
resources/07-test.txt
···
1
+
.......S.......
2
+
...............
3
+
.......^.......
4
+
...............
5
+
......^.^......
6
+
...............
7
+
.....^.^.^.....
8
+
...............
9
+
....^.^...^....
10
+
...............
11
+
...^.^...^.^...
12
+
...............
13
+
..^...^.....^..
14
+
...............
15
+
.^.^.^.^.^...^.
16
+
...............
+40
src/aoc2025/day7.clj
+40
src/aoc2025/day7.clj
···
1
+
(ns aoc2025.day7
2
+
(:require [aoc2025.util :as util]
3
+
[clojure.set :as set]))
4
+
5
+
(defn parse-file [raw-lines]
6
+
(let [[first-row & rest-rows] (mapv util/minv raw-lines)]
7
+
{:start [(some #(if (-> % second (= \S)) (first %) nil) first-row)]
8
+
:splitters (->> rest-rows
9
+
(remove (comp #(= % #{\.}) set #(map second %)))
10
+
(map (partial remove #(-> % second (= \.))))
11
+
(map #(map first %)))}))
12
+
13
+
(defn- split-beams [beams splitters]
14
+
(->> (mapcat #(if ((set splitters) %) ((juxt dec inc) %) [%]) beams)
15
+
set
16
+
vec
17
+
sort))
18
+
19
+
(defn- unsplit-beams [in-beams out-beams]
20
+
((comp sort vec) (set/intersection (set in-beams) (set out-beams))))
21
+
22
+
23
+
; [7] [7] => [6 8]
24
+
; [6 8] [6 8] => [5 7 7 9] => [5 7 9]
25
+
26
+
(let [grid (->> "07.txt"
27
+
util/read-file
28
+
parse-file)
29
+
;; [first-row & rest-rows] grid
30
+
;; starting-point (get-start first-row)
31
+
;; splitter-indexes (map (partial keep-indexed #(if (= %2 \^) [%1 %2] nil)) rest-rows)
32
+
[_ & beam-splits :as all-beams] (reductions split-beams (:start grid) (:splitters grid))
33
+
34
+
]
35
+
36
+
(->> (map (fn [in-beams splitters]
37
+
(count (set/intersection (set in-beams) (set splitters))))
38
+
(-> all-beams drop-last)
39
+
(:splitters grid))
40
+
(reduce +)))