-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday-7.php
73 lines (57 loc) · 1.83 KB
/
day-7.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
<?php
$input = trim(file_get_contents('input/' . substr(basename(__FILE__), 0, -4)));
$input = explode("\n", $input);
$reqs = $initReqs = $available = [];
foreach ($input as $line) {
$parts = explode(' ', $line);
$reqs[$parts[7]][] = $initReqs[$parts[7]][] = $parts[1];
$available[$parts[1]] = true;
}
$start = array_keys(array_diff_key($available, $reqs));
// Part 1
$result = '';
$available = $start;
do {
sort($available);
unset($reqs[$available[0]]);
$result .= array_shift($available);
foreach ($reqs as $step => $requirements) {
foreach ($requirements as $st) {
if (strpos($result, $st) === false) {
continue 2;
}
}
$available[] = $step;
unset($reqs[$step]);
}
} while (!empty($available));
echo 'Answer 1: ' . $result . PHP_EOL;
// Part 2
[$available, $reqs] = [$start, $initReqs];
$workers = array_fill(0, 5, ['idle', null, 0]);
$second = 0;
$completed = $notAvailable = [];
while (count($completed) != strlen($result) && ++$second) {
foreach ($reqs as $step => $requirements) {
if (isset($completed[$step]) || isset($notAvailable[$step]) || in_array($step, $available)) {
continue;
}
foreach ($requirements as $st) {
if (!isset($completed[$st])) {
continue 2;
}
}
$available[] = $step;
}
foreach ($workers as $index => &$data) {
if ($data[0] === 'idle' && !empty($available)) {
$data = ['working', $available[0], $second];
$notAvailable[array_shift($available)] = true;
}
if ($data[0] === 'working' && $second - $data[2] === ord($data[1]) - 5) {
$completed[$data[1]] = true;
$data = ['idle', null, $second];
}
}
}
echo 'Answer 2: ' . $second . PHP_EOL;