From 8d43e37df99f280377bed90284d6ac2428334804 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Wed, 30 Nov 2022 19:55:31 -0500 Subject: move 2021 days to folder; update README --- day24/partboth.clj | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 day24/partboth.clj (limited to 'day24/partboth.clj') diff --git a/day24/partboth.clj b/day24/partboth.clj deleted file mode 100644 index 9548ec3..0000000 --- a/day24/partboth.clj +++ /dev/null @@ -1,41 +0,0 @@ -(require '[clojure.string :as str]) - -; The given program operates on a base-26 stack, either pushing or -; (conditionally) popping values. This code extracts those operations -; from the input, then works through them to determine the highest -; and lowest values that produce an output of zero. -; See the .md file in this directory for more info. - -(def program (->> (slurp "./in") - str/split-lines - (map #(str/split % #"\s+")) - (partition 18) - (map (fn [step] - (if (= "1" (last (nth step 4))) - [:push (read-string (last (nth step 15)))] - [:pop (read-string (last (nth step 5)))]) - )))) - -(defn program-index [prog] (- 14 (count prog))) - -(loop [numbers (vec (repeat 2 (vec (repeat 14 0)))) - stack '() - prog program] - (if-let [step (first prog)] - (if (= :push (first step)) - (recur numbers - (conj stack [(program-index prog) (second step)]) - (rest prog)) - (let [i2 (program-index prog) - [i1 v] (first stack) - diff (+ v (second step))] - (recur - [(if (neg? diff) - (-> (first numbers) (assoc i1 9) (assoc i2 (+ 9 diff))) - (-> (first numbers) (assoc i2 9) (assoc i1 (- 9 diff)))) - (if (neg? diff) - (-> (second numbers) (assoc i2 1) (assoc i1 (- 1 diff))) - (-> (second numbers) (assoc i1 1) (assoc i2 (+ 1 diff))))] - (rest stack) (rest prog)))) - (println (map str/join numbers)))) - -- cgit v1.2.3