Beispiel #1
0
        private void AddMainPixels(PuzzleRoute puzzleRoute, Pixel indexPixel, string puzzleRouteString)
        {
            foreach (var direction in puzzleRouteString)
            {
                switch (direction)
                {
                case 'N':
                    Coordinates.Add(new Pixel(indexPixel.X, ++indexPixel.Y));
                    Coordinates.Add(new Pixel(indexPixel.X, ++indexPixel.Y));
                    break;

                case 'E':
                    Coordinates.Add(new Pixel(++indexPixel.X, indexPixel.Y));
                    Coordinates.Add(new Pixel(++indexPixel.X, indexPixel.Y));
                    break;

                case 'W':
                    Coordinates.Add(new Pixel(--indexPixel.X, indexPixel.Y));
                    Coordinates.Add(new Pixel(--indexPixel.X, indexPixel.Y));
                    break;

                case 'S':

                    Coordinates.Add(new Pixel(indexPixel.X, --indexPixel.Y));
                    Coordinates.Add(new Pixel(indexPixel.X, --indexPixel.Y));
                    break;

                default:
                    break;
                }
            }
        }
Beispiel #2
0
        public override string Part2()
        {
            var puzzleRegex = PuzzleInput;
            var parentNode  = new PuzzleRoute("");
            var sb          = new StringBuilder();

            var puzzleRoute = GetChildBranch(puzzleRegex.Replace("^", "").Replace("$", ""));

            var indexPixel = new Pixel(0, 0);

            foreach (var mainRoute in puzzleRoute.Options)
            {
                AddBranchPixel(mainRoute, indexPixel);
            }

            var grid       = CreateGrid(puzzleRoute);
            var shiftPixel = grid.Item3;

            if (Test)
            {
                var newGrid = PrepareGrid(grid.Item2);
                PrintGRID(newGrid);
            }
            var atLeast = Test ? 31 : 1000;

            var coordinates = new List <Pixel>();

            coordinates.AddRange(Coordinates.Where(c => Math.Abs(c.X) % 2 == 0 && Math.Abs(c.Y) % 2 == 0).ToList());

            var distinctCoordinates = new List <Pixel>();

            for (var k = 0; k < coordinates.Count; k++)
            {
                if (!distinctCoordinates.Any(c => c.X == coordinates[k].X + shiftPixel.X && c.Y == coordinates[k].Y + shiftPixel.Y))
                {
                    distinctCoordinates.Add(new Pixel(coordinates[k].X + shiftPixel.X, coordinates[k].Y + shiftPixel.Y));
                }
            }

            coordinates = distinctCoordinates;

            var pixels = new List <Pixel>();

            DFS(grid.Item2, coordinates, grid.Item1, c => pixels.Add(c));

            var part2 = pixels.Where(c => c.Distance >= (Test ? 31 : 1000)).Count();

            if (Test)
            {
                foreach (var pix in pixels)
                {
                    grid.Item2[pix.X, pix.Y] = (char)(pix.Distance.ToString().Last());
                }
                Print(grid.Item2);
            }

            return(part2.ToString());
        }
Beispiel #3
0
        private void AddBranchPixel(PuzzleRoute puzzleRoute, Pixel indexPixel)
        {
            var mainRoutes = puzzleRoute.Puzzle.ToString().Split(".");

            for (int i = 0; i < mainRoutes.Length; i++)
            {
                var mainRouteValue = mainRoutes[i];

                AddMainPixels(puzzleRoute, indexPixel, mainRouteValue);
                for (int branchi = i; branchi < puzzleRoute.Branches.Count; branchi++)
                {
                    foreach (var optionalRoute in puzzleRoute.Branches[i].Options)
                    {
                        var branchPixel = new Pixel(indexPixel.X, indexPixel.Y);
                        AddBranchPixel(optionalRoute, branchPixel);
                    }
                }
            }
        }
Beispiel #4
0
        public PuzzleRoute GetChildBranch(string str)
        {
            PuzzleRoute mainRoutes = new PuzzleRoute();
            var         options    = str.GetOptions();

            if (!options.Any())
            {
                options = new List <string> {
                    str
                };
            }
            ;

            for (int i = 0; i < options.Count; i++)
            {
                PuzzleRoute optionalRoute = new PuzzleRoute();
                mainRoutes.Options.Add(optionalRoute);
                var opt = options[i];
                while (opt.Length > 0)
                {
                    var character = opt.First();
                    opt = opt.Remove(0, 1);
                    if (character == '(')
                    {
                        optionalRoute.Puzzle.Append('.');
                        var getTotalBranch = opt.GetStringTillClosing();
                        var childBranch    = GetChildBranch(getTotalBranch);
                        optionalRoute.Branches.Add(childBranch);
                        opt = opt.Remove(0, getTotalBranch.Length);
                    }
                    else if (character == ')')
                    {
                    }
                    else
                    {
                        optionalRoute.Puzzle.Append(character);
                    }
                }
            }
            return(mainRoutes);
        }
Beispiel #5
0
        private (Pixel, int[, ], Pixel) CreateGrid(PuzzleRoute puzzleRoute)
        {
            var mainPixel = new Pixel(0, 0);
            var minX      = Coordinates.Min(c => c.X);
            var minY      = Coordinates.Min(c => c.Y);

            var shiftX     = 0 - minX + 1;
            var shiftY     = 0 - minY + 1;
            var maxX       = Coordinates.Max(c => c.X);
            var maxY       = Coordinates.Max(c => c.Y);
            var strideX    = (maxX + shiftX) + 1;
            var strideY    = (maxY + shiftY) + 1;
            var shoftPixel = new Pixel(shiftX, shiftY);
            var grid       = new int[strideX + 2, strideY + 2];

            foreach (var coordinate in Coordinates.Where(c => (Math.Abs(c.X) % 2 == 0 && Math.Abs(c.Y) % 2 == 0)))
            {
                grid[coordinate.X + shiftX, coordinate.Y + shiftY] = '.';
            }
            foreach (var coordinate in Coordinates.Where(c => Math.Abs(c.X) % 2 == 1 || Math.Abs(c.X) == 1))
            {
                grid[coordinate.X + shiftX, coordinate.Y + shiftY] = '|';
            }

            foreach (var coordinate in Coordinates.Where(c => Math.Abs(c.Y) % 2 == 1 || Math.Abs(c.Y) == 1))
            {
                grid[coordinate.X + shiftX, coordinate.Y + shiftY] = '-';
            }

            grid[0 + shiftX, 0 + shiftY] = 'O';


            var centrePixel = new Pixel(shiftX, shiftY);

            return(centrePixel, grid, shoftPixel);
        }