-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday14.clj
67 lines (48 loc) · 1.52 KB
/
day14.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
(ns day14
(:require aoc
[clojure.string :as str]))
(defn transpose [platform]
(apply map str platform))
(defn move-line [dir line]
(->> (str/split line #"#" -1)
(map (comp str/join
(case dir
:left reverse
:right identity)
sort))
(str/join "#")))
(defn move-east [platform]
(vec (pmap #(move-line :right %) platform)))
(defn move-west [platform]
(vec (pmap #(move-line :left %) platform)))
(defn move-north [platform]
(-> platform transpose move-west transpose))
(defn move-south [platform]
(-> platform transpose move-east transpose))
(defn spin-cycle [platform]
(-> platform move-north move-west move-south move-east))
(defn calc-score [platform]
(let [platform (vec platform)
size (count platform)]
(aoc/sum-map
(fn [n] (* (- size n)
(aoc/count-if #{\O} (platform n))))
(range size))))
(defn remaining-shakes [platform prev curr]
(let [remain (- 1000000000 prev)
to-spin (mod remain (- curr prev))]
(nth (iterate spin-cycle platform) to-spin)))
(defn shake [platform]
(reduce
(fn [[seen platform] n]
(if-let [prev (seen platform)]
(reduced (remaining-shakes platform prev n))
[(assoc seen platform n)
(spin-cycle platform)]))
[{} platform]
(range)))
(defn solve [input]
(let [platform (aoc/parse-input input)]
[(calc-score (move-north platform))
(calc-score (shake platform))]))
(solve (aoc/read-file 14))