-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path02.php
55 lines (45 loc) · 1.1 KB
/
02.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
$time_start = microtime(true);
function is_safe(array $numbers): bool
{
$diff_prev = 0;
for ($i = 1; $i < count($numbers); $i++) {
$diff = $numbers[$i] - $numbers[$i - 1];
// diff must be between 1 and 3
if (abs($diff) < 1 || abs($diff) > 3) {
return false;
}
// sign of each diff must match preceding diff
if ($i >= 2 && $diff > 0 != $diff_prev > 0) {
return false;
}
$diff_prev = $diff;
}
return true;
}
$input = trim(file_get_contents('02.txt'));
$pt1 = 0;
$pt2 = 0;
foreach (explode("\n", $input) as $line) {
$numbers = array_map(function($v) { return (int) $v; }, explode(' ', $line));
if (is_safe($numbers)) {
$pt1++;
$pt2++;
continue;
}
// for part 2, brute-force remove each number and see if safe
for ($i = 0; $i < count($numbers); $i++) {
$copy = $numbers;
unset($copy[$i]);
$copy = array_values($copy);
if (is_safe($copy)) {
$pt2++;
break;
}
}
}
echo "--- Day 2: Red-Nosed Reports ---", PHP_EOL;
echo "Part 1: ", $pt1, PHP_EOL;
echo "Part 2: ", $pt2, PHP_EOL;
echo "Took ", (microtime(true) - $time_start) * 1000, " ms", PHP_EOL;
echo PHP_EOL;