Пример #1
0
    public override Output Part1()
    {
        var input = Input.Lines();
        var grid  = new SparsePlaneGrid2D <int>(input[0].Length, input.Length);

        for (int y = 0; y < input.Length; y++)
        {
            for (int x = 0; x < input[y].Length; x++)
            {
                grid[x, y] = Int32.Parse(input[y][x].ToString()) + 1;
            }
        }

        List <Coordinate2D> flashes = new();
        long answer = 0;

        for (int i = 0; i < 100; i++)
        {
            flashes.Clear();
            for (int y = 0; y < grid.J.Length; y++)
            {
                for (int x = 0; x < grid.I.Length; x++)
                {
                    Increase(x, y);
                }
            }
        }

        void Increase(long x, long y)
        {
            if (flashes.Contains(new(x, y)))
            {
                return;
            }

            grid[x, y]++;
            if (grid[x, y] == 11)
            {
                answer++;
                grid[x, y] = 1;
                if (!flashes.Contains(new(x, y)))
                {
                    flashes.Add(new(x, y));
                    var ns = grid.Neighbors(new(x, y));
                    foreach (var n in ns)
                    {
                        Increase(n.X, n.Y);
                    }
                }
            }
        }

        return(answer);
    }
Пример #2
0
    public override Output Part2()
    {
        var input     = Input.Paragraphs();
        var algorithm = input[0].Replace("\n", "");

        var imageData = input[1].Lines();
        var grid      = new SparsePlaneGrid2D <bool>();

        for (int y = 0; y < imageData.Length; y++)
        {
            for (int x = 0; x < imageData[y].Length; x++)
            {
                grid[x, y] = imageData[y][x] == '#';
            }
        }

        var x0 = 0;
        var xN = imageData[0].Length;
        var y0 = 0;
        var yN = imageData.Length;

        for (int t = 0; t < 50; t++)
        {
            x0--;
            xN++;
            y0--;
            yN++;
            var newDefault = (grid.DefaultValue ? algorithm.Last() : algorithm.First()) == '#';
            var newGrid    = new SparsePlaneGrid2D <bool>(newDefault);

            for (var y = y0; y <= yN; y++)
            {
                for (var x = x0; x <= xN; x++)
                {
                    var rule = 0;
                    rule = rule * 2 + (grid[x - 1, y - 1] ? 1 : 0);
                    rule = rule * 2 + (grid[x, y - 1] ? 1 : 0);
                    rule = rule * 2 + (grid[x + 1, y - 1] ? 1 : 0);
                    rule = rule * 2 + (grid[x - 1, y] ? 1 : 0);
                    rule = rule * 2 + (grid[x, y] ? 1 : 0);
                    rule = rule * 2 + (grid[x + 1, y] ? 1 : 0);
                    rule = rule * 2 + (grid[x - 1, y + 1] ? 1 : 0);
                    rule = rule * 2 + (grid[x, y + 1] ? 1 : 0);
                    rule = rule * 2 + (grid[x + 1, y + 1] ? 1 : 0);

                    newGrid[x, y] = algorithm[rule] == '#';
                }
            }

            grid = newGrid;
        }

        return(grid.Count(x => x.Value));
    }
Пример #3
0
 private void Draw(SparsePlaneGrid2D <char> grid)
 {
     Console.Clear();
     for (int y = 0; y < grid.J.Length; y++)
     {
         for (int x = 0; x < grid.I.Length; x++)
         {
             Console.Write(grid[x, y]);
         }
         Console.WriteLine();
     }
 }
Пример #4
0
 private void Print(SparsePlaneGrid2D <int> grid)
 {
     Console.Clear();
     for (int y = 0; y < grid.J.Length; y++)
     {
         for (int x = 0; x < grid.I.Length; x++)
         {
             var v = grid[x, y] - 1;
             if (v == 0)
             {
                 Console.ForegroundColor = ConsoleColor.Cyan;
             }
             Console.Write(v);
             Console.ResetColor();
         }
         Console.WriteLine();
     }
 }
Пример #5
0
    public override Output Part1()
    {
        var input = Input.Lines();

        var grid = new SparsePlaneGrid2D <char>(new Interval(0, input[0].Length, true), new Interval(0, input.Length, true));

        for (int y = 0; y < input.Length; y++)
        {
            for (int x = 0; x < input[0].Length; x++)
            {
                grid[x, y] = input[y][x];
            }
        }

        var t = 0;

        while (true)
        {
            t++;
            Console.WriteLine(t);
            int moved   = 0;
            var newGrid = new SparsePlaneGrid2D <char>(new Interval(0, input[0].Length, true), new Interval(0, input.Length, true));
            for (int y = 0; y < input.Length; y++)
            {
                for (int x = 0; x < input[0].Length; x++)
                {
                    newGrid[x, y] = grid[x, y];
                }
            }

            for (int y = input.Length - 1; y >= 0; y--)
            {
                for (int x = input[0].Length - 1; x >= 0; x--)
                {
                    if (grid[x, y] == '>' && grid[x + 1, y] == '.')
                    {
                        newGrid[x, y]     = '.';
                        newGrid[x + 1, y] = '>';
                        moved++;
                    }
                }
            }
            for (int y = 0; y < input.Length; y++)
            {
                for (int x = 0; x < input[0].Length; x++)
                {
                    grid[x, y] = newGrid[x, y];
                }
            }
            for (int y = input.Length - 1; y >= 0; y--)
            {
                for (int x = input[0].Length - 1; x >= 0; x--)
                {
                    if (grid[x, y] == 'v' && grid[x, y + 1] == '.')
                    {
                        newGrid[x, y]     = '.';
                        newGrid[x, y + 1] = 'v';
                        moved++;
                    }
                }
            }
            if (moved == 0)
            {
                return(t);
            }

            grid = newGrid;
        }
    }