Created
August 19, 2016 19:55
-
-
Save Pan-Maciek/647bf8c7930f6d33796b78cc852c6623 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.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