Beispiel #1
0
        private static long HandleAdjustRelativeBaseCommand(IIntCodeMemory workingMemory, long relativeBase, long programPosition, InstructionMode modeParam1)
        {
            long input1 = workingMemory[programPosition + 1];
            long value1 = GetValueForInput(workingMemory, relativeBase, modeParam1, input1);

            relativeBase += value1;
            return(relativeBase);
        }
Beispiel #2
0
 private static long GetValueForInput(IIntCodeMemory workingMemory, long relativeBase, InstructionMode modeParam, long input)
 {
     return(modeParam switch
     {
         InstructionMode.PositionMode => workingMemory[input],
         InstructionMode.ImmediateMode => input,
         InstructionMode.RelativeMode => workingMemory[relativeBase + input],
         _ => throw new Exception("Unexpected instruction mode"),
     });
Beispiel #3
0
        private static void HandleInputCommand(Func <long>?input, IIntCodeMemory workingMemory, long relativeBase, long programPosition, InstructionMode modeParam1)
        {
            if (input == null)
            {
                throw new Exception("Program is expecting Input to be wired up");
            }

            long input1 = workingMemory[programPosition + 1];

            WriteResultToWorkingMemory(input(), workingMemory, relativeBase, modeParam1, input1);
        }
Beispiel #4
0
        private static void HandleOutputCommand(Action <long>?output, IIntCodeMemory workingMemory, long relativeBase, long programPosition, InstructionMode modeParam1)
        {
            long input1 = workingMemory[programPosition + 1];
            long param1 = GetValueForInput(workingMemory, relativeBase, modeParam1, input1);

            if (output == null)
            {
                throw new Exception("Program is expecting Output to be wired up");
            }

            output(param1);
        }
Beispiel #5
0
        private static void HandleJumpCommands(IIntCodeMemory workingMemory, ref int sizeOfInstruction, long relativeBase, ref long programPosition, IntInstruction instruction, InstructionMode modeParam1, InstructionMode modeParam2)
        {
            long input1 = workingMemory[programPosition + 1];
            long param1 = GetValueForInput(workingMemory, relativeBase, modeParam1, input1);

            long input2 = workingMemory[programPosition + 2];
            long param2 = GetValueForInput(workingMemory, relativeBase, modeParam2, input2);

            if ((instruction == IntInstruction.JumpIfTrue && (param1 != 0)) ||
                (instruction == IntInstruction.JumpIfFalse && (param1 == 0)))
            {
                programPosition   = param2;
                sizeOfInstruction = 0;
            }
        }
Beispiel #6
0
        private static void HandleAdditionOrMultiplicationCommands(IIntCodeMemory workingMemory, long programPosition, long relativeBase, IntInstruction instruction, InstructionMode modeParam1, InstructionMode modeParam2, InstructionMode modeParam3)
        {
            long input1 = workingMemory[programPosition + 1];
            long value1 = GetValueForInput(workingMemory, relativeBase, modeParam1, input1);

            long input2 = workingMemory[programPosition + 2];
            long value2 = GetValueForInput(workingMemory, relativeBase, modeParam2, input2);

            long input3 = workingMemory[programPosition + 3];

            long result = instruction switch
            {
                IntInstruction.Add => value1 + value2,
                IntInstruction.Multiply => value1 * value2,
                _ => throw new Exception("Unrecognized IntInstruction"),
            };

            WriteResultToWorkingMemory(result, workingMemory, relativeBase, modeParam3, input3);
        }
Beispiel #7
0
        private static void HandleComparisonCommands(IIntCodeMemory workingMemory, long relativeBase, long programPosition, IntInstruction instruction, InstructionMode modeParam1, InstructionMode modeParam2, InstructionMode modeParam3)
        {
            long input1 = workingMemory[programPosition + 1];
            long value1 = GetValueForInput(workingMemory, relativeBase, modeParam1, input1);

            long input2 = workingMemory[programPosition + 2];
            long value2 = GetValueForInput(workingMemory, relativeBase, modeParam2, input2);

            long input3 = workingMemory[programPosition + 3];

            var result = instruction switch
            {
                IntInstruction.LessThan => value1 < value2 ? 1 : 0,
                IntInstruction.Equals => value1 == value2 ? 1 : 0,
                _ => throw new Exception("Unexpected instruction")
            };

            WriteResultToWorkingMemory(result, workingMemory, relativeBase, modeParam3, input3);
        }