/
day19.php
71 lines (65 loc) · 1.54 KB
/
day19.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
<?php
ini_set('memory_limit','512M');
const TEST = false;
if (TEST) {
$trans = [
'H' => ['HO', 'OH'],
'O' => ['HH'],
];
$string = 'HOHOHO';
} else {
$trans = [];
$string = null;
foreach(file('input/day19.txt') as $row) {
$row = trim($row);
if (preg_match('/(\w+) => (\w+)/', $row, $match)) {
$trans[$match[1]][] = $match[2];
} elseif(!empty($row)) {
$string = $row;
}
}
}
function transform($trans, $string) {
$results = [];
$strLen = strlen($string);
foreach ($trans as $key => $values) {
$keyLen = strlen($key);
for ($i=0; $i<=($strLen-$keyLen); $i++) {
if (substr($string, $i, $keyLen) === $key) {
$start = substr($string, 0, $i);
$end = substr($string, $i+$keyLen);
foreach($values as $replace) {
$results[] = $start . $replace . $end;
}
}
}
}
return array_unique($results);
}
//Part 1 solution
$part1 = transform($trans, $string);
print ("Uniques: ".count($part1) ."\n");
//reverse transformations
$reverse = [];
foreach($trans as $from => $values) {
foreach ($values as $val) {
if (isset($reverse[$val])) throw ('already exists');
$reverse[$val][] = $from;
}
}
$min = 2147483647;
function reverse_recurse($string, $step=0) {
global $reverse, $min;
if ($string == 'e') {
if ($step < $min) {
$min = $step;
print ("min: $min\n");
}
} else {
foreach (transform($reverse, $string) as $reversed) {
reverse_recurse($reversed, $step+1);
}
}
}
reverse_recurse($string);
print ("Min ${min}\n");