Last active
December 7, 2019 18:04
-
-
Save GuyInGrey/4368bada28e197c70a0e8d12fe672ecb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Diagnostics; | |
using System.IO; | |
namespace Brain | |
{ | |
class Program | |
{ | |
public static void Main() | |
{ | |
Console.Title = "BrainF Interpreter"; | |
start:; | |
var programList = Directory.GetFiles("Programs\\"); | |
for (var i = 0; i < programList.Length; i++) | |
{ | |
Console.WriteLine("[" + i + "] " + Path.GetFileNameWithoutExtension(programList[i])); | |
} | |
Console.Title = "BrainF Interpreter (WAITING FOR INPUT)"; | |
var input = Console.ReadLine(); | |
Console.Title = "BrainF Interpreter"; | |
var program = File.ReadAllText(programList[int.Parse(input)]).ToCharArray(); | |
var memory = new int[65536]; // 2^16 bytes of memory | |
var pointer = 0; | |
var memoryPointer = 0; | |
var instructionCount = 0; | |
var timing = Stopwatch.StartNew(); | |
while (pointer < program.Length) | |
{ | |
var op = program[pointer]; | |
switch (op) | |
{ | |
case ('+'): memory[memoryPointer]++; break; | |
case ('-'): memory[memoryPointer]--; break; | |
case ('.'): Console.Write((char)memory[memoryPointer]); break; | |
case (','): | |
Console.Title = "BrainF Interpreter (WAITING FOR INPUT)"; | |
memory[memoryPointer] = Console.ReadKey().KeyChar; | |
Console.Title = "BrainF Interpreter"; | |
break; | |
case ('>'): memoryPointer++; break; | |
case ('<'): memoryPointer--; break; | |
case ('['): | |
if (memory[memoryPointer] == 0) | |
{ | |
var depth = 1; | |
do | |
{ | |
pointer++; | |
depth = program[pointer] == ']' ? depth - 1 : | |
program[pointer] == '[' ? depth + 1 : depth; | |
} while (depth != 0); | |
} | |
break; | |
case (']'): | |
if (memory[memoryPointer] != 0) | |
{ | |
var depth = -1; | |
do | |
{ | |
pointer--; | |
depth = program[pointer] == ']' ? depth - 1 : | |
program[pointer] == '[' ? depth + 1 : depth; | |
} while (depth != 0); | |
} | |
break; | |
} | |
pointer++; | |
instructionCount++; | |
if (memory[memoryPointer] < 0) { memory[memoryPointer] = 255; } | |
if (memory[memoryPointer] > 255) { memory[memoryPointer] = 0; } | |
} | |
timing.Stop(); | |
Console.WriteLine("Program finished. Took " + timing.ElapsedMilliseconds + " ms. " + instructionCount + " instructions ran."); | |
goto start; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment