예제 #1
0
        protected override void SolvePartTwo()
        {
            var centerGrid = new ErisGrid(sanitizedInput, true);

            centerGrid.DoTimeSteps(200);
            resultPartTwo = centerGrid.CountAllBugs(true).ToString();
        }
예제 #2
0
            public void Step()
            {
                if (isRecursiveGrid)
                {
                    //add grids to current outers
                    var currentOuter = FindOutermostGrid();
                    var currentInner = FindInnermostGrid();
                    var newOuter     = new ErisGrid(currentOuter, false);
                    currentOuter.gridOutsideThis = newOuter;
                    var newInner = new ErisGrid(currentInner, true);
                    currentInner.gridInsideThis = newInner;

                    //determine which indices to update for every grid
                    var bitsToFlipPerGrid = new List <(ErisGrid, IEnumerable <int>)>();
                    var currentGrid       = newOuter;
                    while (currentGrid != null)
                    {
                        bitsToFlipPerGrid.Add((currentGrid, currentGrid.DetermineWhichBitsToFlip()));
                        currentGrid = currentGrid.gridInsideThis;
                    }

                    //update indices where necessary
                    foreach (var(grid, indices) in bitsToFlipPerGrid)
                    {
                        foreach (var index in indices)
                        {
                            grid.state[index] = !grid.state[index];
                        }
                    }

                    //delete empty grids on the edges
                    currentGrid = newOuter;
                    while (currentGrid != null && currentGrid.GetBiodiversity() == 0)
                    {
                        currentGrid = currentGrid.gridInsideThis;
                        if (currentGrid != null)
                        {
                            currentGrid.gridOutsideThis.gridInsideThis = null;
                            currentGrid.gridOutsideThis = null;
                        }
                    }
                    currentGrid = newInner;
                    while (currentGrid != null && currentGrid.GetBiodiversity() == 0)
                    {
                        currentGrid = currentGrid.gridOutsideThis;
                        if (currentGrid != null)
                        {
                            currentGrid.gridInsideThis.gridOutsideThis = null;
                            currentGrid.gridInsideThis = null;
                        }
                    }
                }
                else
                {
                    foreach (var index in DetermineWhichBitsToFlip())
                    {
                        state[index] = !state[index];
                    }
                }
            }
예제 #3
0
 public ErisGrid(ErisGrid other, bool thisInsideOther) : this(true)
 {
     if (thisInsideOther)
     {
         gridOutsideThis = other;
     }
     else
     {
         gridInsideThis = other;
     }
 }
예제 #4
0
        public int GetFirstRepeatedBiodiversity()
        {
            var grid = new ErisGrid(sanitizedInput, false);
            var observedBiodiversities = new HashSet <int>()
            {
                grid.GetBiodiversity()
            };

            while (true)
            {
                grid.Step();
                var biodiversity = grid.GetBiodiversity();
                if (observedBiodiversities.Contains(biodiversity))
                {
                    return(biodiversity);
                }
                observedBiodiversities.Add(biodiversity);
            }
        }