protected override void SolvePartTwo() { var centerGrid = new ErisGrid(sanitizedInput, true); centerGrid.DoTimeSteps(200); resultPartTwo = centerGrid.CountAllBugs(true).ToString(); }
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]; } } }
public ErisGrid(ErisGrid other, bool thisInsideOther) : this(true) { if (thisInsideOther) { gridOutsideThis = other; } else { gridInsideThis = other; } }
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); } }