Optimize ~11s to instant!
All checks were successful
continuous-integration/drone/push Build is passing

Thanks JetBrains AI :)
This commit is contained in:
Tristan 2023-12-03 16:56:03 +01:00
parent 50db9f329c
commit 9d1c297bbd
Signed by: trizz
SSH Key Fingerprint: SHA256:Xsd2dTN+ZC3OZWfvuKIDMQ/1lWicuINSEPgRQw/CJT8

View File

@ -30,10 +30,13 @@ final class Day7 extends Solution
{ {
$crabs = array_map(static fn (string $crab): int => (int) $crab, explode(',', $data)); $crabs = array_map(static fn (string $crab): int => (int) $crab, explode(',', $data));
/** @psalm-param array{int: int} $fuelPerPosition */ /** @var array<int, int> $fuelPerPosition */
$fuelPerPosition = []; $fuelPerPosition = [];
for ($position = min($crabs); $position <= max($crabs); ++$position) { $minCrab = min($crabs);
$maxCrab = max($crabs);
for ($position = $minCrab; $position <= $maxCrab; ++$position) {
foreach ($crabs as $crab) { foreach ($crabs as $crab) {
if (!isset($fuelPerPosition[$position])) { if (!isset($fuelPerPosition[$position])) {
$fuelPerPosition[$position] = 0; $fuelPerPosition[$position] = 0;
@ -42,20 +45,13 @@ final class Day7 extends Solution
$consumption = abs($position - $crab); $consumption = abs($position - $crab);
if ($forPart2) { if ($forPart2) {
$newConsumption = 0; $consumption = $consumption * ($consumption + 1) / 2;
// I'm sure there's another way than brute-forcing, but hey, this also works!
for ($steps = 1; $steps <= $consumption; ++$steps) {
$newConsumption += $steps;
}
$consumption = $newConsumption;
} }
$fuelPerPosition[$position] += $consumption; $fuelPerPosition[$position] += $consumption;
} }
} }
/** @psalm-suppress ArgumentTypeCoercion */ return (int) min($fuelPerPosition);
return min($fuelPerPosition);
} }
} }