advent-of-code/2023/src/day01.clj
2023-12-01 19:55:14 -05:00

40 lines
1.1 KiB
Clojure

(ns ^{:doc "Day 1: Trebuchet?!"
:author "Adam Jeniski"}
day01 (:require [core :refer [get-puzzle-input]]
[clojure.string :as string]))
(def lines (get-puzzle-input 1))
;; part 1
(->> lines
(map #(Integer/parseInt
(str (re-find #"\d" %)
(re-find #"\d" (string/reverse %)))))
(reduce +))
(def numeric-value-map
(->> ["one" "two" "three" "four" "five" "six" "seven" "eight" "nine"]
(map-indexed (fn [idx val] [val (inc idx)]))
(into {})))
(defn numeric-value [s]
(or (numeric-value-map s) s))
(defn generate-regex-pattern [mapping-fn]
(->> (keys numeric-value-map)
(map mapping-fn)
(#(conj % "\\d"))
(string/join "|")
re-pattern))
(def first-num-pattern (generate-regex-pattern identity))
(def last-num-pattern (generate-regex-pattern string/reverse))
;; part 2
(->> lines
(map #(Integer/parseInt
(str (numeric-value (re-find first-num-pattern %))
(numeric-value (string/reverse
(re-find last-num-pattern
(string/reverse %)))))))
(reduce +))