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