Exemplo n.º 1
0
    public override string?CalculateSolution()
    {
        IDynamicIndexable2D <int> screen = new DynamicIndexable2D <int>();

        using IEnumerator <long> e = new IntcodeComputer(_initialMemory).Execute().GetEnumerator();

        while (e.MoveNext())
        {
            int x = (int)e.Current;
            if (!e.MoveNext())
            {
                break;
            }
            int y = (int)e.Current;
            if (!e.MoveNext())
            {
                break;
            }
            int id = (int)e.Current;

            screen[x, y] = id;
        }

        return(Solution = screen.Count(t => t == ScreenObject.Block).ToString());
    }
Exemplo n.º 2
0
    public override string?CalculateSolution()
    {
        var computer   = new IntcodeComputer(_initialMemory);
        var inputQueue = new Queue <long>(new[] { 0L });
        IDynamicIndexable2D <bool> panels = new DynamicIndexable2D <bool>();
        Position  pos           = Position.Zero;
        Direction direction     = Direction.North;
        var       paintedPanels = new HashSet <Position>();

        using IEnumerator <long> e = computer.Execute(inputQueue).GetEnumerator();

        while (e.MoveNext())
        {
            long color = e.Current;
            long turn  = e.MoveNext() ? e.Current : throw new InvalidOperationException();

            panels[pos] = color == 1;
            paintedPanels.Add(pos);
            direction = turn == 1 ? direction.ToRight() : direction.ToLeft();
            pos      += direction * 1;

            inputQueue.Enqueue(panels[pos] ? 1 : 0);
        }

        return(Solution = paintedPanels.Count().ToString());
    }
Exemplo n.º 3
0
    public override string?CalculateSolutionPartTwo()
    {
        var computer   = new IntcodeComputer(_initialMemory);
        var inputQueue = new Queue <long>(new[] { 1L });
        IDynamicIndexable2D <bool> panels = new DynamicIndexable2D <bool>(new[, ] {
            { true }
        }.AsIndexable());
        Position  pos       = Position.Zero;
        Direction direction = Direction.North;

        using IEnumerator <long> e = computer.Execute(inputQueue).GetEnumerator();

        while (e.MoveNext())
        {
            long color = e.Current;
            long turn  = e.MoveNext() ? e.Current : throw new InvalidOperationException();

            panels[pos] = color == 1;
            direction   = turn == 1 ? direction.ToRight() : direction.ToLeft();
            pos        += direction * 1;

            inputQueue.Enqueue(panels[pos] ? 1 : 0);
        }

        return(SolutionPartTwo = panels.ToString(b => b ? '#' : ' ', screenMode: true));
    }
Exemplo n.º 4
0
    public static IDynamicIndexable2D <T> ToDynamicIndexable <T>(this IEnumerable <IEnumerable <T> > source)
    {
        var dindexable = new DynamicIndexable2D <T>();

        using IEnumerator <IEnumerable <T> > e0 = source.GetEnumerator();

        int i;

        for (i = 0; e0.MoveNext(); i++)
        {
            using IEnumerator <T> e1 = e0.Current.GetEnumerator();

            int j;
            for (j = 0; e1.MoveNext(); j++)
            {
                dindexable[i, j] = e1.Current;
            }
        }

        return(dindexable);
    }
Exemplo n.º 5
0
    public override string?CalculateSolutionPartTwo()
    {
        IDynamicIndexable2D <int> screen = new DynamicIndexable2D <int>();

        var computer = new IntcodeComputer(_initialMemory);

        computer.Memory[0] = 2;
        using IEnumerator <long> e = computer.Execute(PaddleMovesEnumerable()).GetEnumerator();

        bool draw       = false;
        long score      = 0;
        int  blockCount = 0;
        bool scoreDrawn = false;

        if (draw)
        {
            Console.Clear();
        }

        while (e.MoveNext())
        {
            int x = (int)e.Current;
            if (!e.MoveNext())
            {
                break;
            }
            int y = (int)e.Current;
            if (!e.MoveNext())
            {
                break;
            }
            int id = (int)e.Current;

            if (x == -1 && y == 0)
            {
                score = id;
                if (draw)
                {
                    Console.SetCursorPosition(0, 0);
                    Console.WriteLine($"Score: {score}");
                    Console.SetCursorPosition(0, 0);
                    scoreDrawn = true;
                }
            }
            else
            {
                if (id == ScreenObject.Block && screen[x, y] != ScreenObject.Block)
                {
                    blockCount++;
                }
                else if (id != ScreenObject.Block && screen[x, y] == ScreenObject.Block)
                {
                    blockCount--;
                }

                screen[x, y] = id;
                if (draw)
                {
                    Console.SetCursorPosition(x, y + 1);
                    Console.Write(screen[x, y] switch
                    {
                        1 => '+',
                        2 => 'x',
                        3 => '_',
                        4 => 'o',
                        _ => ' '
                    });