/// <summary> /// Runs the provided Brainfuck code. /// </summary> /// <param name="code"> /// The code to run. /// </param> /// <param name="stdin"> /// Optional. The input stream. Console is used if not specified. /// </param> /// <param name="stdout"> /// Optional. The ouput stream. Console is used if not specified. /// </param> public static void Run(string code, Stream stdin = null, Stream stdout = null) { Tape tape = new Tape(); char[] program = code.ToCharArray(); int brackets = 0; int codePointer = 0; if (stdin == null) stdin = Console.OpenStandardInput(); if (stdout == null) stdout = Console.OpenStandardOutput(); while (codePointer >= 0 && codePointer < program.Length) { switch (program[codePointer]) { case '+': tape.Cell++; codePointer++; break; case '-': tape.Cell--; codePointer++; break; case '>': tape.MoveRight(); codePointer++; break; case '<': tape.MoveLeft(); codePointer++; break; case '[': if (tape.Cell == 0) { brackets++; while (brackets != 0 && ++codePointer < program.Length) { if (program[codePointer] == '[') brackets++; else if (program[codePointer] == ']') brackets--; } codePointer++; break; } codePointer++; break; case ']': brackets++; while (brackets != 0 && --codePointer >= 0) { if (program[codePointer] == ']') brackets++; else if (program[codePointer] == '[') brackets--; } break; case '.': stdout.WriteByte((byte)tape.Cell); codePointer++; break; case ',': tape.Cell = stdin.ReadByte(); codePointer++; break; default: codePointer++; break; } } }