From 505e7fd0547db88339f03d83062544e823d97cf8 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Tue, 7 Dec 2021 11:20:50 -0700 Subject: [PATCH] Solve AOC day 7 pt 2 --- projects/aoc/src/year2021/Solutions2021.kiss | 3 ++- projects/aoc/src/year2021/day7.kiss | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/projects/aoc/src/year2021/Solutions2021.kiss b/projects/aoc/src/year2021/Solutions2021.kiss index 32bb45cf..071b2820 100644 --- a/projects/aoc/src/year2021/Solutions2021.kiss +++ b/projects/aoc/src/year2021/Solutions2021.kiss @@ -31,7 +31,8 @@ (load "day7.kiss") (assert (= 2 (bestPosToAlignAt (crabPositions "src/year2021/inputs/day7-example.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 9) (dayTodo 10) diff --git a/projects/aoc/src/year2021/day7.kiss b/projects/aoc/src/year2021/day7.kiss index 4db76fb1..724a80c6 100644 --- a/projects/aoc/src/year2021/day7.kiss +++ b/projects/aoc/src/year2021/day7.kiss @@ -1,17 +1,24 @@ (function crabPositions [file] (map (.split (first (Util.readLines file)) ",") Std.parseInt)) -(function :Int fuelToAlignAt [x :Array positions] - (apply + (for crabX positions (Math.abs (- x crabX))))) +(function :Int summation [n] + (/ (* n (+ 1 n)) 2)) -(function :Int bestPosToAlignAt [:Array positions] +(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) - leftBy1Fuel (fuelToAlignAt (- middleX 1) positions) - rightBy1Fuel (fuelToAlignAt (+ middleX 1) positions)] + middleFuel (fuelToAlignAt middleX positions ?part2) + leftBy1Fuel (fuelToAlignAt (- middleX 1) positions ?part2) + rightBy1Fuel (fuelToAlignAt (+ middleX 1) positions ?part2)] ~[minX middleX maxX] (cond ((= minX middleX maxX)