Exemplo n.º 1
0
        public static int ResolveProgram(int[] program, Action <int> HandleOutput, Func <int> HandleInput)
        {
            var pointer                   = 0;
            var diagnosticCode            = 0;
            OpcodeInstruction instruction = null;

            do
            {
                var jump = false;
                instruction = ParseProgramInstruction(program[pointer]);

                var firstParameterMode = instruction.ModesOfParameter.Count > 0 ?
                                         instruction.ModesOfParameter[0] : ParameterMode.Positional;
                var secondParameterMode = instruction.ModesOfParameter.Count > 1 ?
                                          instruction.ModesOfParameter[1] : ParameterMode.Positional;

                switch (instruction.Opcode)
                {
                case Opcode.Addition:
                    program[program[pointer + 3]] =
                        GetParameter(program, firstParameterMode, pointer + 1) +
                        GetParameter(program, secondParameterMode, pointer + 2);
                    break;

                case Opcode.Multiplication:
                    program[program[pointer + 3]] =
                        GetParameter(program, firstParameterMode, pointer + 1) *
                        GetParameter(program, secondParameterMode, pointer + 2);
                    break;

                case Opcode.GetInput:
                    program[program[pointer + 1]] = HandleInput();
                    break;

                case Opcode.GetOutput:
                    diagnosticCode = GetParameter(program, firstParameterMode, pointer + 1);
                    HandleOutput(diagnosticCode);
                    break;

                case Opcode.JumpIfTrue:
                    if (GetParameter(program, firstParameterMode, pointer + 1) != 0)
                    {
                        pointer = GetParameter(program, secondParameterMode, pointer + 2);
                        jump    = true;
                    }
                    break;

                case Opcode.JumpIfFalse:
                    if (GetParameter(program, firstParameterMode, pointer + 1) == 0)
                    {
                        pointer = GetParameter(program, secondParameterMode, pointer + 2);
                        jump    = true;
                    }
                    break;

                case Opcode.LessThan:
                    program[program[pointer + 3]] =
                        GetParameter(program, firstParameterMode, pointer + 1) <
                        GetParameter(program, secondParameterMode, pointer + 2) ? 1 : 0;
                    break;

                case Opcode.Equals:
                    program[program[pointer + 3]] =
                        GetParameter(program, firstParameterMode, pointer + 1) ==
                        GetParameter(program, secondParameterMode, pointer + 2) ? 1 : 0;
                    break;

                case Opcode.Exit:
                    return(diagnosticCode);
                }

                if (!jump)
                {
                    pointer += GetPointerMoveAmount(instruction.Opcode);
                }
            }while (pointer < program.Length);

            return(diagnosticCode);
        }
Exemplo n.º 2
0
 public RegisterSample(RegisterValues initialValues, OpcodeInstruction opcodeInstruction, RegisterValues updatedValues)
 {
     InitialValues     = initialValues;
     OpcodeInstruction = opcodeInstruction;
     UpdatedValues     = updatedValues;
 }