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));
        }