diff --git a/src/aoc2024/day19.clj b/src/aoc2024/day19.clj index 85c3710..2b0ff87 100644 --- a/src/aoc2024/day19.clj +++ b/src/aoc2024/day19.clj @@ -1,10 +1,62 @@ (ns aoc2024.day19 (:require [clojure.string :as str])) +(def example-input "r, wr, b, g, bwu, rb, gb, br + +brwrr +bggr +gbbr +rrbgbr +ubwu +bwurrg +brgr +bbrgwb") + (defn parse-input [input] - (->> (re-seq #"-?\d+" input) - (mapv parse-long))) + (let [[a b] (str/split input #"\R\R")] + [(str/split a #", ") + (str/split-lines b)])) + +(def ex (parse-input example-input)) + +(defn possible? [patterns design] + (loop [q (list design)] + (if (empty? q) + false + (let [d (peek q)] + (if (empty? d) + true + (recur (into (pop q) (for [p patterns + :when (str/starts-with? d p)] + (.substring d (count p)))))))))) + +(defn arrangements' [patterns design] + (loop [cnt 0, q (vector design)] + (if (empty? q) + cnt + (let [d (peek q)] + (if (empty? d) + (recur (inc cnt) (pop q)) + (recur cnt (into (pop q) (for [p patterns + :when (str/starts-with? d p)] + (.substring d (count p)))))))))) + +(def arrangements + (memoize (fn [patterns design] + (let [good (keep (fn [p] (when (str/starts-with? design p) + (.substring design (count p)))) + patterns)] + (+ (count (filter empty? good)) + (* (count (filter #(seq %) good)) + (count (map (partial arrangements patterns) + (filter #(seq %) good))))))))) + +(defn solve-part1 [[patterns designs]] + (count (filter (partial possible? patterns) designs))) -(defn solve-part1 [input]) +(defn solve-part2 [[patterns designs]] + (apply + + (for [d designs + :when (possible? patterns d)] + (arrangements patterns d)))) -(defn solve-part2 [input]) diff --git a/test/aoc2024/day19_test.clj b/test/aoc2024/day19_test.clj index ba218f6..2230c27 100644 --- a/test/aoc2024/day19_test.clj +++ b/test/aoc2024/day19_test.clj @@ -3,14 +3,23 @@ [aoc2024.day19 :refer [parse-input solve-part1 solve-part2]] [clojure.java.io :as io])) -(def example-input "") +(def example-input "r, wr, b, g, bwu, rb, gb, br + +brwrr +bggr +gbbr +rrbgbr +ubwu +bwurrg +brgr +bbrgwb") (deftest works (testing "with example input" - (is (nil? (solve-part1 (parse-input example-input)))) - (is (nil? (solve-part2 (parse-input example-input))))) + (is (= 6 (solve-part1 (parse-input example-input)))) + (is (= 16 (solve-part2 (parse-input example-input))))) (testing "with real input" (let [input (parse-input (slurp (io/resource "day19.txt")))] - (is (nil? (solve-part1 input))) + (is (= 315 (solve-part1 input))) (is (nil? (solve-part2 input))))))