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
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;
|