| Bytes | Lang | Time | Link |
|---|---|---|---|
| 1008 | PHP | 140305T005118Z | TimWolla |
PHP - 1008
<?php
$_=trim(fread(STDIN,1e5));$z=$p=0;$t=$l=[];$q='';function s(){global$p,$t,$l,$_,$q,$z;switch($_[$z++]){case'>':$p++;break;case'<':$p--;break;case'+':@$t[$p]++;break;case'-':@$t[$p]--;break;case'.':$q.=chr($t[$p]);break;case',':echo"I>";$t[$p]=ord(trim(fread(STDIN,2)));break;case'[':$l[]=$z;if(!isset($t[$p])||$t[$p]==0){$c=1;while($c>0){$b=$_[$z++];if($b=='[')$c++;elseif($b==']')$c--;}array_pop($l);}break;case']':$z=array_pop($l)-1;break;}if($z==strlen($_)){if($q)echo'O>'.$q."\n";die("Done\n");}}for(;;){echo">";$c=trim(fread(STDIN,1e5));$g=strlen($c);switch($c[0]){case'L':echo str_repeat(' ',$z)."v\n".$_."\n";break;case'D':if($g)$x=$t;else{list($a,$b)=explode(' ',substr($c,1));$x=array_slice($t,$a-1,$b);}echo implode(', ',$x)."\n";break;case'S':if($g)s();for($i=0;$i<substr($c,1);$i++)s();echo $z."\n";break;case'G':if($c[1]=='-')$x=strlen($_)-substr($c,2);else$x=substr($c,1);while($z!=$x)s();break;case'P':echo$p."\n";default:if(is_numeric($c))echo$t[$c]."\n";}if($q)echo'O>'.$q."\n";$q='';}
The output for cells that were never written is slightly different:
[timwolla@/data/workspace/php/PCG]php pcg-22585.php
+
>D15 20
>
Large version:
<?php
$_=trim(fread(STDIN,1024));
$z=$p=0;
$t=$l=[];
$q='';
function step() {
global $p, $t,$l,$_,$q,$z;
switch ($_[$z++]){
case '>':
$p++;
break;
case '<':
$p--;
break;
case '+':
@$t[$p]++;
break;
case '-':
@$t[$p]--;
break;
case '.':
$q.=chr($t[$p]);
break;
case ',':
echo "I>";
$t[$p] = ord(trim(fread(STDIN, 2)));
break;
case '[':
$l[] = $z;
if (!isset($t[$p]) || $t[$p] == 0) {
$counter = 1;
while ($counter > 0) {
$char = $_[$z++];
if ($char == '[') $counter++;
else if ($char == ']') $counter--;
}
array_pop($l);
}
break;
case ']':
$z = array_pop($l)-1;
break;
}
if($z==strlen($_)) {
if ($q) echo 'O>'.$q."\n";
die("Done\n");
}
}
for(;;){
echo ">";
$c=trim(fread(STDIN,100));
switch ($c[0]) {
case 'L':
echo str_repeat(' ', $z)."v\n".$_."\n";
break;
case 'D':
if(strlen($c) == 1)$x=$t;
else {
list($a,$b)=explode(' ',substr($c,1));
$x=array_slice($t,$a-1,$b);
}
echo implode(', ', $x)."\n";
break;
case 'S':
if(strlen($c)==1)step();
for($i=0;$i<substr($c,1);$i++)step();
echo $z."\n";
break;
case 'G':
if($c[1]=='-')$x=strlen($_)-substr($c,2);
else $x=substr($c,1);
while ($z!=$x)step();
break;
case 'P':
echo $p."\n";
default:
if(is_numeric($c)) echo $t[$c]."\n";
}
if ($q) {
echo 'O>'.$q."\n";
$q='';
}
}