-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathd07.php
98 lines (77 loc) · 3.27 KB
/
d07.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
92
93
94
95
96
97
98
<?php
function run_board(int $overide_b = null)
{
$lines = file('input_d07.txt', FILE_IGNORE_NEW_LINES);
$wires = [];
while (count($lines) > 0) {
$line = array_shift($lines);
$parts = explode(' ', $line);
if (count($parts) === 3) {
// Direct wiring
if (!is_numeric($parts[0]) && !isset($wires[$parts[0]])) {
array_push($lines, $line);
continue;
}
$val = is_numeric($parts[0]) ? intval($parts[0]) : $wires[$parts[0]];
$wires[$parts[2]] = $val;
} else if (count($parts) === 4) {
// NOT
if (!is_numeric($parts[1]) && !isset($wires[$parts[1]])) {
array_push($lines, $line);
continue;
}
$wires[$parts[3]] = 65535 - (is_numeric($parts[1]) ? intval($parts[1]) : $wires[$parts[1]]);
} else if (count($parts) === 5) {
switch ($parts[1]) {
case 'AND':
if ((!is_numeric($parts[0]) && !isset($wires[$parts[0]])) ||
(!is_numeric($parts[2]) && !isset($wires[$parts[2]]))) {
array_push($lines, $line);
continue;
}
$val0 = is_numeric($parts[0]) ? intval($parts[0]) : $wires[$parts[0]];
$val2 = is_numeric($parts[2]) ? intval($parts[2]) : $wires[$parts[2]];
$wires[$parts[4]] = $val0 & $val2;
break;
case 'OR';
if ((!is_numeric($parts[0]) && !isset($wires[$parts[0]])) ||
(!is_numeric($parts[2]) && !isset($wires[$parts[2]]))) {
array_push($lines, $line);
continue;
}
$val0 = is_numeric($parts[0]) ? intval($parts[0]) : $wires[$parts[0]];
$val2 = is_numeric($parts[2]) ? intval($parts[2]) : $wires[$parts[2]];
$wires[$parts[4]] = $val0 | $val2;
break;
case 'LSHIFT':
if (!is_numeric($parts[0]) && !isset($wires[$parts[0]])) {
array_push($lines, $line);
continue;
}
$val0 = is_numeric($parts[0]) ? intval($parts[0]) : $wires[$parts[0]];
$val2 = is_numeric($parts[2]) ? intval($parts[2]) : $wires[$parts[2]];
$wires[$parts[4]] = $val0 << $val2;
break;
case 'RSHIFT':
if (!is_numeric($parts[0]) && !isset($wires[$parts[0]])) {
array_push($lines, $line);
continue;
}
$val0 = is_numeric($parts[0]) ? intval($parts[0]) : $wires[$parts[0]];
$val2 = is_numeric($parts[2]) ? intval($parts[2]) : $wires[$parts[2]];
$wires[$parts[4]] = $val0 >> $val2;
break;
}
}
if ($overide_b !== null && isset($wires['b'])) {
$wires['b'] = $overide_b;
}
}
return $wires;
}
// Part 1
$wires = run_board();
var_dump($wires['a']);
// Part 2
$wires = run_board($wires['a']);
var_dump($wires['a']);