public int[] Process(int[] input) { int[] output = input; bool halt = false; int instructionPointer = 0; while (halt == false) { IntcodeOperation op = GetOperation(instructionPointer, output); if (op.opcode == IntcodeOperation.HALT) { halt = true; } else { IntcodeOperationResult result = ProcessOperation(op); output.SetValue(result.value, result.outputIndex); } instructionPointer += 4; } return(output); }
IntcodeOperationResult ProcessOperation(IntcodeOperation operation) { int value = 0; switch (operation.opcode) { case IntcodeOperation.ADD: value = operation.args[0] + operation.args[1]; break; case IntcodeOperation.MUL: value = operation.args[0] * operation.args[1]; break; default: throw new Exception("Ran into unmapped opcode: " + operation.opcode.ToString()); } return(new IntcodeOperationResult(value, operation.outputIndex)); }