(function crabPositions [file] (map (.split (first (Util.readLines file)) ",") Std.parseInt)) (function :Int summation [n] (/ (* n (+ 1 n)) 2)) (function :Int fuelToAlignAt [x :Array positions &opt :Bool part2] (apply + (for crabX positions (let [distance (Math.abs (- x crabX))] (if part2 (summation distance) distance))))) (function :Int bestPosToAlignAt [:Array 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 "")))