32 lines
1.3 KiB
Plaintext
32 lines
1.3 KiB
Plaintext
(function crabPositions [file]
|
|
(map (.split (first (Util.readLines file)) ",") Std.parseInt))
|
|
|
|
(function :Int summation [n]
|
|
(/ (* n (+ 1 n)) 2))
|
|
|
|
(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)
|
|
&mut maxX (apply max positions)]
|
|
(loop
|
|
(let [middleX (Math.floor (/ (+ minX maxX) 2))
|
|
middleFuel (fuelToAlignAt middleX positions ?part2)
|
|
leftBy1Fuel (fuelToAlignAt (- middleX 1) positions ?part2)
|
|
rightBy1Fuel (fuelToAlignAt (+ middleX 1) positions ?part2)]
|
|
~[minX middleX maxX]
|
|
(cond
|
|
((= minX middleX maxX)
|
|
(throw ""))
|
|
((< middleFuel (min leftBy1Fuel rightBy1Fuel))
|
|
(return middleX))
|
|
((< leftBy1Fuel middleFuel)
|
|
(set maxX middleX))
|
|
((< rightBy1Fuel middleFuel)
|
|
(set minX middleX)))))
|
|
(throw ""))) |