public static SudokuBoard ClassicWith3x3BoxesAndHyperRegions(string[] tileDefinitions) { SudokuBoard board = ClassicWith3x3Boxes(tileDefinitions); const int HyperSecond = HyperMargin + BoxSize + HyperMargin; // Create the four extra hyper regions board.CreateRule("HyperA", Box(3, 3).Select(pos => board[pos.X + HyperMargin, pos.Y + HyperMargin])); board.CreateRule("HyperB", Box(3, 3).Select(pos => board[pos.X + HyperSecond, pos.Y + HyperMargin])); board.CreateRule("HyperC", Box(3, 3).Select(pos => board[pos.X + HyperMargin, pos.Y + HyperSecond])); board.CreateRule("HyperD", Box(3, 3).Select(pos => board[pos.X + HyperSecond, pos.Y + HyperSecond])); return(board); }
public static SudokuBoard Samurai(string[] tileDefinitions) { SudokuBoard board = new SudokuBoard(SamuraiAreas * BoxSize, SamuraiAreas * BoxSize, DefaultSize, tileDefinitions); // Removed the empty areas where there are no tiles IEnumerable <SudokuTile> tiles = new[] { Box(BoxSize, BoxSize * 2).Select(pos => board[pos.X + DefaultSize, pos.Y]), Box(BoxSize, BoxSize * 2).Select(pos => board[pos.X + DefaultSize, pos.Y + DefaultSize * 2 - BoxSize]), Box(BoxSize * 2, BoxSize).Select(pos => board[pos.X, pos.Y + DefaultSize]), Box(BoxSize * 2, BoxSize).Select(pos => board[pos.X + DefaultSize * 2 - BoxSize, pos.Y + DefaultSize]) }.SelectMany(t => t); foreach (SudokuTile tile in tiles) { tile.Block(); } // Select the tiles in the 3 x 3 area (area.X, area.Y) and create rules for them foreach (Point area in Box(SamuraiAreas, SamuraiAreas)) { IEnumerable <SudokuTile> tilesInArea = Box(BoxSize, BoxSize) .Select(pos => board[area.X * BoxSize + pos.X, area.Y * BoxSize + pos.Y]); if (tilesInArea.First().IsBlocked) { continue; } board.CreateRule($"Area {area.X}, {area.Y}", tilesInArea); } // Select all rows and create columns for them foreach (int posSet in Enumerable.Range(0, board.Width)) { board.CreateRule($"Column Upper {posSet}", Box(1, DefaultSize).Select(pos => board[posSet, pos.Y])); board.CreateRule($"Column Lower {posSet}", Box(1, DefaultSize).Select(pos => board[posSet, pos.Y + DefaultSize + BoxSize])); board.CreateRule($"Row Left {posSet}", Box(DefaultSize, 1).Select(pos => board[pos.X, posSet])); board.CreateRule($"Row Right {posSet}", Box(DefaultSize, 1).Select(pos => board[pos.X + DefaultSize + BoxSize, posSet])); if (posSet >= BoxSize * 2 && posSet < BoxSize * 2 + DefaultSize) { // Create rules for the middle sudoku board.CreateRule($"Column Middle {posSet}", Box(1, 9).Select(pos => board[posSet, pos.Y + BoxSize * 2])); board.CreateRule($"Row Middle {posSet}", Box(9, 1).Select(pos => board[pos.X + BoxSize * 2, posSet])); } } return(board); }
public static SudokuBoard ClassicWithSpecialBoxes(string[] areas, string[] tileDefinitions) { int sizeX = areas[0].Length; int sizeY = areas.Length; SudokuBoard board = new SudokuBoard(sizeX, sizeY, tileDefinitions); string joinedString = string.Join(string.Empty, areas); // Loop through all the unique characters foreach (char ch in joinedString.Distinct()) { // Select the rule tiles based on the index of the character IEnumerable <SudokuTile> ruleTiles = from i in Enumerable.Range(0, joinedString.Length) where joinedString[i] == ch // filter out any non-matching characters select board[i % sizeX, i / sizeY]; board.CreateRule($"Area {ch}", ruleTiles); } return(board); }