public override ILifeBoard NextGeneration(ILifeBoard initial)
        {
            if (initial == null)
            {
                throw new ArgumentNullException(nameof(initial));
            }

            initial.GenerationCount++;

            ILifeBoard newCells = new LifeBoardBool(initial.RowCount, initial.ColumnCount, initial.GenerationCount, null);

            for (int i = 0; i < initial.RowCount; i++)
            {
                for (int j = 0; j < initial.ColumnCount; j++)
                {
                    int countNeighbors = CountNeighbors(initial, i, j);

                    newCells[i, j] = initial[i, j] ?
                                     (countNeighbors == 2 || countNeighbors == 3)
                                                : (countNeighbors == 3);
                }
            }

            return(newCells);
        }
        static public ILifeBoard FromPattern(IEnumerable <string> initialRows)
        {
            if (initialRows == null)
            {
                throw new ArgumentNullException(nameof(initialRows));
            }

            if (initialRows.Any(l => l == null))
            {
                throw new ArgumentOutOfRangeException(nameof(initialRows));
            }

            int rowCount = initialRows.Count();

            if (rowCount == 0)
            {
                throw new ArgumentOutOfRangeException(nameof(initialRows));
            }

            int colCount = initialRows.Max(l => l.Length);

            if (colCount == 0)
            {
                throw new ArgumentOutOfRangeException(nameof(initialRows));
            }

            if (rowCount > GetMaxRows() || colCount > GetMaxColumns())
            {
                throw new ArgumentOutOfRangeException(nameof(initialRows));
            }

            ILifeBoard cells = new LifeBoardBool(rowCount, colCount, 0, null);

            int rowNum = 0;

            foreach (var row in initialRows)
            {
                var l = row;
                if (l.Length < colCount)
                {
                    l = l + new string('0', colCount - l.Length);
                }

                for (int c = 0; c < colCount; c++)
                {
                    cells[rowNum, c] = l[c] == '1' || l[c] == 'X';
                }
                rowNum++;
            }
            return(cells);
        }