Solve AOC day 7 pt 2

This commit is contained in:
2021-12-07 11:20:50 -07:00
parent 97e2369fcb
commit 505e7fd054
2 changed files with 15 additions and 7 deletions

View File

@@ -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)

View File

@@ -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)