From bd674ed7123aae53d46376be08e18831f9efbc56 Mon Sep 17 00:00:00 2001
From: Clyne Sullivan <clyne@bitgloo.com>
Date: Tue, 14 Dec 2021 16:25:46 -0500
Subject: day14: very rough part2

---
 day14/part2.clj | 58 ++++++++++++++++++++++++++++++++++-----------------------
 1 file changed, 35 insertions(+), 23 deletions(-)

(limited to 'day14/part2.clj')

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))))
+
-- 
cgit v1.2.3