-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
aoc2022-9-part2.php
69 lines (53 loc) · 1.73 KB
/
aoc2022-9-part2.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
<?php
declare(strict_types=1);
namespace App;
use Generator;
use loophp\collection\Collection;
include __DIR__ . '/vendor/autoload.php';
$addCoords = static function (array $coord1, array $coord2): array {
return [$coord1[0] + $coord2[0], $coord1[1] + $coord2[1]];
};
$sign = static fn (int $a): int => $a === 0 ? 0 : $a / abs($a);
$move = static function (array $snake, array $coord) use ($addCoords, $sign): array {
$snake[0] = $addCoords($snake[0], $coord);
for ($i = 0; $i < count($snake) - 1; $i++) {
$dx = $snake[$i][0] - $snake[$i+1][0];
$dy = $snake[$i][1] - $snake[$i+1][1];
if (abs($dx) > 1 || abs($dy) > 1) {
$snake[$i+1][0] += $sign($dx);
$snake[$i+1][1] += $sign($dy);
}
}
return $snake;
};
$visited = [];
$snake = Collection::fromFile(__DIR__ . '/input.txt')
->lines()
->flatmap(
static function (string $line): Generator {
[$direction, $steps] = sscanf($line, "%s %d");
for ($i = 0; $i < $steps; $i++) {
yield $direction;
}
}
)
->map(
static fn (string $line): array =>
match ($line) {
'R' => [1, 0],
'U' => [0, 1],
'L' => [-1, 0],
'D' => [0, -1],
}
)
->reduce(
static function (array $snake, array $coord) use ($move, &$visited): array {
$snake = $move($snake, $coord);
$visited[1][sprintf("(%s,%s)", ...$snake[1])] = true;
$visited[9][sprintf("(%s,%s)", ...$snake[9])] = true;
return $snake;
},
array_pad([], 10, [0, 0])
);
dump("Tail1: ". count($visited[1]));
dump("Tail9: " . count($visited[9]));