/* * brainfuck interpretor for JavaScript console environment. * Copyright (C) 2009 by Kunihiko IMAI * All rights reserved. * You can use, modify or redistribute this program under GPLv2. */ function brainfuck ( src, input ) { var pc = 0; // program counter var output = ''; // output var tape = [0]; // tape var head = 0; // tape head pointer for (;;) { var inst = src.charAt(pc++); if ( src.length <= pc ) return output; switch ( inst ) { case '>': if ( !tape[++head] ) tape[head] = 0; break; case '<': if ( --head < 0 ) { print ( "head ran out.\n" ); return ''; } break; case '+': tape[head] = ( tape[head] + 1 ) % 256; break; case '-': tape[head] = ( tape[head] + 255 ) % 256; break; case '.': output += String.fromCharCode ( tape[head] ); break; case ',': if ( input.length <= 0 ) { print ( "input ran out.\n" ); return ''; } tape[head] = String.charCodeAt ( input.charAt( 0 ) ); input = input.slice( 1 ); break; case '[': if ( ! tape[head] ) { var lv = 1; for ( ; pc < src.length ; ++pc ) { switch ( src.charAt(pc) ) { case '[': ++lv; break; case ']': --lv; break; default: break; } if ( !lv ) break; } if ( lv ) { print ( "[] level mismatch. program ran out.\n" ); return ''; } ++pc; } break; case ']': if ( tape[head] ) { var lv = 1; for ( pc -= 2; pc >= 0; --pc ) { switch ( src.charAt(pc) ) { case '[': --lv; break; case ']': ++lv; break; default: break; } if ( !lv ) break; } if ( lv ) { print ( "[] level mismatch. program ran out.\n" ); return ''; } ++pc; } break; default: print ( "invalid instruction at PC = ", pc, "\n" ); return ''; } } return output; } /* * main routine */ /* * This is 'hello,world' of brainfuck. * Cited from Wikipedia Japanese: * http://ja.wikipedia.org/wiki/Hello_world%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E4%B8%80%E8%A6%A7 */ output = brainfuck ( '+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.--------.+++.------.--------.>+.', '' ); print ( output, "\n" );