示例#1
0
    public async Task <BigInteger> Part2()
    {
        var results = new List <BigInteger>();

        foreach (var setting in new[] { 5, 6, 7, 8, 9 }.Permutations())
        {
            var channel  = Channel.CreateUnbounded <BigInteger>();
            var feedback = channel;
            var intcodes = new List <Task>();

            for (int i = 0, count = setting.Count(); i < count; i++)
            {
                await channel.Writer.WriteAsync(setting.ElementAt(i));

                var input = channel.Reader;
                channel = Channel.CreateUnbounded <BigInteger>();
                var output  = (i == count - 1) ? feedback.Writer : channel.Writer;
                var intcode = new IntcodeComputer(_input.ToArray())
                {
                    Input  = () => input.ReadAsync().AsTask(),
                    Output = value => output.WriteAsync(value).AsTask(),
                };
                intcodes.Add(intcode.RunAsync());
            }

            await feedback.Writer.WriteAsync(0);

            await Task.WhenAll(intcodes);

            results.Add(await feedback.Reader.ReadAsync());
        }

        return(results.Max());
    }
示例#2
0
    private async Task <bool> ScanAsync(int x, int y)
    {
        Debug.Assert(x >= 0);
        Debug.Assert(y >= 0);

        var first  = true;
        var output = 0;

        var intcode = new IntcodeComputer(_input.ToArray())
        {
            Input = () =>
            {
                if (first)
                {
                    first = false;
                    return(Task.FromResult <BigInteger>(x));
                }
                else
                {
                    return(Task.FromResult <BigInteger>(y));
                }
            },
            Output = value =>
            {
                output = (int)value;

                return(Task.CompletedTask);
            },
        };
        await intcode.RunAsync();

        return(output == 1);
    }
示例#3
0
    public async Task AddressingMode()
    {
        var intcode = new IntcodeComputer(new BigInteger[] { 1002, 4, 3, 4, 33 });
        await intcode.RunAsync();

        Assert.AreEqual(99, intcode.Get(4));
    }
示例#4
0
    private async Task <BigInteger> RunScriptAsync(string[] lines, bool debug = false)
    {
        var input   = new Queue <BigInteger>();
        var output  = new List <BigInteger>();
        var intcode = new IntcodeComputer(_input)
        {
            Input  = () => Task.FromResult(input.Dequeue()),
            Output = value => { output.Add(value); return(Task.CompletedTask); },
        };

        foreach (var line in lines)
        {
            foreach (var c in Encoding.ASCII.GetBytes(line))
            {
                input.Enqueue(c);
            }

            input.Enqueue((byte)'\n');
        }

        await intcode.RunAsync();

        if (debug)
        {
            foreach (var c in output)
            {
                Console.Write((char)c);
            }
        }

        return(output[^ 1]);
示例#5
0
    public async Task <BigInteger> Part1()
    {
        var results = new List <BigInteger>();

        foreach (var setting in new[] { 0, 1, 2, 3, 4 }.Permutations())
        {
            var stack = new Stack <BigInteger>();
            stack.Push(0);

            for (int i = 0, count = setting.Count(); i < count; i++)
            {
                stack.Push(setting.ElementAt(i));

                var intcode = new IntcodeComputer(_input.ToArray())
                {
                    Input  = () => Task.FromResult(stack.Pop()),
                    Output = value => { stack.Push(value); return(Task.CompletedTask); },
                };

                await intcode.RunAsync();
            }

            results.Add(stack.Peek());
        }

        return(results.Max());
    }
示例#6
0
    public async Task Computer(string memory, int address, int expected)
    {
        var intcode = new IntcodeComputer(memory);
        await intcode.RunAsync();

        Assert.AreEqual(expected, intcode.Get(address));
    }
示例#7
0
    public async Task <BigInteger> Part1()
    {
        var intcode = new IntcodeComputer(_input);

        intcode.Set(1, 12);
        intcode.Set(2, 2);
        await intcode.RunAsync();

        return(intcode.Get(0));
    }
示例#8
0
    public async Task <BigInteger> Part1()
    {
        var outputs = new List <BigInteger>();
        var intcode = new IntcodeComputer(_input)
        {
            Input  = () => Task.FromResult((BigInteger)1),
            Output = value => { outputs.Add(value); return(Task.CompletedTask); },
        };
        await intcode.RunAsync();

        return(outputs[^ 1]);
示例#9
0
    public async Task AddressingModeAndBigInteger(string memory, string expected)
    {
        var results = new List <BigInteger>();
        var intcode = new IntcodeComputer(memory)
        {
            Output = value => { results.Add(value); return(Task.CompletedTask); },
        };
        await intcode.RunAsync();

        Assert.AreEqual(expected, String.Join(',', results));
    }
示例#10
0
    public async Task InputOutput()
    {
        BigInteger result  = -1;
        var        intcode = new IntcodeComputer(new BigInteger[] { 3, 0, 4, 0, 99 })
        {
            Input  = () => Task.FromResult((BigInteger)42),
            Output = value => { result = value; return(Task.CompletedTask); },
        };
        await intcode.RunAsync();

        Assert.AreEqual(42, result);
    }
示例#11
0
    public async Task ConditionalJumps(string memory, int input, int expected)
    {
        BigInteger result  = -1;
        var        intcode = new IntcodeComputer(memory)
        {
            Input  = () => Task.FromResult((BigInteger)input),
            Output = value => { result = value; return(Task.CompletedTask); },
        };
        await intcode.RunAsync();

        Assert.AreEqual(expected, result);
    }
示例#12
0
    public async Task <int> Part1()
    {
        var signal  = new SemaphoreSlim(0);
        var input   = Channel.CreateUnbounded <BigInteger>();
        var output  = new List <char>();
        var intcode = new IntcodeComputer(_input)
        {
            Input  = () => input.Reader.ReadAsync().AsTask(),
            Output = value => { output.Add((char)value); return(Task.CompletedTask); },
        };

        var commands = new[]
        {
            "east",
            "take whirled peas",
            "north",
            "west",
            "south",
            "take antenna",
            "north",
            "east",
            "south",
            "east",
            "north",
            "take prime number",
            "south",
            "west",
            "west",
            "north",
            "take fixed point",
            "north",
            "east",
            "south",
        };

        foreach (var command in commands)
        {
            foreach (var c in Encoding.ASCII.GetBytes(command))
            {
                input.Writer.TryWrite(c);
            }

            input.Writer.TryWrite('\n');
        }

        await intcode.RunAsync();

        return(Int32.Parse(Regex.Match(new string(output.ToArray()), @"(\d{7})").Value));
    }
示例#13
0
    public async Task <int> Part1()
    {
        var outputs = new List <int>();
        var intcode = new IntcodeComputer(_input)
        {
            Output = value => { outputs.Add((int)value); return(Task.CompletedTask); }
        };
        await intcode.RunAsync();

        return(outputs
               .Select((o, i) => (o, i))
               .GroupBy(v => v.i % 3)
               .First(g => g.Key == 2)
               .Count(v => v.o == 2));
    }
示例#14
0
    public async Task <BigInteger> Part2()
    {
        var(map, bot) = await GetMapAsync();

        var dir = bot.dir;

        var cardinal = PathToEnd(map, bot.pos)
                       .GroupWhile((prev, item) => prev == item)
                       .Select(steps => (dir: steps.First(), num: steps.Count()));
        var relative = new List <(char, int)>();

        foreach (var step in cardinal)
        {
            relative.Add((ToRelative(dir, step.dir), step.num));
            dir = step.dir;
        }

        var(main, a, b, c) = GetRoutines(relative);
        var input   = Channel.CreateUnbounded <BigInteger>();
        var output  = default(BigInteger);
        var intcode = new IntcodeComputer(_input)
        {
            Input  = () => input.Reader.ReadAsync().AsTask(),
            Output = value => { output = value; return(Task.CompletedTask); },
        };

        await InputAsync(main);
        await InputAsync(a);
        await InputAsync(b);
        await InputAsync(c);
        await InputAsync("n");

        intcode.Set(0, 2);
        await intcode.RunAsync();

        return(output);

        async Task InputAsync(string value)
        {
            foreach (var c in Encoding.ASCII.GetBytes(value))
            {
                await input.Writer.WriteAsync(c);
            }

            await input.Writer.WriteAsync('\n');
        }
    }
示例#15
0
    public async Task LargeExample(int input, int expected)
    {
        var memory = new BigInteger[]
        {
            3, 21, 1008, 21, 8, 20, 1005, 20, 22, 107, 8, 21, 20, 1006, 20, 31, 1106, 0, 36, 98, 0, 0, 1002, 21,
            125, 20, 4, 20, 1105, 1, 46, 104, 999, 1105, 1, 46, 1101, 1000, 1, 20, 4, 20, 1105, 1, 46, 98, 99,
        };

        BigInteger result  = -1;
        var        intcode = new IntcodeComputer(memory)
        {
            Input  = () => Task.FromResult((BigInteger)input),
            Output = value => { result = value; return(Task.CompletedTask); },
        };
        await intcode.RunAsync();

        Assert.AreEqual(expected, result);
    }
示例#16
0
    public async Task <int> Part2()
    {
        for (int noun = 0; noun < 100; noun++)
        {
            for (int verb = 0; verb < 100; verb++)
            {
                var intcode = new IntcodeComputer(_input);
                intcode.Set(1, noun);
                intcode.Set(2, verb);
                await intcode.RunAsync();

                if (intcode.Get(0) == 19690720)
                {
                    return((noun * 100) + verb);
                }
            }
        }

        throw new Exception("not found");
    }
示例#17
0
    public async Task <int> Part2()
    {
        var score   = 0;
        var input   = Channel.CreateUnbounded <BigInteger>();
        var output  = Channel.CreateUnbounded <BigInteger>();
        var intcode = new IntcodeComputer(_input)
        {
            Input  = () => input.Reader.ReadAsync().AsTask(),
            Output = value => output.Writer.WriteAsync(value).AsTask(),
        };

        intcode.Set(0, 2);

        await Task.WhenAll(new[]
        {
            Task.Run(async() =>
            {
                await intcode.RunAsync();
                output.Writer.Complete();
            }),
            Task.Run(async() =>
            {
                int?bx = null;
                int?px = null;

                while (await output.Reader.WaitToReadAsync())
                {
                    var x = (int)await output.Reader.ReadAsync();
                    var y = (int)await output.Reader.ReadAsync();
                    var v = (int)await output.Reader.ReadAsync();

                    if (x == -1 && y == 0)
                    {
                        score = v;
                    }
                    else
                    {
                        if (v == 3)
                        {
                            px = x;
                        }
                        else if (v == 4)
                        {
                            bx = x;
                        }
                    }

                    if (bx.HasValue && px.HasValue)
                    {
                        var direction = Math.Clamp(bx.Value.CompareTo(px.Value), -1, 1);

                        if (px != bx)
                        {
                            bx = null;
                            px = null;
                        }
                        else
                        {
                            bx = null;
                        }

                        await input.Writer.WriteAsync(direction);
                    }
                }
            }),
        });

        return(score);
    }
示例#18
0
    private async Task <(Dictionary <(int, int), char>, (int, int))> GetMapAsync()
    {
        var map = new Dictionary <(int, int), char>();
        var pos = (0, 0);
        var tar = pos;
        var dir = N;

        var input   = Channel.CreateUnbounded <BigInteger>();
        var intcode = new IntcodeComputer(_input)
        {
            Input = () => input.Reader.ReadAsync().AsTask()
        };

        intcode.Output = async status =>
        {
            switch ((int)status)
            {
            case 0:                     // hit wall
                map[Step(pos, dir)] = '#';
                dir = dir switch
                {
                    N => W,
                    W => S,
                    S => E,
                    E => N,
                    _ => throw new Exception("dir?"),
                };
                await input.Writer.WriteAsync(dir);

                break;

            case 1:                     // moved
                pos      = Step(pos, dir);
                map[pos] = '.';
                dir      = dir switch
                {
                    N when !IsWall(Step(pos, E)) => E,
                    N => N,
                    W when !IsWall(Step(pos, N)) => N,
                    W => W,
                    S when !IsWall(Step(pos, W)) => W,
                    S => S,
                    E when !IsWall(Step(pos, S)) => S,
                    E => E,
                    _ => throw new Exception("dir?"),
                };
                await input.Writer.WriteAsync(dir);

                if (pos == default && tar != default)
                {
                    intcode.Halt();
                }
                break;

            case 2:                     // found it
                tar = Step(pos, dir);
                goto case 1;
            }
        };

        await input.Writer.WriteAsync(dir);

        await intcode.RunAsync();

        return(map, tar);

        bool IsWall((int, int) pos) => map.TryGetValue(pos, out var c) && c == '#';
    }