/* braindrain.d purpose: Brainfuck'a'like outputgenerator It isn't like the original brainfuck, because the implementation of ',' for getting a char from stdin isn't there... compile with dmd braindrain.d testet with dmd v1.014 on WinXP Usageexample: $ braindrain "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++." It should print "Hello" then. Possible improvements, if I have sparetime: none, 'cause my brain hurts now. If you want to improve this: Try to add the ',' from bf and the possiblility to load files to have fun, instead of using a command line parameter. Have fun, Gregor Kopp (gekkonier) */ import std.stdio; class Stack(T) { private T[] data; private T lastone; public void push(T element) { data.length = this.size + 1; data[this.size - 1] = element; } public T pop() { if (this.size > 0) { lastone = this.last; data.length = this.size - 1; return lastone; } else assert(0); } public int size() { return data.length; } public T last() { return data[this.size - 1]; } } int main(char[][] args) { char[300_000] cells; for ( int i = 0; i < 300_000; i++ ) { cells[i] += 1; } int position, kommandoindex = 0; Stack!(char) klammernstack = new Stack!(char); char[] kommandos; try { kommandos = args[1]; } catch { writefln("No Args? Try this out:"); writefln("braindrain \"++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.\""); writefln("It should print 'Hello'"); } while (kommandoindex < kommandos.length) { switch (kommandos[kommandoindex]) { case '>': position += 1; break; case '<': position -= 1; break; case '+': cells[position] += 1; break; case '-': cells[position] -= 1; break; case '.': writef(cells[position]); break; case '[': klammernstack.push(kommandoindex); if (cells[position] == 0) { while (kommandos[kommandoindex] != '?') { kommandoindex += 1; } } break; case ']': if (cells[position] != 0) { kommandoindex = klammernstack.last; } else { klammernstack.pop; } break; } kommandoindex += 1; } return 0; }