private int GetOutputToThrustersWithFeedback(string phases) { var inputChannels = new List <InputChannel>(); var outputChannels = new List <IOutputChannel>(); var firstInputChannel = new InputChannel(); var max = 5; for (var i = 0; i < max; i++) { firstInputChannel.QueueInput(int.Parse(phases.Substring(i, 1))); if (i == 0) { firstInputChannel.QueueInput(0); } var secondInputChannel = new InputChannel(); var outputChannel = new LinkedOutputChannel(i == max - 1 ? inputChannels[0] : secondInputChannel); inputChannels.Add(firstInputChannel); outputChannels.Add(outputChannel); firstInputChannel = secondInputChannel; } var tasks = new List <Task>(); for (var j = 0; j < max; j++) { var input = inputChannels[j]; var output = outputChannels[j]; var t = Task.Run(() => { var computer = new OpCodeComputer.OpCodeComputer(input, output); computer.ProcessInstructions(Program); }); tasks.Add(t); } Task.WaitAll(Task.WhenAll(tasks)); return((int)inputChannels.First().GetNext()); }
private int GetOutputToThrusters(string phases) { var output = new ThrusterOutput(0); var outputChannel = new OutputChannel(output); var inputChannel = new InputChannel(); var computer = new OpCodeComputer.OpCodeComputer(inputChannel, outputChannel); for (var i = 0; i < 5; i++) { var pj = phases[i]; inputChannel.QueueInput(int.Parse(phases.Substring(i, 1))); inputChannel.QueueInput(output.Value); computer.ProcessInstructions(Program); } return((int)output.Value); }
public LinkedOutputChannel(InputChannel input) { _input = input; }