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