aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2021-12-25 13:25:28 -0500
committerClyne Sullivan <clyne@bitgloo.com>2021-12-25 13:25:28 -0500
commit6d3da47455a0283cabe72f488368782dc138f5ee (patch)
treec0c3be5c62fda0187bd7339d70f00413622a2f92
parent0ed8af18c6e551789fc835cf4a77bd995ffbfca3 (diff)
add day 25
-rw-r--r--day25/part1.clj40
1 files changed, 40 insertions, 0 deletions
diff --git a/day25/part1.clj b/day25/part1.clj
new file mode 100644
index 0000000..df2947c
--- /dev/null
+++ b/day25/part1.clj
@@ -0,0 +1,40 @@
+(require '[clojure.string :as str])
+
+(defn cucumber-step-east [cuc-map]
+ (for [cuc-row cuc-map]
+ (let [shifted-cuc (str/replace cuc-row #">\." ".>")]
+ (if (and (= \> (last cuc-row)) (= \. (first cuc-row)))
+ (-> shifted-cuc
+ (str/replace #">$" ".")
+ (str/replace #"^\." ">"))
+ shifted-cuc))))
+
+(defn cucumber-step-south [cuc-map]
+ (let [extra-cuc-map
+ (conj (vec (cons (last cuc-map) cuc-map)) (first cuc-map))
+ new-extra-cuc-map
+ (for [y (reverse (range 1 (count extra-cuc-map)))]
+ (str/join
+ (for [x (range 0 (count (first cuc-map)))]
+ (cond
+ (and (= \. (get-in extra-cuc-map [y x])) (= \v (get-in extra-cuc-map [(dec y) x])))
+ \v
+ (and (= \v (get-in extra-cuc-map [y x])) (= \. (get-in extra-cuc-map [(inc y) x])))
+ \.
+ :else
+ (get-in extra-cuc-map [y x])))))]
+ (into [] (reverse (rest new-extra-cuc-map)))))
+
+(defn cucumber-seq [cuc-map-init]
+ (iterate (comp cucumber-step-south cucumber-step-east) cuc-map-init))
+
+(def input (->> (slurp "./in")
+ (str/split-lines)
+ (vec)))
+
+(loop [cuc-hist '() cuc-list (cucumber-seq input)]
+ (let [next-cuc (first cuc-list)]
+ (if (or (nil? next-cuc) (= (first cuc-hist) next-cuc))
+ (println "Cucs are stuck! Steps:" (count cuc-hist))
+ (recur (conj cuc-hist next-cuc) (rest cuc-list)))))
+