diff --git a/src/day7.clj b/src/day7.clj new file mode 100644 index 0000000..e00943b --- /dev/null +++ b/src/day7.clj @@ -0,0 +1,75 @@ +(ns day7 + (:require [clojure.string :as string] + [helpers :refer [get-input]])) + +(def example +"190: 10 19 +3267: 81 40 27 +83: 17 5 +156: 15 6 +7290: 6 8 6 15 +161011: 16 10 13 +192: 17 8 14 +21037: 9 7 18 13 +292: 11 6 16 20") + +(def input + (->> + ;example + (get-input 7) + string/split-lines)) + +(defn permutation->operator [p] + (concat + (map #(if (even? %) + *) p) + (map #(if (odd? %) + *) p))) + +(defn operators [n] + (let [add-operators + (fn [ops] + (vector (conj ops +) + (conj ops *)))] + (loop [i 1 ops [[+] [*]]] + (if (= n i) + ops + (recur (inc i) + (mapcat add-operators ops)))))) + +(defn test-calibration [ops-fn s] + (let [[tval ns] (string/split s #":") + tval (parse-long tval) + ns (vec (map parse-long + (-> ns string/trim (string/split #" ")))) + ops (-> ns count dec ops-fn) + check-fn + (fn [op-seq] + (reduce + (fn [r i] + ((get op-seq i) r (get ns (inc i)))) + (first ns) + (range (count op-seq))))] + (if (empty? + (filter (partial = tval) (map check-fn ops))) + 0 tval))) + +(println "Total calibration result:" + (reduce + (map (partial test-calibration operators) input))) + + +(defn || [a b] + (parse-long (str a b))) + +(defn operators2 [n] + (let [add-operators + (fn [ops] + (vector (conj ops +) + (conj ops *) + (conj ops ||)))] + (loop [i 1 ops [[+] [*] [||]]] + (if (= n i) + ops + (recur (inc i) + (mapcat add-operators ops)))))) + +(println "Total calibration result (part 2):" + (reduce + (map (partial test-calibration operators2) input)))