aboutsummaryrefslogtreecommitdiffstats
path: root/day14
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2021-12-14 16:25:46 -0500
committerClyne Sullivan <clyne@bitgloo.com>2021-12-14 16:25:46 -0500
commitbd674ed7123aae53d46376be08e18831f9efbc56 (patch)
treebe816247b7ff8310b9d7a3ea6397a8b70b57ff7c /day14
parent3c7c3e5e7f54262c2f5496a87f2f441879b9fb48 (diff)
day14: very rough part2
Diffstat (limited to 'day14')
-rw-r--r--day14/part2.clj58
1 files changed, 35 insertions, 23 deletions
diff --git a/day14/part2.clj b/day14/part2.clj
index 4e283ee..813b816 100644
--- a/day14/part2.clj
+++ b/day14/part2.clj
@@ -1,7 +1,6 @@
(require '[clojure.string :as str])
-(require '[clojure.core.reducers :as r])
-(def input (->> (slurp "./in")
+(def input (->> (slurp "./in2")
str/split-lines
((juxt
first
@@ -13,28 +12,41 @@
(apply (partial assoc {}))
))))))
-(defn handle-pair [pair steps]
- (if (= 0 steps)
- (frequencies (rest pair))
- (let [ins ((second input) pair)
- p1 (handle-pair (str/join [(first pair) ins]) (dec steps))
- p2 (handle-pair (str/join [ins (second pair)]) (dec steps))]
- (reduce
- (fn [r p] (update r (key p) #(if (nil? %) (val p) (+ (val p) %))))
- p1 p2)
- )))
-
-(println
+(def blank-map
(reduce
- (fn [tot pair]
- (let [freqs (handle-pair pair 23)]
- (println "Finished pair " pair)
- (reduce
- (fn [r p] (update r (key p) #(if (nil? %) (val p) (+ (val p) %))))
- tot
- freqs)))
+ #(assoc %1 %2 0)
{}
- (for [i (range 0 (dec (count (first input))))]
- (subs (first input) i (+ i 2)))
+ (keys (second input))))
+
+(defn grow-polymer [polymer insertion-rules]
+ (reduce
+ (fn [res pair]
+ (let [pk (key pair)
+ p1 (str/join [(first pk) (insertion-rules pk)])
+ p2 (str/join [(insertion-rules pk) (second pk)])]
+ (-> res (update p1 + (val pair)) (update p2 + (val pair)))
+ ))
+ blank-map
+ (filter #(pos? (val %)) polymer)
))
+(def growth-seq
+ (iterate
+ #(grow-polymer % (second input))
+ (reduce
+ #(update %1 %2 inc)
+ blank-map
+ (for [i (range 0 (dec (count (first input))))]
+ (subs (first input) i (+ i 2))))))
+
+(let [results
+ (map #(Math/ceil (/ % 2))
+ (vals
+ (reduce
+ (fn [r p] (-> r
+ (update (first (key p)) #(if (nil? %) (val p) (+ % (val p))))
+ (update (second (key p)) #(if (nil? %) (val p) (+ % (val p))))))
+ {}
+ (nth growth-seq 40))))]
+ (println (- (apply max results) (apply min results))))
+