Commit 2024.clj and 2025.clj
This commit is contained in:
commit
79d521ffba
290
2024.clj
Normal file
290
2024.clj
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
(ns aoc2024
|
||||||
|
(:require [clojure.string :as str]))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(clojure.core/refer-clojure)
|
||||||
|
,)
|
||||||
|
|
||||||
|
(defn get-input [day] (slurp (str "input-files/day" day "-input.txt")))
|
||||||
|
|
||||||
|
(defn remove-at [i coll]
|
||||||
|
(concat (take i coll) (drop (inc i) coll)))
|
||||||
|
|
||||||
|
;; _____ __
|
||||||
|
;; | __ \ /_ |
|
||||||
|
;; | | | | __ _ _ _ | |
|
||||||
|
;; | | | |/ _` | | | | | |
|
||||||
|
;; | |__| | (_| | |_| | | |
|
||||||
|
;; |_____/ \__,_|\__, | |_|
|
||||||
|
;; __/ |
|
||||||
|
;; |___/
|
||||||
|
|
||||||
|
(def day1-input-test
|
||||||
|
"3 4
|
||||||
|
4 3
|
||||||
|
2 5
|
||||||
|
1 3
|
||||||
|
3 9
|
||||||
|
3 3")
|
||||||
|
|
||||||
|
(defn day1-parse-input [input]
|
||||||
|
(->> input
|
||||||
|
str/split-lines
|
||||||
|
(map #(str/split % #"\s+"))
|
||||||
|
(map (fn [pair] (map read-string pair)))
|
||||||
|
(apply map list)))
|
||||||
|
|
||||||
|
(defn day1-p1 [input]
|
||||||
|
(->> (day1-parse-input input)
|
||||||
|
(map sort)
|
||||||
|
(apply map (comp abs -))
|
||||||
|
(reduce +)))
|
||||||
|
|
||||||
|
(defn day1-p2 [input]
|
||||||
|
(let [[coll1 coll2] (day1-parse-input input)
|
||||||
|
freq-coll2 (frequencies coll2)]
|
||||||
|
(reduce (fn [acc n] (+ acc (* n (get freq-coll2 n 0))))
|
||||||
|
0 coll1)))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(day1-p1 day1-input-test) ;; => 11
|
||||||
|
(day1-p1 (get-input 1)) ;; => 2057374
|
||||||
|
(day1-p2 day1-input-test) ;; => 31
|
||||||
|
(day1-p2 (get-input 1)) ;; => 23177084
|
||||||
|
,)
|
||||||
|
|
||||||
|
;; _____ ___
|
||||||
|
;; | __ \ |__ \
|
||||||
|
;; | | | | __ _ _ _ ) |
|
||||||
|
;; | | | |/ _` | | | | / /
|
||||||
|
;; | |__| | (_| | |_| | / /_
|
||||||
|
;; |_____/ \__,_|\__, | |____|
|
||||||
|
;; __/ |
|
||||||
|
;; |___/
|
||||||
|
|
||||||
|
(def day2-input-test
|
||||||
|
"7 6 4 2 1
|
||||||
|
1 2 7 8 9
|
||||||
|
9 7 6 2 1
|
||||||
|
1 3 2 4 5
|
||||||
|
8 6 4 4 1
|
||||||
|
1 3 6 7 9")
|
||||||
|
|
||||||
|
(defn day2-parse-input [input]
|
||||||
|
(->> input
|
||||||
|
str/split-lines
|
||||||
|
(map #(str/split % #"\s+"))
|
||||||
|
(map #(map Integer/parseInt %))))
|
||||||
|
|
||||||
|
(defn day2-safe-p [coll]
|
||||||
|
(and (or (every? neg? coll)
|
||||||
|
(every? pos? coll))
|
||||||
|
(every? #(<= 1 (abs %) 3) coll)))
|
||||||
|
|
||||||
|
(defn day2-p1 [input]
|
||||||
|
(->> input
|
||||||
|
(map #(map - % (rest %)))
|
||||||
|
(filter day2-safe-p)
|
||||||
|
count))
|
||||||
|
|
||||||
|
(defn day2-find-safe [coll]
|
||||||
|
(loop [i 0]
|
||||||
|
(cond
|
||||||
|
(>= i (count coll)) false
|
||||||
|
(let [coll (remove-at i coll)]
|
||||||
|
(day2-safe-p (map - coll (rest coll)))) true
|
||||||
|
:else (recur (inc i)))))
|
||||||
|
|
||||||
|
(defn day2-p2 [input]
|
||||||
|
(->> input
|
||||||
|
(filter day2-find-safe)
|
||||||
|
count))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(day2-parse-input day2-input-test)
|
||||||
|
(day2-safe-p '(1 2 2 4))
|
||||||
|
(day2-find-safe [1 2 2 5 10])
|
||||||
|
(day2-p1 (day2-parse-input day2-input-test)) ;; => 2
|
||||||
|
(day2-p1 (day2-parse-input (get-input 2))) ;; => 591
|
||||||
|
(day2-p2 (day2-parse-input day2-input-test)) ;; => 4
|
||||||
|
(day2-p2 (day2-parse-input (get-input 2))) ;; => 621
|
||||||
|
,)
|
||||||
|
|
||||||
|
;; _____ ____
|
||||||
|
;; | __ \ |___ \
|
||||||
|
;; | | | | __ _ _ _ __) |
|
||||||
|
;; | | | |/ _` | | | | |__ <
|
||||||
|
;; | |__| | (_| | |_| | ___) |
|
||||||
|
;; |_____/ \__,_|\__, | |____/
|
||||||
|
;; __/ |
|
||||||
|
;; |___/
|
||||||
|
|
||||||
|
(def day3-input-test-p1 "xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))")
|
||||||
|
(def day3-input-test-p2 "xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))")
|
||||||
|
|
||||||
|
(defn day3-p1 [input]
|
||||||
|
(->> input
|
||||||
|
(re-seq #"mul\(\d+,\d+\)")
|
||||||
|
(map #(re-seq #"\d+" %))
|
||||||
|
(map #(map Integer/parseInt %))
|
||||||
|
(map #(reduce * %))
|
||||||
|
(reduce +)))
|
||||||
|
|
||||||
|
(defn day3-p2 [input]
|
||||||
|
(->> input
|
||||||
|
(#(str/replace % "\n" ""))
|
||||||
|
(#(str/replace % #"don't\(\).*?(?:do\(\)|$)" ""))
|
||||||
|
(re-seq #"mul\(\d{1,3},\d{1,3}\)")
|
||||||
|
(map #(re-seq #"\d+" %))
|
||||||
|
(map #(map Integer/parseInt %))
|
||||||
|
(map #(reduce * %))
|
||||||
|
(reduce +)))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(re-seq #"mul\(\d{1,3},\d{1,3}\)" day3-input-test-p1)
|
||||||
|
(day3-p1 day3-input-test-p1) ;; => 161
|
||||||
|
(day3-p1 (get-input 3)) ;; => 166905464
|
||||||
|
(day3-p2 day3-input-test-p2) ;; => 48
|
||||||
|
(day3-p2 (get-input 3)) ;; => 72948684
|
||||||
|
,)
|
||||||
|
|
||||||
|
|
||||||
|
;; _____ _ _
|
||||||
|
;; | __ \ | || |
|
||||||
|
;; | | | | __ _ _ _ | || |_
|
||||||
|
;; | | | |/ _` | | | | |__ _|
|
||||||
|
;; | |__| | (_| | |_| | | |
|
||||||
|
;; |_____/ \__,_|\__, | |_|
|
||||||
|
;; __/ |
|
||||||
|
;; |___/
|
||||||
|
|
||||||
|
(def day4-input-test
|
||||||
|
"MMMSXXMASM
|
||||||
|
MSAMXMSMSA
|
||||||
|
AMXSXMAAMM
|
||||||
|
MSAMASMSMX
|
||||||
|
XMASAMXAMM
|
||||||
|
XXAMMXXAMA
|
||||||
|
SMSMSASXSS
|
||||||
|
SAXAMASAAA
|
||||||
|
MAMMMXMMMM
|
||||||
|
MXMXAXMASX")
|
||||||
|
|
||||||
|
(defn day4-parse-input [input]
|
||||||
|
(->> input
|
||||||
|
(str/split-lines)
|
||||||
|
(map vec)
|
||||||
|
vec))
|
||||||
|
|
||||||
|
(def day4-directions {:N [-1 0] :S [1 0] :W [0 -1] :E [0 1]
|
||||||
|
:NW [-1 -1] :NE [-1 1] :SW [1 -1] :SE [1 1]})
|
||||||
|
|
||||||
|
(defn day4-map-xmax [mat [dy dx] row col]
|
||||||
|
(for [i (range 4) ;; count of XMAS
|
||||||
|
:let [r (+ row (* i dy))
|
||||||
|
c (+ col (* i dx))]]
|
||||||
|
(get-in mat [r c])))
|
||||||
|
|
||||||
|
(defn day4-map-x-max [mat row col]
|
||||||
|
(for [[dy dx] (map day4-directions [:NW :NE :SW :SE])]
|
||||||
|
(get-in mat [(+ row dy) (+ col dx)])))
|
||||||
|
|
||||||
|
(defn day4-p1 [mat]
|
||||||
|
(->> (for [row (range (count mat))
|
||||||
|
col (range (count (first mat)))
|
||||||
|
:when (= (get-in mat [row col]) \X)
|
||||||
|
dir (vals day4-directions)]
|
||||||
|
(day4-map-xmax mat dir row col))
|
||||||
|
(filter #(= % '(\X \M \A \S)))
|
||||||
|
count))
|
||||||
|
|
||||||
|
(defn day4-p2 [mat]
|
||||||
|
(->> (for [row (range (count mat))
|
||||||
|
col (range (count (first mat)))
|
||||||
|
:when (= (get-in mat [row col]) \A)]
|
||||||
|
(day4-map-x-max mat row col))
|
||||||
|
(filter #{[\M \M \S \S] [\M \S \M \S] [\S \S \M \M] [\S \M \M \S]})
|
||||||
|
count))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(get-in (day4-parse-input day4-input-test) [0 3])
|
||||||
|
|
||||||
|
(day4-map-xmax (day4-parse-input day4-input-test) (:E day4-directions) 0 0)
|
||||||
|
(day4-map-x-max (day4-parse-input day4-input-test) 1 2)
|
||||||
|
|
||||||
|
(day4-p1 (day4-parse-input day4-input-test)) ;; => 18
|
||||||
|
(day4-p1 (day4-parse-input (get-input 4))) ;; => 2654
|
||||||
|
(day4-p2 (day4-parse-input day4-input-test)) ;; => 9
|
||||||
|
(day4-p2 (day4-parse-input (get-input 4))) ;; => 1990
|
||||||
|
|
||||||
|
,)
|
||||||
|
|
||||||
|
|
||||||
|
;; _____ _____
|
||||||
|
;; | __ \ | ____|
|
||||||
|
;; | | | | __ _ _ _ | |__
|
||||||
|
;; | | | |/ _` | | | | |___ \
|
||||||
|
;; | |__| | (_| | |_| | ___) |
|
||||||
|
;; |_____/ \__,_|\__, | |____/
|
||||||
|
;; __/ |
|
||||||
|
;; |___/
|
||||||
|
|
||||||
|
|
||||||
|
(def day5-input-test
|
||||||
|
"47|53
|
||||||
|
97|13
|
||||||
|
97|61
|
||||||
|
97|47
|
||||||
|
75|29
|
||||||
|
61|13
|
||||||
|
75|53
|
||||||
|
29|13
|
||||||
|
97|29
|
||||||
|
53|29
|
||||||
|
61|53
|
||||||
|
97|53
|
||||||
|
61|29
|
||||||
|
47|13
|
||||||
|
75|47
|
||||||
|
97|75
|
||||||
|
47|61
|
||||||
|
75|61
|
||||||
|
47|29
|
||||||
|
75|13
|
||||||
|
53|13
|
||||||
|
|
||||||
|
75,47,61,53,29
|
||||||
|
97,61,53,29,13
|
||||||
|
75,29,13
|
||||||
|
75,97,47,61,53
|
||||||
|
61,13,29
|
||||||
|
97,13,75,29,47")
|
||||||
|
|
||||||
|
(defn day5-parse-input [text]
|
||||||
|
(let [[pages rules] (str/split text #"\n\n")]
|
||||||
|
[(->> pages
|
||||||
|
str/split-lines
|
||||||
|
(map #(str/split % #"\|"))
|
||||||
|
(map #(mapv Integer/parseInt %)))
|
||||||
|
(->> rules
|
||||||
|
str/split-lines
|
||||||
|
(map #(str/split % #","))
|
||||||
|
(map #(mapv Integer/parseInt %)))]))
|
||||||
|
|
||||||
|
(defn ordering-rules [pages]
|
||||||
|
(->> pages
|
||||||
|
(group-by first)
|
||||||
|
(map (fn [[k vs]] [k (map second vs)]))
|
||||||
|
(into {})))
|
||||||
|
|
||||||
|
(defn day5-p1 [pages rules]
|
||||||
|
'())
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(get (ordering-rules (first (day5-parse-input day5-input-test))) 47)
|
||||||
|
(second (day5-parse-input day5-input-test))
|
||||||
|
(apply day5-p1 (day5-parse-input day5-input-test))
|
||||||
|
|
||||||
|
|
||||||
|
,)
|
||||||
|
|
||||||
57
2025.clj
Normal file
57
2025.clj
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
(ns aoc2025
|
||||||
|
(:require [clojure.string :as str]))
|
||||||
|
|
||||||
|
(defn get-input [day] (slurp (str "2025/day" day "-input.txt")))
|
||||||
|
|
||||||
|
(def day1-input-test
|
||||||
|
"L68
|
||||||
|
L30
|
||||||
|
R48
|
||||||
|
L5
|
||||||
|
R60
|
||||||
|
L55
|
||||||
|
L1
|
||||||
|
L99
|
||||||
|
R14
|
||||||
|
L82")
|
||||||
|
|
||||||
|
(defn day1-get-sequence [input]
|
||||||
|
(map (fn [line]
|
||||||
|
[(if (= "R" (str (first line)))
|
||||||
|
#'+
|
||||||
|
#'-)
|
||||||
|
(Integer/parseInt (str/join (rest line)))])
|
||||||
|
(str/split-lines input)))
|
||||||
|
|
||||||
|
(defn day1-p1 [input]
|
||||||
|
(let [sequence (day1-get-sequence input)]
|
||||||
|
(loop [s sequence
|
||||||
|
curr 50
|
||||||
|
zero-count 0]
|
||||||
|
(if (not (seq s))
|
||||||
|
zero-count
|
||||||
|
(let [[f amount] (first s)
|
||||||
|
new-dial-pos (mod (f curr amount) 100)]
|
||||||
|
(recur (rest s) new-dial-pos (if (zero? new-dial-pos) (inc zero-count) zero-count)))))))
|
||||||
|
|
||||||
|
(defn day1-p2 [input]
|
||||||
|
(let [sequence (day1-get-sequence input)]
|
||||||
|
(loop [s sequence
|
||||||
|
curr 50
|
||||||
|
zero-count 0]
|
||||||
|
(if (not (seq s))
|
||||||
|
zero-count
|
||||||
|
(let [[f amount] (first s)
|
||||||
|
new-dial-pos (mod (f curr amount) 100)
|
||||||
|
spins (if (and (neg? (f amount))
|
||||||
|
(not (zero? curr)))
|
||||||
|
(quot (+ (- 100 curr) amount) 100)
|
||||||
|
(quot (+ curr amount) 100))]
|
||||||
|
(recur (rest s) new-dial-pos (+ zero-count spins)))))))
|
||||||
|
|
||||||
|
(comment
|
||||||
|
(day1-p1 day1-input-test)
|
||||||
|
(day1-p1 (get-input 1))
|
||||||
|
(day1-p2 day1-input-test)
|
||||||
|
(day1-p2 (get-input 1))
|
||||||
|
:-)
|
||||||
Loading…
x
Reference in New Issue
Block a user