private long RunAmplifiersWithFeedback(IEnumerable <long> code, IEnumerable <int> phaseSettings) { IntCodeAsync[] amplifiers = new IntCodeAsync[5]; AsyncQueue <long>[] ports = new AsyncQueue <long> [5]; int i = 0; for (i = 0; i < 5; i++) { amplifiers[i] = new IntCodeAsync(code); ports[i] = new AsyncQueue <long>(); } i = 0; foreach (int phaseSetting in phaseSettings) { ports[i++].Enqueue(phaseSetting); } ports[0].Enqueue(0); for (i = 0; i < amplifiers.Length; i++) { amplifiers[i].Reader = ports[i].Dequeue; } for (i = 0; i < amplifiers.Length - 1; i++) { amplifiers[i].Writer = ports[i + 1].Enqueue; } long answer = 0; amplifiers[^ 1].Writer = (value) =>
public IntCodeShell(IEnumerable <long> program, TextReader reader, TextWriter writer) { _intCode = new IntCodeAsync( program, Read, Write); _reader = reader; _writer = writer; }
public Day15() { AsyncQueue <long> programInputs = new AsyncQueue <long>(); AsyncQueue <long> programOutputs = new AsyncQueue <long>(); IntCodeAsync intCode = new IntCodeAsync(_program, programInputs.Dequeue, programOutputs.Enqueue); Task vm = Task.Run(intCode.RunAsync); Task <long> sendCommand(Direction d) { programInputs.Enqueue((long)d + 1); return(programOutputs.Dequeue()); } async Task backtrackHelper(IntVec2 position) { foreach (Direction d in s_directions) { IntVec2 candidatePosition = position + s_deltas[(int)d]; if (!_map.ContainsKey(candidatePosition)) { Status status = (Status) await sendCommand(d); if (status != Status.Wall) { _map.Add(candidatePosition, status); if (status == Status.Oxygen) { _oxygen = candidatePosition; } await backtrackHelper(candidatePosition); await sendCommand(s_opposites[(int)d]); } } } } Task.Run(() => backtrackHelper(IntVec2.Zero)).Wait(); }