Skip to content

Commit

Permalink
day03.clj
Browse files Browse the repository at this point in the history
  • Loading branch information
narimiran committed Dec 4, 2023
1 parent 71c5753 commit 2c308ca
Show file tree
Hide file tree
Showing 5 changed files with 228 additions and 2 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Task | Clojure |
Day 00: Helper file | [aoc.clj](clojure/aoc.clj) | Utilities I use to solve the tasks.
[Day 01](http://adventofcode.com/2023/day/1) | [day01.clj](clojure/day01.clj) | Tougher than expected for day 1.
[Day 02](http://adventofcode.com/2023/day/2) | [day02.clj](clojure/day02.clj) | Immediately calculate maximums.
<!-- [Day 03](http://adventofcode.com/2023/day/3) | [day03.clj](clojure/day03.clj) | -->
[Day 03](http://adventofcode.com/2023/day/3) | [day03.clj](clojure/day03.clj) | Tedious parsing.
<!-- [Day 04](http://adventofcode.com/2023/day/4) | [day04.clj](clojure/day04.clj) | -->
<!-- [Day 05](http://adventofcode.com/2023/day/5) | [day05.clj](clojure/day05.clj) | -->
<!-- [Day 06](http://adventofcode.com/2023/day/6) | [day06.clj](clojure/day06.clj) | -->
Expand Down
75 changes: 75 additions & 0 deletions clojure/day03.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
(ns day03
(:require aoc
[clojure.set :as set]))


(def digits (set (apply str (range 10))))

(defn symbol-coords [grid]
(set (keys (remove #(digits (val %)) grid))))


(defn adjacent-symbols [pt symbs]
(set/intersection symbs (set (aoc/neighbours pt 8))))


(defn gear-ratios [gear-values]
(keep
#(when (= (count %) 2)
(reduce * %))
gear-values))


(defn find-solution [lines symbs gears]
(let [h (count lines)
w (count (first lines))
zero-state {:pt [0 0]
:curr ""
:near-symbol? false
:numbers []
:current-gears #{}
:gear-values {}}]
(loop [{:keys [pt curr near-symbol? numbers current-gears gear-values]
:as state} zero-state]
(let [[x y] pt]
(cond
(= y h)
{:nums numbers
:gear-ratios (gear-ratios (vals gear-values))}

(or (= x w)
(= \. ((lines y) x))
(symbs pt))
(if (and near-symbol? (seq curr))
(let [number (parse-long curr)]
(recur (assoc zero-state
:pt (if (= x w) [0 (inc y)] [(inc x) y])
:numbers (conj numbers number)
:gear-values (reduce (fn [gvals gear]
(update gvals gear conj number))
gear-values
current-gears))))
(recur (assoc zero-state
:pt (if (= x w) [0 (inc y)] [(inc x) y])
:numbers numbers
:gear-values gear-values)))

:else
(recur (assoc state
:pt [(inc x) y]
:curr (str curr ((lines y) x))
:near-symbol? (or near-symbol? (seq (adjacent-symbols pt symbs)))
:current-gears (set/union current-gears (adjacent-symbols pt gears)))))))))


(defn solve [input-file]
(let [lines (aoc/read-input input-file :chars)
points (aoc/grid->points lines #(not= % \.))
symbs (symbol-coords points)
gears (set (filter #(= \* (points %)) symbs))
solution (find-solution lines symbs gears)]
[(reduce + (:nums solution))
(reduce + (:gear-ratios solution))]))


(solve 3)
3 changes: 2 additions & 1 deletion clojure/tests/solutions_tests.clj
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
(ns solutions-tests
(:require
day01 day02 ; day03 day04 day05
day01 day02 day03 ; day04 day05
; day06 day07 day08 day09 day10
; day11 day12 day13 day14 day15
; day16 day17 day18 day19 day20
Expand All @@ -26,6 +26,7 @@

(check-day 1 nil [56049 54530])
(check-day 2 [8 2286] [2239 83435])
(check-day 3 [4361 467835] [528799 84907174])


(let [summary (run-tests)]
Expand Down
Loading

0 comments on commit 2c308ca

Please sign in to comment.