-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday-14.clj
43 lines (33 loc) · 1.16 KB
/
day-14.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
(ns day-14
(:require [clojure.string :as str]
[clojure.set :as set]))
(def input (-> "day-14.txt" slurp (str/split #"\n\n")))
(def init (first input))
(def rules (->> input second str/split-lines (map parse-rule) (into {})))
(defn parse-rule [rule]
(let [[lh rh] (str/split rule #" -> ")]
[(vec lh) (first rh)]))
(def vfreqs (frequencies init))
(def pfreqs
(let [pairs (partition 2 1 init)]
(into {} (map (fn [pair] [pair (count (filter #(= % pair) pairs))])
(keys rules)))))
(defn delta [pair freq]
(let [new (rules pair)
pair1 [(first pair) new]
pair2 [new (second pair)]
dvfreqs {new freq}
dpfreqs (merge-with + {pair (- freq)} {pair1 freq} {pair2 freq})]
[dpfreqs dvfreqs]))
(defn step [[pfreqs vfreqs]]
(reduce (fn [[pd vd] pair]
(let [[pd* vd*] (delta pair (pfreqs pair))
pd (merge-with + pd* pd)
vd (merge-with + vd* vd)]
[pd vd]))
[pfreqs vfreqs]
(keys rules)))
(defn code [[pfreqs vfreqs]]
(let [freqs (vals vfreqs)]
(- (apply max freqs) (apply min freqs))))
(code (iter step [pfreqs vfreqs] 40))