aboutsummaryrefslogtreecommitdiffstats
path: root/src/aoc_2022
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2022-12-04 10:10:57 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2022-12-04 10:10:57 +0200
commit07f4901c7cfc929ed7ee7e559e6735a11bc9c7e8 (patch)
treea329abd768b5baa8ec9c66e10d7f68e7c4c4b0b7 /src/aoc_2022
parent0dc6fea77d728fd582a895b905d5e4fa3872a3dd (diff)
Solve day03
Diffstat (limited to 'src/aoc_2022')
-rw-r--r--src/aoc_2022/day03.clj55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/aoc_2022/day03.clj b/src/aoc_2022/day03.clj
new file mode 100644
index 0000000..38ae011
--- /dev/null
+++ b/src/aoc_2022/day03.clj
@@ -0,0 +1,55 @@
+(ns aoc-2022.day03)
+(require '[clojure.java.io :as io])
+(require '[aoc-2022.utils :as utils])
+
+(defn compartments [sack]
+ (let [n (count sack)]
+ [(take (/ n 2) sack)
+ (drop (/ n 2) sack)]))
+
+(defn find-common [needles haystack]
+ (let [needle (first needles)
+ occurs (fn [hs] (filter #(= needle %) hs))]
+ (cond
+ (nil? needle) nil
+ (not (empty? (occurs haystack))) needle
+ :else (find-common (rest needles) haystack))))
+
+(defn priority-of [item]
+ (cond
+ (<= (int item) (int \Z)) (+ 27 (- (int item) (int \A)))
+ :else (+ 1 (- (int item) (int \a)))))
+
+(defn task1 [rows]
+ (->> rows
+ (map compartments)
+ (map (fn [[c1 c2]] (find-common c1 c2)))
+ (map priority-of)
+ (reduce +)
+ ))
+
+(defn find-common2 [needles hs1 hs2]
+ (let [needle (first needles)
+ occurs (fn [hs] (filter #(= needle %) hs))]
+ (cond
+ (nil? needle)
+ nil
+ (and
+ (not (empty? (occurs hs1)))
+ (not (empty? (occurs hs2))))
+ needle
+ :else
+ (find-common2 (rest needles) hs1 hs2))))
+
+(defn task2 [rows]
+ (->> rows
+ (partition 3)
+ (map (fn [[c1 c2 c3]] (find-common2 c1 c2 c3)))
+ (map priority-of)
+ (reduce +)))
+
+(with-open [rdr (io/reader "resources/day03_actual.txt")]
+ (let [rows (line-seq rdr)]
+ (do
+ (println "task1:" (task1 rows))
+ (println "task2:" (task2 rows)))))