advent-of-code/2024/src/day07.clj
2024-12-08 00:58:09 -05:00

45 lines
1.0 KiB
Clojure

(ns day07
(:require
[core :as c]
[input-manager :refer [get-input]]
[clojure.string :as str]))
(def input (->> (get-input 7)
(map #(str/split % #": "))
(c/mmap c/split-whitespace)
(c/mmmapv parse-long)
(map #(update % 0 first))
(into {})))
(defn valid-row? [target acc [v & vs]]
(if v
(or (valid-row? target (+ acc v) vs)
(valid-row? target (* acc v) vs))
(= target acc)))
;; part 1
(->> input
(pmap #(when (valid-row? (first %) 0 (second %))
%))
(filter identity)
(map first)
(reduce +))
(defn valid-row-2?
([target [v & vs]] (valid-row-2? target v vs))
([target acc [v & vs]]
(if v
(or (valid-row-2? target (+ acc v) vs)
(valid-row-2? target (* acc v) vs)
(valid-row-2? target (parse-long (str acc v)) vs))
(= target acc))))
;; part 2
(->> input
(pmap #(when (apply valid-row-2? %)
%))
(filter identity)
(map first)
(reduce +))