-
Notifications
You must be signed in to change notification settings - Fork 0
/
day-24.clj
80 lines (69 loc) · 2.16 KB
/
day-24.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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
(ns day-24
(:require [hashp.core]))
(def parse-int #(Long/parseLong %))
(defn parse [line]
(->> (re-seq #"se|sw|nw|ne|e|w" line)
(map keyword)))
(def delta {:e {:x +1 :y -1 :z 0}
:ne {:x +1 :y 0 :z -1}
:nw {:x 0 :y +1 :z -1}
:w {:x -1 :y +1 :z 0}
:sw {:x -1 :y 0 :z +1}
:se {:x 0 :y -1 :z +1}})
(defn traverse [lobby d]
(merge-with + lobby d))
(defn find-tile [directions]
(->> directions
(map delta)
(reduce traverse {:x 0 :y 0 :z 0})))
(defn puzzle1 [in]
(->> (clojure.string/split-lines in)
(map parse)
(map find-tile)
(frequencies)
(vals)
(map #(mod % 2))
(map {1 :black 0 :white})
(frequencies)
(:black)))
(defn neighbors [place sparse]
(for [d (vals delta)
:let [cube (traverse place d)
s (sparse cube)]
:when s]
s))
(defn transform [place new-sparse sparse]
(let [nx (neighbors place sparse)
active-neighbors (count nx)
was-active (contains? sparse place)]
(if (or (and was-active (#{1 2} active-neighbors))
(and (not was-active) (#{2} active-neighbors)))
(conj new-sparse place)
(disj new-sparse place))))
(defn evolve [sparse]
(let [[min-x max-x] (apply (juxt min max) (map :x sparse))
[min-y max-y] (apply (juxt min max) (map :y sparse))
[min-z max-z] (apply (juxt min max) (map :z sparse))
indices (for [x (range (dec min-x) (inc (inc max-x)))
y (range (dec min-y) (inc (inc max-y)))
z (range (dec min-z) (inc (inc max-z)))
:when (zero? (+ x y z))]
{:x x :y y :z z})
evolve' (fn [new-sparse place]
(transform place new-sparse sparse))]
(reduce evolve' sparse indices)))
(defn puzzle2 [in]
(->> (clojure.string/split-lines in)
(map parse)
(map find-tile)
(frequencies)
(filter (comp odd? val))
(keys)
(set)
(iterate evolve)
(drop 100)
(first)
(count)))
(def input (->> (slurp "input24.txt")))
(time (puzzle1 input))
(time (puzzle2 input))