private string GetMaxNumber(List <string> eveveryValidNumber) { var maxNumber = 0; foreach (var validNumber in eveveryValidNumber) { var input = (int?)0; var computerMemory1 = new CompuetrMemory(ComputerMemoryInput, Convert.ToInt32(validNumber[0].ToString())); var computerMemory2 = new CompuetrMemory(ComputerMemoryInput, Convert.ToInt32(validNumber[1].ToString())); var computerMemory3 = new CompuetrMemory(ComputerMemoryInput, Convert.ToInt32(validNumber[2].ToString())); var computerMemory4 = new CompuetrMemory(ComputerMemoryInput, Convert.ToInt32(validNumber[3].ToString())); var computerMemory5 = new CompuetrMemory(ComputerMemoryInput, Convert.ToInt32(validNumber[4].ToString())); var isValid = true; var currentInput = 0; while (isValid) { input = computerMemory1.Step(input); input = computerMemory2.Step(input); input = computerMemory3.Step(input); input = computerMemory4.Step(input); input = computerMemory5.Step(input); if (currentInput == input) { isValid = false; } else { currentInput = input.Value; } } if (input.HasValue && input > maxNumber) { maxNumber = input.Value; } else if (!input.HasValue) { break; } } return(maxNumber.ToString()); }
private int TestInputs(int programValue, ref int phaseValue, bool setPhase = true) { var computerMemory = new CompuetrMemory(ComputerMemoryInput, phaseValue); computerMemory.SetPhaseValue((setPhase) ? phaseValue : programValue); while (true) { var currentOpcode = computerMemory.GetOpcode; if (currentOpcode.Terminate) { break; } computerMemory.SetNextOpCodeLength(); computerMemory.SetSKipValue(currentOpcode); currentOpcode.parameter1Value = currentOpcode.Paramater1Mode == IntCode.ParameterMode.Position ? computerMemory.ComputerMemory[currentOpcode.parameter1InstructionValue] : currentOpcode.parameter1InstructionValue; try { currentOpcode.parameter2Value = currentOpcode.Paramater2Mode == IntCode.ParameterMode.Position ? computerMemory.ComputerMemory[currentOpcode.parameter2InstructionValue] : currentOpcode.parameter2InstructionValue; } catch (Exception ex) { var test = ex.ToString(); } currentOpcode.ExecuteOperation(); //computerMemory.Pointer = currentOpcode.Pointer; if (currentOpcode.OpCodeInstruction == OpCode.Adds || currentOpcode.OpCodeInstruction == OpCode.Multiplie) { computerMemory.ComputerMemory[currentOpcode.parameter3InstructionValue] = currentOpcode.parameter3Value; } else { if (currentOpcode.OpCodeInstruction == OpCode.Inputstuff) { computerMemory.ComputerMemory[currentOpcode.parameter1InstructionValue] = computerMemory.ProgramValue; } if (currentOpcode.OpCodeInstruction == OpCode.OutputStuff) { computerMemory.ProgramValue = computerMemory.ComputerMemory[currentOpcode.parameter1InstructionValue]; } if (currentOpcode.OpCodeInstruction == OpCode.isLessThen) { computerMemory.ComputerMemory[currentOpcode.parameter3InstructionValue] = currentOpcode.parameter3Value; } if (currentOpcode.OpCodeInstruction == OpCode.isEqual) { computerMemory.ComputerMemory[currentOpcode.parameter3InstructionValue] = currentOpcode.parameter3Value; } if (currentOpcode.OpCodeInstruction == OpCode.JumpIfTrue) { if (currentOpcode.parameter1Value != 0) { computerMemory.Pointer = currentOpcode.parameter2Value; //computerMemory.Skip = currentOpcode.parameter2Value; } } if (currentOpcode.OpCodeInstruction == OpCode.JumpIfFalse) { if (currentOpcode.parameter1Value == 0) { computerMemory.Pointer = currentOpcode.parameter2Value; //computerMemory.Skip = currentOpcode.parameter2Value; } } } } ; return(computerMemory.ProgramValue); }