Solve AOC day 7 pt 2
This commit is contained in:
@@ -31,7 +31,8 @@
|
|||||||
(load "day7.kiss")
|
(load "day7.kiss")
|
||||||
(assert (= 2 (bestPosToAlignAt (crabPositions "src/year2021/inputs/day7-example.txt"))))
|
(assert (= 2 (bestPosToAlignAt (crabPositions "src/year2021/inputs/day7-example.txt"))))
|
||||||
(let [positions (crabPositions "src/year2021/inputs/day7.txt")]
|
(let [positions (crabPositions "src/year2021/inputs/day7.txt")]
|
||||||
(print (fuelToAlignAt (bestPosToAlignAt positions) positions))))
|
(assert (= 356958 (fuelToAlignAt (bestPosToAlignAt positions) positions)))
|
||||||
|
(assert (= 105461913 (fuelToAlignAt (bestPosToAlignAt positions true) positions true)))))
|
||||||
(dayTodo 8)
|
(dayTodo 8)
|
||||||
(dayTodo 9)
|
(dayTodo 9)
|
||||||
(dayTodo 10)
|
(dayTodo 10)
|
||||||
|
@@ -1,17 +1,24 @@
|
|||||||
(function crabPositions [file]
|
(function crabPositions [file]
|
||||||
(map (.split (first (Util.readLines file)) ",") Std.parseInt))
|
(map (.split (first (Util.readLines file)) ",") Std.parseInt))
|
||||||
|
|
||||||
(function :Int fuelToAlignAt [x :Array<Int> positions]
|
(function :Int summation [n]
|
||||||
(apply + (for crabX positions (Math.abs (- x crabX)))))
|
(/ (* n (+ 1 n)) 2))
|
||||||
|
|
||||||
(function :Int bestPosToAlignAt [:Array<Int> positions]
|
(function :Int fuelToAlignAt [x :Array<Int> positions &opt :Bool part2]
|
||||||
|
(apply + (for crabX positions
|
||||||
|
(let [distance (Math.abs (- x crabX))]
|
||||||
|
(if part2
|
||||||
|
(summation distance)
|
||||||
|
distance)))))
|
||||||
|
|
||||||
|
(function :Int bestPosToAlignAt [:Array<Int> positions &opt :Bool part2]
|
||||||
(let [&mut minX (apply min positions)
|
(let [&mut minX (apply min positions)
|
||||||
&mut maxX (apply max positions)]
|
&mut maxX (apply max positions)]
|
||||||
(loop
|
(loop
|
||||||
(let [middleX (Math.floor (/ (+ minX maxX) 2))
|
(let [middleX (Math.floor (/ (+ minX maxX) 2))
|
||||||
middleFuel (fuelToAlignAt middleX positions)
|
middleFuel (fuelToAlignAt middleX positions ?part2)
|
||||||
leftBy1Fuel (fuelToAlignAt (- middleX 1) positions)
|
leftBy1Fuel (fuelToAlignAt (- middleX 1) positions ?part2)
|
||||||
rightBy1Fuel (fuelToAlignAt (+ middleX 1) positions)]
|
rightBy1Fuel (fuelToAlignAt (+ middleX 1) positions ?part2)]
|
||||||
~[minX middleX maxX]
|
~[minX middleX maxX]
|
||||||
(cond
|
(cond
|
||||||
((= minX middleX maxX)
|
((= minX middleX maxX)
|
||||||
|
Reference in New Issue
Block a user