private Instruction GetComboInstruction(CharReader cr) { var newInstruction = new Instruction(InstructionType.Combo); while (cr.HasCharacters()) { var c = cr.GetChar(); if (c == '[' || c == ']' || c == '.' || c == ',') { break; } if (c == '+') { newInstruction.Add(); } if (c == '-') { newInstruction.Subtract(); } if (c == '<') { newInstruction.ShiftLeft(); } if (c == '>') { newInstruction.ShiftRight(); } cr.Forward(); } cr.Back(); newInstruction.Complete(); return(newInstruction); }
public void Run(FileStream source) { var pointer = 0; var memory = new byte[1024 * 1024]; var cr = new CharReader(source); _seriesCache = new byte[cr.Length]; var jumpTable = new Stack <int>(); while (cr.HasCharacters()) { var c = cr.GetChar(); switch (c) { case '>': pointer++; break; case '<': pointer--; break; case '+': memory[pointer] += GetSumFromSeries(cr, '+'); break; case '-': memory[pointer] -= GetSumFromSeries(cr, '-'); break; case '.': Console.Write((char)memory[pointer]); break; case ',': var newChar = Console.Read(); memory[pointer] = (byte)newChar; break; case '[': var nesting = 0; if (memory[pointer] == 0) { while (cr.HasCharacters()) { cr.Forward(); var tempChar = cr.GetChar(); if (tempChar == ']' && nesting == 0) { break; } if (tempChar == '[') { nesting++; } if (tempChar == ']') { nesting--; } } } else { jumpTable.Push(cr.Position); } break; case ']': nesting = 0; if (memory[pointer] != 0) { cr.Position = jumpTable.Peek(); } else { jumpTable.Pop(); } break; } cr.Forward(); } Console.WriteLine("Cache hits: " + _cacheHits); Console.WriteLine("Cache misses: " + (_hits - _cacheHits)); }
public void Run(FileStream source) { var pointer = 0; var memory = new byte[1024 * 1024]; var cr = new CharReader(source); _jumpTableForward = new int[cr.Length]; var jumpTable = new Stack <int>(); while (cr.HasCharacters()) { var c = cr.GetChar(); switch (c) { case '>': pointer++; break; case '<': pointer--; break; case '+': memory[pointer]++; break; case '-': memory[pointer]--; break; case '.': Console.Write((char)memory[pointer]); break; case ',': var newChar = Console.Read(); memory[pointer] = (byte)newChar; break; case '[': var nesting = 0; if (memory[pointer] == 0) { var startPosition = cr.Position; if (_jumpTableForward[startPosition] > 0) { cr.Position = _jumpTableForward[startPosition] - 1; } else { while (cr.HasCharacters()) { cr.Forward(); var tempChar = cr.GetChar(); if (tempChar == ']' && nesting == 0) { _jumpTableForward[startPosition] = cr.Position + 1; break; } if (tempChar == '[') { nesting++; } if (tempChar == ']') { nesting--; } } } } else { jumpTable.Push(cr.Position); } break; case ']': nesting = 0; if (memory[pointer] != 0) { cr.Position = jumpTable.Peek(); } else { jumpTable.Pop(); } break; } cr.Forward(); } }
public void Run(FileStream source) { var pointer = 0; var memory = new byte[1024 * 1024]; var cr = new CharReader(source); while (cr.HasCharacters()) { var c = cr.GetChar(); switch (c) { case '>': pointer++; break; case '<': pointer--; break; case '+': memory[pointer]++; break; case '-': memory[pointer]--; break; case '.': Console.Write((char)memory[pointer]); break; case ',': var newChar = Console.Read(); memory[pointer] = (byte)newChar; break; case '[': var nesting = 0; if (memory[pointer] == 0) { while (cr.HasCharacters()) { cr.Forward(); var tempChar = cr.GetChar(); if (tempChar == ']' && nesting == 0) { break; } if (tempChar == '[') { nesting++; } if (tempChar == ']') { nesting--; } } } break; case ']': nesting = 0; if (memory[pointer] != 0) { while (true) { cr.Back(); var tempChar = cr.GetChar(); if (tempChar == '[' && nesting == 0) { cr.GetChar(); break; } if (tempChar == ']') { nesting++; } if (tempChar == '[') { nesting--; } } } break; } cr.Forward(); } }