コード例 #1
0
        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) =>
コード例 #2
0
        public IntCodeShell(IEnumerable <long> program, TextReader reader, TextWriter writer)
        {
            _intCode = new IntCodeAsync(
                program,
                Read,
                Write);

            _reader = reader;
            _writer = writer;
        }
コード例 #3
0
        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();
        }