Skip to content

Instantly share code, notes, and snippets.

@GuyInGrey
Last active December 7, 2019 18:04
Show Gist options
  • Save GuyInGrey/4368bada28e197c70a0e8d12fe672ecb to your computer and use it in GitHub Desktop.
Save GuyInGrey/4368bada28e197c70a0e8d12fe672ecb to your computer and use it in GitHub Desktop.
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