<?php
function interpreter(string $code, int $iterations, int $width, int $height): string {
$dataGrid = [];
$output = '';
$codeOffset = -1;
$skip = 0;
$commands = $code;
$pointer = ['x' => 0, 'y' => 0];
$jmps = new SplStack();
for ($row = 0; $row < $width; ++$row) {
for ($col = 0; $col < $height; ++$col) {
$dataGrid[$col][$row] = '0';
}
}
while (strlen($commands) && $iterations) {
if (!$skip)
echo "{$commands} ({$pointer['x']}, {$pointer['y']} = {$dataGrid[$pointer['x']][$pointer['y']]})\n";
++$codeOffset;
$command = $commands[0];
$commands = substr($commands, 1);
if ($skip) {
if ($command === ']') {
$jmps->pop();
var_dump("pop");
--$skip;
} elseif ($command === '[') {
++$skip;
}
continue;
}
//var_dump($command);
switch ($command) {
case 'n':
if (--$pointer['x'] === -1) {
$pointer['x'] = $height - 1;
}
break;
case 'e':
if (++$pointer['y'] === $width) {
$pointer['y'] = 0;
}
break;
case 's':
if (++$pointer['x'] === $height) {
$pointer['x'] = 0;
}
break;
case 'w':
if (--$pointer['y'] === -1) {
$pointer['y'] = $width - 1;
}
break;
case '*':
if ($dataGrid[$pointer['x']][$pointer['y']] === '0') {
echo "{$pointer['x']}, {$pointer['y']} = 1\n";
$dataGrid[$pointer['x']][$pointer['y']] = '1';
} else {
echo "{$pointer['x']}, {$pointer['y']} = 0\n";
$dataGrid[$pointer['x']][$pointer['y']] = '0';
}
break;
case '[':
$jmps->push($codeOffset);
var_dump("push");
if ($dataGrid[$pointer['x']][$pointer['y']] === '0') {
$skip = 1;
}
break;
case ']':
$jmpOffset = $jmps->top();
var_dump("pop");
if ($dataGrid[$pointer['x']][$pointer['y']] === '1') {
$commands = substr($code, $jmpOffset + 1);
$codeOffset = $jmpOffset;
// ++$iterations;
}
break;
default:
continue 2;
}
--$iterations;
}
$rows = [];
foreach ($dataGrid as $row) {
$rows[] = implode('', $row);
}
return implode("\r\n", $rows);
}
var_dump(interpreter("*[es*]", 52, 5, 6));
/*
11000
01100
00110
00011
00001
10000*/
// var_dump(interpreter("*[s[e]*]", 9, 5, 5));
/*10000
10000
00000
00000
00000*/
preferences:
52.63 ms | 402 KiB | 5 Q