public Span <int> Run(int input) { var programSpan = program.AsSpan(); var instructionPointer = 0; while (true) { var opCodeText = programSpan[instructionPointer].ToString(); var paramModeRepository = ParameterModeRepository.ParseFromOpCode(opCodeText); var extractor = new ParameterExtractor(paramModeRepository); var parsedOpCode = opCodeText.Length > 1 ? int.Parse(opCodeText.Substring(opCodeText.Length - 2, 2)) : programSpan[instructionPointer]; switch (parsedOpCode) { case 1: Operation(programSpan, instructionPointer, (a, b) => a + b, extractor); instructionPointer += 4; break; case 2: Operation(programSpan, instructionPointer, (a, b) => a * b, extractor); instructionPointer += 4; break; case 3: programSpan[programSpan[instructionPointer + 1]] = input; instructionPointer += 2; break; case 4: var outputValue = extractor.GetParameterValue(programSpan, 0, instructionPointer); Console.WriteLine(outputValue); instructionPointer += 2; break; case 5: JumpToWhenTrue(programSpan, ref instructionPointer, extractor, v => v != 0); break; case 6: JumpToWhenTrue(programSpan, ref instructionPointer, extractor, v => v == 0); break; case 7: WriteTrueIfTrueAt(programSpan, ref instructionPointer, extractor, (a, b) => a < b); break; case 8: WriteTrueIfTrueAt(programSpan, ref instructionPointer, extractor, (a, b) => a == b); break; case 99: return(programSpan); } } }
public ParameterExtractor(ParameterModeRepository paramModeRepository) { this.paramModeRepository = paramModeRepository; }