-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday05.clj
85 lines (69 loc) · 2.58 KB
/
day05.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
(ns day05
(:require aoc))
(defn parse-line [line]
(let [[dest src len] (aoc/integers line)]
{:lo src
:hi (+ src (dec len))
:diff (- dest src)}))
(defn parse-maps [maps]
(->> (rest maps)
(map parse-line)
(sort-by :lo)))
(defn seed-ranges [seeds]
(sort-by
:start
(for [[start len] (partition 2 seeds)]
{:start start
:stop (+ start (dec len))})))
(defn convert-number [rules src]
(reduce
(fn [src {:keys [lo hi diff]}]
(if (<= lo src hi)
(reduced (+ src diff))
src))
src
rules))
(defn convert-1 [srcs rules]
(map #(convert-number rules %) srcs))
(defn convert-2 [srcs rules]
(loop [[{:keys [start stop]} & rem-srcs :as srcs] srcs
[{:keys [lo hi diff]} & rem-rules :as rules] rules
result []]
(if (or (empty? srcs) (empty? rules))
(sort-by :start (reduce conj result srcs))
(cond
(> start hi) (recur srcs rem-rules result)
(< stop lo) (recur rem-srcs
rules
(conj result {:start start
:stop stop}))
(<= lo start stop hi) (recur rem-srcs
rules
(conj result {:start (+ diff start)
:stop (+ diff stop)}))
(<= lo start hi stop) (recur (conj rem-srcs {:start (inc hi)
:stop stop})
rem-rules
(conj result {:start (+ diff start)
:stop (+ diff hi)}))
(<= start lo stop hi) (recur rem-srcs
rules
(-> result
(conj {:start start
:stop (dec lo)})
(conj {:start (+ diff lo)
:stop (+ diff stop)})))))))
(defn part-1 [seeds maps]
(reduce min (reduce convert-1 seeds maps)))
(defn part-2 [seeds maps]
(->> (reduce convert-2 seeds maps)
first
:start))
(defn solve [input]
(let [[[seeds] & maps] (aoc/parse-input-paragraphs input)
seeds-1 (aoc/integers seeds)
seeds-2 (seed-ranges seeds-1)
rules (map parse-maps maps)]
[(part-1 seeds-1 rules)
(part-2 seeds-2 rules)]))
(solve (aoc/read-file 5))