public static int GetTotalNumberOfOccupiedSeats(Day11Model layoutModel,
                                                        int fromRowIndex,
                                                        int toRowIndex,
                                                        int fromColumnIndex,
                                                        int toColumnIndex,
                                                        Tuple <int, int> ignorePosition = null)
        {
            var numberOfOccupiedSeats = 0;

            for (var rowIndex = fromRowIndex; rowIndex <= toRowIndex; rowIndex++)
            {
                for (var colIndex = fromColumnIndex; colIndex <= toColumnIndex; colIndex++)
                {
                    var isValidIndex = rowIndex >= 0 && rowIndex < layoutModel.Rows &&
                                       colIndex >= 0 && colIndex < layoutModel.Columns;

                    if (!isValidIndex || (ignorePosition != null &&
                                          ignorePosition.Item1 == rowIndex &&
                                          ignorePosition.Item2 == colIndex))
                    {
                        continue;
                    }

                    if (layoutModel.SeatLaoyut[rowIndex, colIndex] == OccupiedSeat)
                    {
                        numberOfOccupiedSeats++;
                    }
                }
            }

            return(numberOfOccupiedSeats);
        }
        private static int GetNumberOfOccupiedSeatsInOneDirection(Day11Model layoutModel, int rowPosition, int columnPosition, int rowDirection, int columnDirection)
        {
            if (rowPosition + rowDirection < 0 || rowPosition + rowDirection >= layoutModel.Rows ||
                columnPosition + columnDirection < 0 || columnPosition + columnDirection >= layoutModel.Columns)
            {
                return(0);
            }

            if (layoutModel.SeatLaoyut[rowPosition + rowDirection, columnPosition + columnDirection] == OccupiedSeat)
            {
                return(1);
            }
            else if (layoutModel.SeatLaoyut[rowPosition + rowDirection, columnPosition + columnDirection] == EmptySeat)
            {
                return(0);
            }
            else
            {
                return(GetNumberOfOccupiedSeatsInOneDirection(layoutModel,
                                                              rowPosition + rowDirection,
                                                              columnPosition + columnDirection,
                                                              rowDirection,
                                                              columnDirection));
            }
        }
 private static int GetNumberOfNeighborOccupiedSeats(Day11Model layoutModel, int rowPosition, int colPosition)
 {
     return(GetTotalNumberOfOccupiedSeats(layoutModel,
                                          rowPosition - 1,
                                          rowPosition + 1,
                                          colPosition - 1,
                                          colPosition + 1,
                                          new Tuple <int, int>(rowPosition, colPosition)));
 }
 public static void PrintLayout(Day11Model currentModel)
 {
     for (var rowIndex = 0; rowIndex < currentModel.Rows; rowIndex++)
     {
         for (var colIndex = 0; colIndex < currentModel.Columns; colIndex++)
         {
             Console.Write(currentModel.SeatLaoyut[rowIndex, colIndex]);
         }
         Console.WriteLine();
     }
 }
 private static int GetNumberOfOccuppiedSeatsInAllDirections(Day11Model layoutModel, int rowPosition, int colPosition)
 {
     return(GetNumberOfOccupiedSeatsInOneDirection(layoutModel, rowPosition, colPosition, -1, -1)
            + GetNumberOfOccupiedSeatsInOneDirection(layoutModel, rowPosition, colPosition, -1, 0)
            + GetNumberOfOccupiedSeatsInOneDirection(layoutModel, rowPosition, colPosition, -1, 1)
            + GetNumberOfOccupiedSeatsInOneDirection(layoutModel, rowPosition, colPosition, 0, -1)
            + GetNumberOfOccupiedSeatsInOneDirection(layoutModel, rowPosition, colPosition, 0, 1)
            + GetNumberOfOccupiedSeatsInOneDirection(layoutModel, rowPosition, colPosition, 1, -1)
            + GetNumberOfOccupiedSeatsInOneDirection(layoutModel, rowPosition, colPosition, 1, 0)
            + GetNumberOfOccupiedSeatsInOneDirection(layoutModel, rowPosition, colPosition, 1, 1));
 }
        public static Tuple <bool, Day11Model> Part2DoRoundAndGetChangedState(Day11Model layoutModel)
        {
            var stateChanged = false;
            var newLayout    = new char[layoutModel.Rows, layoutModel.Columns];

            for (var rowIndex = 0; rowIndex < layoutModel.Rows; rowIndex++)
            {
                for (var colIndex = 0; colIndex < layoutModel.Columns; colIndex++)
                {
                    newLayout[rowIndex, colIndex] = layoutModel.SeatLaoyut[rowIndex, colIndex];

                    if (layoutModel.SeatLaoyut[rowIndex, colIndex] == EmptySeat)
                    {
                        var numberOfOccupiedSeats = GetNumberOfOccuppiedSeatsInAllDirections(layoutModel, rowIndex, colIndex);
                        if (numberOfOccupiedSeats == 0)
                        {
                            newLayout[rowIndex, colIndex] = OccupiedSeat;
                            stateChanged = true;
                        }
                    }
                    else if (layoutModel.SeatLaoyut[rowIndex, colIndex] == OccupiedSeat)
                    {
                        var numberOfOccupiedSeats = GetNumberOfOccuppiedSeatsInAllDirections(layoutModel, rowIndex, colIndex);
                        if (numberOfOccupiedSeats >= 5)
                        {
                            newLayout[rowIndex, colIndex] = EmptySeat;
                            stateChanged = true;
                        }
                    }
                }
            }

            var newModel = new Day11Model(newLayout, layoutModel.Rows, layoutModel.Columns);

            return(new Tuple <bool, Day11Model>(stateChanged, newModel));
        }