public void ProcessMemory() { while (InstructionPointer < Memory.Length) { var optCode = (OptCode)(Memory[InstructionPointer] % 100); switch (optCode) { case OptCode.Add: Memory[Memory[InstructionPointer + 3]] = GetParameter(1) + GetParameter(2); MoveToNextPointer(); break; case OptCode.Multiply: Memory[Memory[InstructionPointer + 3]] = GetParameter(1) * GetParameter(2); MoveToNextPointer(); break; case OptCode.Input: Memory[Memory[InstructionPointer + 1]] = ProgramId; MoveToNextPointer(2); break; case OptCode.Output: OutputResults.Add(GetParameter(1)); MoveToNextPointer(2); break; case OptCode.JumpIfTrue: if (GetParameter(1) != 0) { InstructionPointer = GetParameter(2); } else { MoveToNextPointer(3); } break; case OptCode.JumpIfFalse: if (GetParameter(1) == 0) { InstructionPointer = GetParameter(2); } else { MoveToNextPointer(3); } break; case OptCode.LessThan: Memory[Memory[InstructionPointer + 3]] = GetParameter(1) < GetParameter(2) ? 1 : 0; MoveToNextPointer(); break; case OptCode.Equals: Memory[Memory[InstructionPointer + 3]] = GetParameter(1) == GetParameter(2) ? 1 : 0; MoveToNextPointer(); break; case OptCode.Halt: Console.WriteLine($"OptCode 99 at position {InstructionPointer}. Halting..."); Processed = true; return; default: Console.WriteLine($"Invalid Opt Code at position {InstructionPointer} of {optCode}"); Processed = true; return; } } }