Skip to content

Instantly share code, notes, and snippets.

@Pan-Maciek
Created August 19, 2016 19:55
Show Gist options
  • Save Pan-Maciek/647bf8c7930f6d33796b78cc852c6623 to your computer and use it in GitHub Desktop.
Save Pan-Maciek/647bf8c7930f6d33796b78cc852c6623 to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
namespace BrainfuckExtanded {
public enum OutputMode {
Chars,
Numbers,
NumberList
}
public class BrainfuckInterpreter {
static void help() {
Console.WriteLine("+\t|increment value");
Console.WriteLine("-\t|decrement value");
Console.WriteLine(">\t|increment the data pointer");
Console.WriteLine("<\t|decrement the data pointer");
Console.WriteLine("[code]\t|loop execute while value is not 0");
Console.WriteLine("v1?v2{v1 is greater:v2 is greater}");
Console.WriteLine("0\t|");
Console.WriteLine("1\t|");
Console.WriteLine("%\t|");
}
private OutputMode outputmode = OutputMode.Chars;
public OutputMode outputMode {
get { return outputmode; }
set {
if (value == OutputMode.NumberList)
Console.Write("[]");
outputmode = value;
}
}
string code = "";
static Random r = new Random();
public string Code => code;
List<int> values = new List<int>() { 0 };
int pointer = 0;
List<int> pointers = new List<int>();
int Pointer {
get { return pointer; }
set {
if (pointer < 0) {
pointer = 0;
return;
}
if (values.Count <= value) values.Add(0);
pointer = value;
}
}
public BrainfuckInterpreter(string str) {
code = str.Replace(" ","").Replace("\t", "");
}
public BrainfuckInterpreter(StreamReader sr) {
code = sr.ReadToEnd().Replace(" ","").Replace("\t","");
sr.Close();
sr.Dispose();
}
public void run() {
int open = 0;
for (int i = 0; i < code.Length; i++) {
switch (code[i]) {
case '+':
values[pointer]++;
break;
case '-':
values[pointer]--;
break;
case '<':
Pointer--;
break;
case '>':
Pointer++;
break;
case '[':
if (values[pointer] == 0) {
open = 1;
for (i = i + 1; i < code.Length; i++) {
if (code[i] == '[') open++;
if (code[i] == ']') open--;
if (open == 0) break;
}
}
break;
case ']':
open = 1;
i--;
for (; i > 0; i--) {
if (code[i] == ']') open++;
if (code[i] == '[') open--;
if (open == 0) {
i--;
break;
}
}
break;
case '.':
switch (outputmode) {
case OutputMode.Numbers:
Console.WriteLine($"p:{pointer}\tvalue:{values[pointer]}\t"+
$"0x{Convert.ToString(values[pointer], 16).PadLeft(8,'0')}\t"+
Convert.ToString(values[pointer],2).PadLeft(32,'0'));
break;
case OutputMode.Chars:
Console.Write((char)values[pointer]);
break;
case OutputMode.NumberList:
Console.Write($"\b,{values[pointer]}]");
break;
}
break;
case ',':
var key = Console.ReadKey(true);
if (!char.IsControl(key.KeyChar))
values[pointer] = key.KeyChar;
break;
case '?':
break;
case '0':
if (i > 0 && (code[i - 1] == '%' || code[i - 1] == '0' || code[i - 1] == '1')) {
values[pointer] = values[pointer] << 1;
} else values[pointer] = 0;
break;
case '1':
if (i > 0 && (code[i - 1] == '%' || code[i - 1] == '0' || code[i - 1] == '1')) {
values[pointer] = (values[pointer] << 1) + 1;
} else values[pointer] = 1;
break;
case '%':
if (i > 0 && code[i - 1] != '0' && code[i - 1] != '1')
values[pointer] = 0;
for (; code[i] == '%'; i++) {
values[pointer] = (values[pointer] << 1) + r.Next(0, 100) % 2;
}
i--;
break;
case '(':
break;
case ')':
break;
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment