// Parse begin state
preg_match("/Begin in state (\w)/", $input->string, $state);
$state = $state[1];
// Parse steps
preg_match("/checksum after (\d+) steps/", $input->string, $steps);
$steps = (int) $steps[1];
// Parse states
$states = $input->lines->filter()->slice(2)->chunk(9)->mapAssoc(fn ($i, $state) => [
$state[0][strlen($state[0]) - 2] =>
$state->slice(1)->chunk(4)->mapAssoc(fn ($i, $chunk) => [
$chunk[0][strlen($chunk[0]) - 2] => [
$chunk[1][strlen($chunk[1]) - 2], // Value
substr($chunk[2], -6, -1) == "right" ? 1 : -1, // Direction
$chunk[3][strlen($chunk[3]) - 2] // State
]
])
]);
$tape = [];
$pos = 0;
for ($i = 0; $i < $steps; $i++) {
$value = $tape[$pos] ?? 0; // Get value : 1 or 0
$tape[$pos] = $states[$state][$value][0]; // Set value
$pos += $states[$state][$value][1]; // Move pointer
$state = $states[$state][$value][2]; // Change state
}
$solution_1 = array_sum($tape);
$solution_2 = "⭐";