58 lines
1.5 KiB
PHP
58 lines
1.5 KiB
PHP
|
<?php
|
||
|
|
||
|
[$instructions, $mine, $others] = explode("\n\n", file_get_contents('input.txt'));
|
||
|
|
||
|
// parse instructions
|
||
|
function parseInstructions($instructions)
|
||
|
{
|
||
|
// class: 1-3 or 5-7
|
||
|
preg_match_all('/^[a-z]+: (\d+)-(\d+) or (\d+)-(\d+)$/mi', $instructions, $matches);
|
||
|
if (count($matches) !== 5) {
|
||
|
echo sprintf('Regex failed : %s', var_export($matches, true));
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
$compares = [];
|
||
|
array_shift($matches);
|
||
|
for ($i = 0, $l = count($matches[0]); $i < $l; $i++) {
|
||
|
$compares[] = static function ($number) use ($matches, $i) {
|
||
|
$comparison = ($number >= (int)$matches[0][$i] and $number <= (int)$matches[1][$i])
|
||
|
|| ($number >= (int)$matches[2][$i] and $number <= (int)$matches[3][$i]);
|
||
|
if ($comparison === true) {
|
||
|
return true;
|
||
|
}
|
||
|
return $number;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
return $compares;
|
||
|
}
|
||
|
|
||
|
$compares = parseInstructions($instructions);
|
||
|
|
||
|
// check others
|
||
|
$others = explode("\n", $others);
|
||
|
array_shift($others);
|
||
|
$others = array_map(static function($other) {
|
||
|
return explode(',', $other);
|
||
|
}, $others);
|
||
|
|
||
|
$sum = 0;
|
||
|
foreach ($others as $other) {
|
||
|
foreach ($other as $number) {
|
||
|
$is_valid = false;
|
||
|
foreach ($compares as $compare) {
|
||
|
if ($compare((int)$number) === true) {
|
||
|
$is_valid = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
if (!$is_valid) {
|
||
|
$sum += $number;
|
||
|
echo sprintf('%u not in comparison list%s', $number, "\n");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// sum it up
|
||
|
echo $sum;
|