adventofcode/src/Y21/Day7.php

62 lines
1.7 KiB
PHP
Raw Normal View History

2021-12-09 12:33:55 +01:00
<?php
namespace trizz\AdventOfCode\Y21;
2021-12-09 12:33:55 +01:00
use trizz\AdventOfCode\Solution;
2022-11-29 19:52:02 +01:00
final class Day7 extends Solution
2021-12-09 12:33:55 +01:00
{
public static null|int|string $part1ExampleResult = 37;
2022-11-29 19:52:02 +01:00
public static null|int|string $part1Result = 344297;
public static null|int|string $part2ExampleResult = 168;
2022-11-29 19:52:02 +01:00
public static null|int|string $part2Result = 97_164_301;
2021-12-09 12:33:55 +01:00
#[\Override]
public function part1(array $data): int
2021-12-09 12:33:55 +01:00
{
return $this->calculateFuel($data[0], forPart2: false);
}
#[\Override]
public function part2(array $data): int
2021-12-09 12:33:55 +01:00
{
return $this->calculateFuel($data[0], forPart2: true);
}
2022-11-29 19:52:02 +01:00
private function calculateFuel(string $data, bool $forPart2 = false): int
2021-12-09 12:33:55 +01:00
{
$crabs = array_map(static fn (string $crab): int => (int) $crab, explode(',', $data));
2022-11-29 19:52:02 +01:00
2021-12-09 12:33:55 +01:00
/** @psalm-param array{int: int} $fuelPerPosition */
$fuelPerPosition = [];
for ($position = min($crabs); $position <= max($crabs); ++$position) {
foreach ($crabs as $crab) {
if (!isset($fuelPerPosition[$position])) {
$fuelPerPosition[$position] = 0;
}
$consumption = abs($position - $crab);
if ($forPart2) {
$newConsumption = 0;
// 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;
}
}
/** @psalm-suppress ArgumentTypeCoercion */
return min($fuelPerPosition);
}
}