public string getUpdatedIntCode(string intCodeFromConsole, string inp) { int userInput = int.Parse(inp); int output = 0; List <int> instructionParams; List <int> IntCode = getIntCode(); int nextInstructionStartPoint = 0; string nextInstruction; int operationCode; while (nextInstructionStartPoint < IntCode.Count) { nextInstruction = getNextInstruction(); operationCode = int.Parse(nextInstruction.Substring(3, 2)); if (operationCode == 99) { break; } int digitsQnty = getNextInstructionDigitsQuantity(); instructionParams = IntCode.GetRange(nextInstructionStartPoint, digitsQnty); nextInstructionStartPoint += digitsQnty; int p1 = getParameterOneDependingOnMode(); int p2 = instructionParams.Count > 2 ? getParameterTwoDependingOnMode() : 0; int p3 = instructionParams.Count > 3 ? instructionParams[3] : 0; switch (OpCodes[operationCode - 1]) { case "opCodeRequires__InputAtP3sumOfP1nP2": IntCode[p3] = p1 + p2; break; case "opCodeRequires__InputAtP3productOfP1nP2": IntCode[p3] = p1 * p2; break; case "opCodeRequires__InputAtPosition": IntCode[instructionParams[1]] = userInput; break; case "opCodeRequires__DisclosingOutput": output = IntCode[instructionParams[1]]; Console.WriteLine("output - " + output); break; case "opCodeRequires__JumpIf_P1isNotZero": if (p1 > 0) { nextInstructionStartPoint = p2; } break; case "opCodeRequires__JumpIf_P1isZero": if (p1 == 0) { nextInstructionStartPoint = p2; } break; case "ifP1lessThanP2storeOneElseZeroAtP3": if (p1 < p2) { IntCode[p3] = 1; } else { IntCode[p3] = 0; } break; case "ifP1equalsP2storeOneElseZeroAtP3": if (p1 == p2) { IntCode[p3] = 1; } else { IntCode[p3] = 0; } break; default: Console.WriteLine("Something wrong !"); break; } } return(output.ToString()); // local (in function) functions List <int> getIntCode() { return(intCodeFromConsole.Length > 2 ? intCodeFromConsole.Split(",").Select(int.Parse).ToList() : RawData.dataForAdvent5()); } string getNextInstruction() { string abcde = IntCode[nextInstructionStartPoint].ToString(); return("00000".Substring(abcde.Length) + abcde); } int getNextInstructionDigitsQuantity() { return((operationCode == 3 || operationCode == 4) ? 2 : ((operationCode == 5 || operationCode == 6) ? 3 : Math.Min(4, IntCode.Count - nextInstructionStartPoint))); } int getParameterOneDependingOnMode() { string p1mode = nextInstruction.Substring(2, 1); return(p1mode == "1" ? instructionParams[1] : IntCode[instructionParams[1]]); } int getParameterTwoDependingOnMode() { string p2mode = nextInstruction.Substring(1, 1); return(p2mode == "1" ? instructionParams[2] : IntCode[instructionParams[2]]); } }