-
Notifications
You must be signed in to change notification settings - Fork 0
/
Day10.php
91 lines (81 loc) · 2.41 KB
/
Day10.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 App;
use App\Contracts\DayBehaviour;
use Illuminate\Support\Collection;
class Day10 extends DayBehaviour
{
protected array $tags = [
'(' => ')',
'[' => ']',
'{' => '}',
'<' => '>',
];
public function solvePart1(): ?int
{
return collect($this->input)
->map(fn (string $line): ?string => $this->parseChunk($line)['errors']->first())
->reduce(fn (int $c, ?string $t): int => $c + match ($t) {
')' => 3,
']' => 57,
'}' => 1197,
'>' => 25137,
default => 0,
}, 0)
;
}
public function solvePart2(): ?int
{
return (int) collect($this->input)
->map(fn (string $line): array => $this->parseChunk($line))
->map(fn (array $chunk): ?Collection => $chunk['errors']->isEmpty() ? collect($chunk['chunk'])->map(fn ($t) => $this->tags[$t])->reverse() : null)
->filter()
->map(fn ($chunk) => $chunk->reduce(fn ($c, $t) => (5 * $c) + match ($t) {
')' => 1,
']' => 2,
'}' => 3,
'>' => 4,
}, 0))
->median();
}
/**
* @return array{chunk: array, errors: Collection}
*/
protected function parseChunk(string $line): array
{
$chunk = [];
$errors = collect(str_split($line))
->filter(function (string $t) use (&$chunk) {
if (isset($this->tags[$t])) { // we've found an open tag, add to our chunk
$chunk[] = $t;
} elseif ($t === $this->tags[last($chunk)] ?? null) { // found a valid closing tag
array_pop($chunk);
} else { // syntax error
return true;
}
return false;
});
return [
'chunk' => $chunk,
'errors' => $errors,
];
}
public function example(): array
{
return explode(
"\n",
<<<eof
[({(<(())[]>[[{[]{<()<>>
[(()[<>])]({[<{<<[]>>(
{([(<{}[<>[]}>{[]{[(<()>
(((({<>}<{<{<>}{[]{[]{}
[[<[([]))<([[{}[[()]]]
[{[{({}]{}}([{[{{{}}([]
{<[[]]>}<{[{[{[]{()[[[]
[<(<(<(<{}))><([]([]()
<{([([[(<>()){}]>(<<{{
<{([{{}}[<[[[<>{}]]]>[]]
eof
);
}
}