-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday07.clj
50 lines (42 loc) · 1.28 KB
/
day07.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
(ns day07
(:require aoc
[clojure.string :as str]
[clojure.core.match :refer [match]]))
(defn add! [path size sizes]
(let [val (parse-long size)]
(loop [sizes sizes
path path]
(if (empty? path) sizes
(recur (assoc! sizes path (+ val (sizes path 0)))
(pop path))))))
(defn calc-sizes [commands]
(->> commands
(reduce (fn [[sizes path] cmd]
(match (str/split cmd #" ")
["$" "cd" ".."] [sizes (pop path)]
["$" "cd" f] [sizes (conj path f)]
(:or ["$" "ls"]
["dir" _]) [sizes path]
[size _] [(add! path size sizes) path]))
[(transient {}) '()])
first
persistent!))
(defn part-1 [sizes]
(->> sizes
(filter #(<= % 100000))
(reduce +)))
(defn part-2 [sizes total-size]
(let [goal 40000000
to-remove (- total-size goal)]
(->> sizes
(filter #(>= % to-remove))
(reduce min))))
(defn solve
([] (solve (aoc/read-file 7)))
([input]
(let [folders (calc-sizes (aoc/parse-input input))
total-size (folders ["/"])
sizes (vals folders)]
[(part-1 sizes)
(part-2 sizes total-size)])))
(solve)