You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
2.7 KiB
PHP

<?php
// https://adventofcode.com/2017/day/3
/*
* Working solution for 2017-12-03 part 1
*/
function puzzle1(int $maxNumber) : int
{
$x = 0;
$y = 0;
$steps = 0;
$diameter = 1;
$direction = 4;
for ($number = 1; $number < $maxNumber; $number++) {
if ($direction === 4) {
$x++;
$diameter += 2;
$direction = 0;
$steps = $diameter - 2;
} else {
switch ($direction) {
case 0:
$y--;
break;
case 1:
$x--;
break;
case 2:
$y++;
break;
case 3:
$x++;
break;
}
$steps--;
if ($steps === 0) {
$direction++;
$steps = $diameter - 1;
}
}
}
return abs($x) + abs($y);
}
/*
* Working solution for 2017-12-03 part 2
*/
function puzzle2(int $maxNumber) : int
{
$x = 0;
$y = 0;
$steps = 0;
$diameter = 1;
$direction = 4;
$map = [];
for ($number = 1; $number < $maxNumber; $number++) {
// x-1,y-1 x,y-1 x+1,y-1
// x-1,y x+1,y+1
// x-1,y+1 x,y+1 x+1,y+1
$newNumber =
($map[$y-1][$x-1] ?? 0) +
($map[$y-1][$x] ?? 0) +
($map[$y-1][$x+1] ?? 0) +
($map[$y][$x-1] ?? 0) +
($map[$y][$x+1] ?? 0) +
($map[$y+1][$x-1] ?? 0) +
($map[$y+1][$x] ?? 0) +
($map[$y+1][$x+1] ?? 0);
$number = ($newNumber === 0) ? 1 : $newNumber;
$map[$y][$x] = $number;
if ($direction === 4) {
$x++;
$diameter += 2;
$direction = 0;
$steps = $diameter - 2;
} else {
switch ($direction) {
case 0:
$y--;
break;
case 1:
$x--;
break;
case 2:
$y++;
break;
case 3:
$x++;
break;
}
$steps--;
if ($steps === 0) {
$direction++;
$steps = $diameter - 1;
}
}
}
return $number - 1;
}
echo 'First challange sample:'.PHP_EOL;
echo puzzle1(1).PHP_EOL;
echo puzzle1(12).PHP_EOL;
echo puzzle1(23).PHP_EOL;
echo puzzle1(1024).PHP_EOL.PHP_EOL;
echo 'First challange solution:'.PHP_EOL;
echo puzzle1(347991).PHP_EOL.PHP_EOL;
echo 'Second challange solution:'.PHP_EOL;
echo puzzle2(347991).PHP_EOL;