-
Notifications
You must be signed in to change notification settings - Fork 0
/
Puzzle09.php
91 lines (69 loc) · 2.03 KB
/
Puzzle09.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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php declare(strict_types=1);
namespace AdventOfCode2020;
echo sprintf('Puzzle 9 part 1: %d'.PHP_EOL, (new Puzzle09())->part1());
echo sprintf('Puzzle 9 part 2: %d'.PHP_EOL, (new Puzzle09())->part2());
final class Puzzle09
{
public function part1(bool $test = false): int
{
$preamble = $test ? 5 : 25;
$numbers = $this->getNumbers($test);
$numbersCount = count($numbers);
$y = 0;
for ($i = $preamble; $i <= $numbersCount; $i++)
{
$number = $numbers[$i];
$numbersToCheck = array_slice($numbers, $y++, $preamble);
if (!$this->check($number, $numbersToCheck)) {
return $number;
}
}
return 0;
}
public function part2(bool $test = false): int
{
$target = $this->part1($test);
$numbers = $this->getNumbers($test);
foreach ($numbers as $i => $number) {
$y = $i;
$sum = 0;
while ($sum < $target && $y < count($numbers)) {
$sum += $numbers[$y];
if ($sum === $target) {
$slice = array_slice($numbers, $i, ($y-$i+1));
return min($slice) + max($slice);
}
$y++;
}
}
return 0;
}
private function check(int $number, array $numbers): bool
{
foreach ($numbers as $numX) {
foreach ($numbers as $numY) {
if ($numX !== $numY && ($number === ($numX+$numY))) {
return true;
}
}
}
return false;
}
/**
* @return int[]
*/
private function getNumbers(bool $test = false): array
{
$filename = $test
? 'Input09-Test.txt'
: 'Input09.txt';
$fp = @fopen($filename, 'rb');
$numbers = [];
if ($fp) {
while (($line = fgets($fp, 4096)) !== false) {
$numbers[] = (int)$line;
}
}
return $numbers;
}
}