-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday05.janet
41 lines (36 loc) · 1.25 KB
/
day05.janet
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
(import ./utils/utils :as utl)
(def parser
~{:seeds (/ (* "seeds: " (some (* (number :d+) :s*))), array)
:range (/ (* (number :d+) " " (number :d+) " " (number :d+) "\n") ,|{:dest $0 :src $1 :len $2})
:maps (/ (* (some :S) " map:" :s* (some :range) :s*), array)
:main (/ (* :seeds (some :maps)), |{:seeds $0 :maps $&})})
(defn get-new-seed [maps seed]
(var sd seed)
(loop [[k v] :pairs maps]
(if (<= (v :src) sd (- (+ (v :src) (v :len)) 1) )
((set sd (+(v :dest) (- sd (v :src)) )) (break))))
sd)
(defn proceed [init-seed maps]
(var seed init-seed)
(each m maps
(set seed (get-new-seed m seed)))
seed)
(defn determine-seeds [seeds maps]
(var sd seeds)
(var smaller math/inf)
(while (not (empty? sd))
(def [start len] (take 2 sd))
(set sd (take (- 2 (length sd)) sd))
(loop [i :range [0 len]]
(def res (proceed (+ start i) maps))
(if (< res smaller) (set smaller res))))
smaller)
(defn main [&]
(let [str (slurp "inputs/day5")
[input] (peg/match parser str)
maps (input :maps)
seeds (input :seeds)
final-seeds (map |(proceed $ maps) seeds)]
(print "Day05 : " (apply min final-seeds))
#(print (determine-seeds seeds maps))
))