1 DEC
This commit is contained in:
79
D1/main.janet
Normal file
79
D1/main.janet
Normal file
@@ -0,0 +1,79 @@
|
||||
# (import math)
|
||||
|
||||
# The smallest number in the left list is 1, and the smallest number in the
|
||||
# right list is 3. The distance between them is 2.
|
||||
|
||||
(def test-input
|
||||
[[3 4]
|
||||
[4 3]
|
||||
[2 5]
|
||||
[1 3]
|
||||
[3 9]
|
||||
[3 3]])
|
||||
|
||||
(defn unzip [lst]
|
||||
(def left @[])
|
||||
(def right @[])
|
||||
(each [fst snd] lst
|
||||
(array/push left fst)
|
||||
(array/push right snd))
|
||||
[(sorted left) (sorted right)])
|
||||
|
||||
(def test-input-unzipped (unzip test-input))
|
||||
|
||||
# The second-smallest number in the left list is 2, and the second-smallest
|
||||
# number in the right list is another 3. The distance between them is 1.
|
||||
|
||||
# The third-smallest number in both lists is 3, so the distance between them is
|
||||
# 0.
|
||||
|
||||
# The next numbers to pair up are 3 and 4, a distance of 1.
|
||||
|
||||
# The fifth-smallest numbers in each list are 3 and 5, a distance of 2.
|
||||
|
||||
# Finally, the largest number in the left list is 4, while the largest number in
|
||||
# the right list is 9; these are a distance 5 apart. To find the total distance
|
||||
# between the left list and the right list, add up the distances between all of
|
||||
# the pairs you found.
|
||||
|
||||
# In the example above, this is 2 + 1 + 0 + 1 + 2 + 5, a total distance of 11!
|
||||
|
||||
(defn distances [lst]
|
||||
(def max-idx (min (length (lst 0))
|
||||
(length (lst 1))))
|
||||
(def results @[])
|
||||
(for idx 0 max-idx
|
||||
(def dist (math/abs (- ((lst 0) idx)
|
||||
((lst 1) idx))))
|
||||
(array/push results dist))
|
||||
(+ ;results))
|
||||
|
||||
(def line-grammar
|
||||
'{:main (sequence (capture :d+) :s+ (capture :d+)) })
|
||||
|
||||
(def handle (file/open "input"))
|
||||
(def buffer @"")
|
||||
(def pairs @[])
|
||||
|
||||
(while true
|
||||
(def line (file/read handle :line))
|
||||
(when (not line)
|
||||
(break))
|
||||
(def captures (peg/match line-grammar line))
|
||||
(when captures
|
||||
(def [fst snd] captures)
|
||||
(array/push pairs [(scan-number fst) (scan-number snd)])))
|
||||
|
||||
(print
|
||||
(distances (unzip pairs)))
|
||||
|
||||
(def [left right] (unzip pairs))
|
||||
|
||||
(print
|
||||
(+ ;(map (fn [entry]
|
||||
(def equal-to-entry?
|
||||
(fn [rval]
|
||||
(= rval entry)))
|
||||
(* entry (count equal-to-entry? right)))
|
||||
left)))
|
||||
# ----
|
||||
Reference in New Issue
Block a user