Skip to content

Instantly share code, notes, and snippets.

@do-aki
Created December 19, 2011 08:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save do-aki/1496034 to your computer and use it in GitHub Desktop.
Save do-aki/1496034 to your computer and use it in GitHub Desktop.
run Brainf*ck on PHP
<?php
if (isset($argv[1]) && file_exists($argv[1])) {
$code = file_get_contents($argv[1]);
} else {
fputs(STDERR, "no source (follow output is fizzbuzz demo)\n\n");
$code = file_get_contents(__FILE__, 0, null, __COMPILER_HALT_OFFSET__);
}
$buffer = array_pad(array(), 30, 0);
$ptr = 0;
$nest_pos = array();
$nest_level = 0;
$length = strlen($code);
$pos = 0;
while($pos < $length) {
//printf('%03d.%s|ptr:%-3d(%-3d) / nest:%-2d [%s]%s', $pos, $code[$pos], $ptr, $buffer[$ptr], $nest_level, implode(', ', $buffer), "\n");
switch($code[$pos++]) {
case '>':
++$ptr;
break;
case '<':
--$ptr;
break;
case '+':
++$buffer[$ptr];
break;
case '-':
--$buffer[$ptr];
break;
case '.':
fwrite(STDOUT, chr($buffer[$ptr]), 1);
break;
case ',':
$buffer[$ptr] = fread(STDIN, 1);
break;
case '[':
if (0 === $buffer[$ptr]) {
if ($pos < $length) {
$nest = 1;
do {
if ('[' === $code[$pos]) { ++$nest; }
elseif (']' === $code[$pos]) { --$nest; }
} while(++$pos < $length && 0 < $nest);
}
} else {
$nest_pos[$nest_level++] = $pos;
}
break;
case ']':
if (0 !== $buffer[$ptr]) {
$pos = $nest_pos[$nest_level-1];
} else {
--$nest_level;
if ($nest_level < 0) { die("error at {$pos}\n"); }
}
break;
}
}
__halt_compiler();
>++++++++++[<++++++++++>-]>>>+++>+++++<<<<<[>>>>>>>+[<<<<<+<+>>>>>>-]<<<<<[>>>>>
+<<<<<-]++++++++++<[>-<-]>>+<[>[-]<[-]]>[>>>>[-]>+<<<<<-]>>>>>[<<<<<<+<+>>>>>>>-
]<<<<<<[>>>>>>+<<<<<<-]++++++++++<[>-<-]>>+<[>[-]<[-]]>[>>>>>[-]>+<<<<<<-]>>>+<<
-[<<+<+>>>-]<<<[>>>+<<<-]>>+<[>[-]<[-]]>[>+++<<+++++++[<++++++++++>-]<.>+++++[<+
++++++>-]<.>+++[<+++++>-]<++..[-]>>>>>[-]<<<-]>>-[<<<+<+>>>>-]<<<[>>>+<<<-]>+<<[
>>[-]<<[-]]>>[>>+++++<<<++++++++[<++++++++>-]<++.>++++++[<++++++++>-]<+++.+++++.
.[-]>>>>>[-]<<<-]>>>[>>>++++++++++++++++++++++++++++++++++++++++++++++++.-------
-----------------------------------------<++++++++++++++++++++++++++++++++++++++
++++++++++.------------------------------------------------<++++++++++++++++++++
++++++++++++++++++++++++++++.------------------------------------------------<-]
<<<<++++[<+++++++++++>-]<.>+++[<---->-]<.[-]<-]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment