diff --git a/2024/src/day04.clj b/2024/src/day04.clj index 55dc61d..fe6c472 100644 --- a/2024/src/day04.clj +++ b/2024/src/day04.clj @@ -1,77 +1,33 @@ (ns day04 - (:require [core :as c] - [input-manager :refer [get-input]] - [clojure.string :as str])) + (:require [input-manager :refer [get-input]])) -(do - (def input - (->> - (get-input 4) -; "MMMSXXMASM -; MSAMXMSMSA -; AMXSXMAAMM -; MSAMASMSMX -; XMASAMXAMM -; XXAMMXXAMA -; SMSMSASXSS -; SAXAMASAAA -; MAMMMXMMMM -; MXMXAXMASX" -; (str/split-lines) - )) - input) +(def input (get-input 4)) (defn get-char [row col] (get (get input row) col)) -(defn get-count [row col] - (->> [(for [offset (range 4)] - (get-char row (+ col offset))) ;right - (for [offset (range 4)] - (get-char row (- col offset))) ;left - (for [offset (range 4)] - (get-char (+ row offset) col)) ;down - (for [offset (range 4)] - (get-char (- row offset) col)) ;up - (for [offset (range 4)] - (get-char (- row offset) (- col offset))) - (for [offset (range 4)] - (get-char (- row offset) (+ col offset))) - (for [offset (range 4)] - (get-char (+ row offset) (- col offset))) - (for [offset (range 4)] - (get-char (+ row offset) (+ col offset)))] - (filter #(= % (seq "XMAS"))) - count)) - ;; part 1 (->> input (map (partial map-indexed vector)) (map-indexed vector) (reduce (fn [acc [row s]] (reduce (fn [acc2 [col _c]] - (+ acc2 (get-count row col))) + (+ acc2 (->> (for [offset (range 4)] + (map #(apply get-char %) + [[row (+ col offset)] + [row (- col offset)] + [(+ row offset) col] + [(- row offset) col] + [(- row offset) (- col offset)] + [(- row offset) (+ col offset)] + [(+ row offset) (- col offset)] + [(+ row offset) (+ col offset)]])) + (apply map vector) + (filter #(= % (seq "XMAS"))) + count))) acc s)) - 0) - ; - ) - -(defn get-count-2 [row col] - (if (= (get-char row col) \A) - (let [corners [[(dec row) (dec col)] - [(inc row) (dec col)] - [(dec row) (inc col)] - [(inc row) (inc col)]] - chars (mapv #(apply get-char %) corners)] - (if (and (= 2 - (count (filter #(= % \S) chars)) - (count (filter #(= % \M) chars))) - (not= (get chars 0) - (get chars 3))) - 1 - 0)) - 0)) + 0)) ;; part 2 (->> input @@ -80,7 +36,20 @@ (map-indexed vector) (reduce (fn [acc [row s]] (reduce (fn [acc2 [col _c]] - (+ acc2 (get-count-2 row col))) + (+ acc2 (if (= (get-char row col) \A) + (let [corners [[(dec row) (dec col)] + [(inc row) (dec col)] + [(dec row) (inc col)] + [(inc row) (inc col)]] + chars (mapv #(apply get-char %) corners)] + (if (and (= 2 + (count (filter #(= % \S) chars)) + (count (filter #(= % \M) chars))) + (not= (get chars 0) + (get chars 3))) + 1 + 0)) + 0))) acc s)) 0)