Example #1
0
        public ErisMapState Evolve()
        {
            var cellsAdjacentToBugs = GetAdjacentBugCounts(
                out HashSet <GridPoint3D> bugsNotAdjacentToOtherBugs);

            // Update cells based on rules
            var bugCells = BugCells.ToHashSet();

            foreach (var cellAdjacentToBug in cellsAdjacentToBugs)
            {
                var point = cellAdjacentToBug.Key;

                var bugCount = cellAdjacentToBug.Value;
                // Each minute, The bugs live and die based on the number of
                // bugs in the four adjacent tiles:
                // A bug dies(becoming an empty space) unless there is exactly
                // one bug adjacent to it.
                //An empty space becomes infested with a bug if exactly one or
                // two bugs are adjacent to it.
                if (!bugCells.Contains(point) &&
                    (bugCount == 1 ||
                     bugCount == 2))
                {
                    bugCells.Add(point);
                    if (MinZ > point.Z)
                    {
                        MinZ = point.Z;
                    }
                    else if (MaxZ < point.Z)
                    {
                        MaxZ = point.Z;
                    }
                }
                else if (bugCells.Contains(point) &&
                         bugCount != 1)
                {
                    bugCells.Remove(point);
                }
            }
            // Kill all bugs not adjacent to other bugs
            foreach (var bugPoint in bugsNotAdjacentToOtherBugs)
            {
                bugCells.Remove(bugPoint);
            }

            return(new ErisMapState(
                       bugCells: bugCells,
                       width: Width,
                       height: Height,
                       minZ: MinZ,
                       maxZ: MaxZ,
                       isRecursive: IsRecursive));
        }
Example #2
0
 public string GetCellString(GridPoint3D point)
 {
     if (BugCells.Contains(point))
     {
         return("#");
     }
     if (GetIsPointOffMap(point))
     {
         return(" ");
     }
     if (IsRecursive && CenterPointXY.Equals(point.XYPoint))
     {
         return("?");
     }
     return(".");
 }
Example #3
0
        public BigInteger GetBiodiversityRating(int layer)
        {
            BigInteger result         = 0;
            BigInteger cellPointValue = 1;

            for (int y = 0; y < Height; y++)
            {
                for (int x = 0; x < Width; x++)
                {
                    var point = new GridPoint3D(x, y, layer);
                    if (BugCells.Contains(point))
                    {
                        result += cellPointValue;
                    }
                    cellPointValue *= 2;
                }
            }
            return(result);
        }
Example #4
0
        public Dictionary <GridPoint3D, int> GetAdjacentBugCounts(
            out HashSet <GridPoint3D> bugsNotAdjacentToOtherBugs)
        {
            // Build a dictionary of all cells adjacent to bugs
            // and count the number of bugs adjacent to them
            // If the map is recursive, then add new layers if bugs are
            // adjacent to cells in the next inner or outer layer and the
            // layers haven't yet been added to the map
            var cellsAdjacentToBugs = new Dictionary <GridPoint3D, int>();

            bugsNotAdjacentToOtherBugs = BugCells.ToHashSet();
            foreach (var bugCell in BugCells)
            {
                var neighbors = GetNeighbors(bugCell);
                foreach (var neighbor in neighbors)
                {
                    if (GetIsPointOffMap(neighbor))
                    {
                        // We should only get points off the map if the map is
                        // not recursive
                        if (IsRecursive)
                        {
                            throw new Exception("Encountered point off map");
                        }
                        continue;
                    }
                    if (!cellsAdjacentToBugs.ContainsKey(neighbor))
                    {
                        cellsAdjacentToBugs.Add(neighbor, 0);
                    }
                    cellsAdjacentToBugs[neighbor]++;
                    if (bugsNotAdjacentToOtherBugs.Contains(neighbor))
                    {
                        bugsNotAdjacentToOtherBugs.Remove(neighbor);
                    }
                }
            }
            return(cellsAdjacentToBugs);
        }