public AmplifierLoop(IList <int[]> programs, IList <int> phaseSetting, int initialValue, bool createFeedback) { AmplifierCount = programs.Count; _computers = new IntCodeComputer[AmplifierCount]; for (int i = 0; i < programs.Count; i++) { var computer = new IntCodeComputer(); computer.Program = programs[i].Clone() as int[]; computer.ComputerName = $"Amplifier-{char.ConvertFromUtf32('A' + i)}"; _computers[i] = computer; } if (createFeedback) { var link = new OneWayComputerLink(_computers[programs.Count - 1], _computers[0]); link.LinkedCollection.Add(phaseSetting[0]); link.LinkedCollection.Add(initialValue); _links.Add(link); } else { _computers[0].InputProvider = new IntInputProvider(new[] { phaseSetting[0], initialValue }); } for (int i = 1; i < programs.Count; i++) { var link = new OneWayComputerLink(_computers[i - 1], _computers[i]); link.LinkedCollection.Add(phaseSetting[i]); _links.Add(link); } }
public int ExecuteSequential(IList <int> phaseSetting, int initialValue) { _computers[0].InputProvider = new IntInputProvider(new[] { phaseSetting[0], initialValue }); for (int i = 1; i < phaseSetting.Count; i++) { var link = new OneWayComputerLink(_computers[i - 1], _computers[i]); link.LinkedCollection.Add(phaseSetting[i]); _links.Add(link); } for (int i = 0; i < phaseSetting.Count; i++) { var amplifier = _computers[i]; amplifier.ExecuteProgram(); } return(_computers.Last().ResultSink.OutputQueue.Dequeue()); }