-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday18.clj
41 lines (34 loc) · 1.14 KB
/
day18.clj
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
(ns day18
(:require aoc
[clojure.set :as set]))
(defn find-extremes [cubes]
(let [lower (reduce min (map #(reduce min %) cubes))
upper (reduce max (map #(reduce max %) cubes))]
[(dec lower) (inc upper)]))
(defn space-around [cubes]
(let [[lower upper] (find-extremes cubes)]
(loop [seen cubes
queue (list (repeat 3 lower))]
(if-let [hd (first queue)]
(let [valid (->> hd
aoc/neighbours-3d
(filter (fn [nb]
(and (not (seen nb))
(every? #(<= lower % upper) nb)))))]
(recur (into seen valid)
(into (rest queue) valid)))
(set/difference seen cubes)))))
(defn parse-input [filename]
(->> filename
aoc/parse-input
(map aoc/integers)
set))
(defn solve
([] (solve (aoc/read-file 18)))
([input]
(let [cubes (parse-input input)
neighbours (mapcat aoc/neighbours-3d cubes)
outside (space-around cubes)]
[(count (remove cubes neighbours))
(aoc/count-if outside neighbours)])))
(solve)