(ns aocclj.day05 (:require [clojure.string :as str])) (defn parse-instruction [line] (->> (re-seq #"\d+" line) (map parse-long) (apply (fn [move from to] [move (dec from) (dec to)])))) (defn parse-input [input] (let [[stacks instructions] (str/split input #"\n\n")] {:stacks (mapv (fn [col] (filter #(not= % \space) col)) (apply mapv vector (map (comp (partial map second) (partial partition-all 4)) (butlast (str/split-lines stacks))))) :instructions (map parse-instruction (str/split-lines instructions))})) (defn mover [f stacks [amount from to]] (let [stuff (f (take amount (get stacks from)))] (-> stacks (update to #(apply conj % stuff)) (update from (partial drop amount))))) (defn solver [single? input] (let [{:keys [stacks instructions]} (parse-input input)] (->> (reduce (partial mover (if single? identity reverse)) stacks instructions) (map first) (apply str))))