Skip to content

Instantly share code, notes, and snippets.

@mrbellek
Created January 2, 2024 15:05
Show Gist options
  • Save mrbellek/3ecb47c7cb80557715d99e0437acc8fe to your computer and use it in GitHub Desktop.
Save mrbellek/3ecb47c7cb80557715d99e0437acc8fe to your computer and use it in GitHub Desktop.
Advent of Code - day 9
<?php
declare(strict_types=1);
//$input = file('sample.txt', FILE_IGNORE_NEW_LINES);
$input = file('input.txt', FILE_IGNORE_NEW_LINES);
$totalNextNumbers = 0;
$totalPreviousNumbers = 0;
foreach ($input as $line) {
$numbers = explode(' ', $line);
[$nextNumber, $previousNumber] = findNextAndPreviousNumber($numbers);
printf('Next line in number sequence "%s" is: %s' . PHP_EOL, $line, $nextNumber);
printf('...and the previous number is: %s' . PHP_EOL, $previousNumber);
$totalNextNumbers += $nextNumber;
$totalPreviousNumbers += $previousNumber;
}
printf('Total difference for next numbers: %s' . PHP_EOL, $totalNextNumbers);
printf('Total different for previous numbers: %s' . PHP_EOL, $totalPreviousNumbers);
function findNextAndPreviousNumber(array $numbers): array
{
$numbersList = [];
while (areAllSameNumbers($numbers) === false) {
$numbersList[] = $numbers;
$numbers = findDifferences($numbers);
}
$nextNumber = $numbers[0];
$previousNumber = $numbers[0];
foreach (array_reverse($numbersList) as $list) {
$nextNumber = end($list) + $nextNumber;
$previousNumber = reset($list) - $previousNumber;
}
return [$nextNumber, $previousNumber];
}
function findDifferences(array $numbers): array
{
$newNumbers = [];
for ($i = 1; $i < count($numbers); $i++) {
$newNumbers[] = $numbers[$i] - $numbers[$i - 1];
}
return $newNumbers;
}
function areAllSameNumbers(array $numbers): bool
{
return implode('', $numbers) === str_repeat((string)$numbers[0], count($numbers));
}
function dd($a, $b = null, $c = null, $d = null): void
{
die(var_dump($a, $b, $c, $d));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment