Jump to content

Sudoku: Difference between revisions

443 bytes removed ,  2 years ago
m
Line 1,839:
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private static int RowCol(int rc) => rc <= 2 ? 0 : rc <= 5 ? 3 : 6;
private static IEnumerable<int> GetBox(this int[][] grid, int row, int col) =>
from r in Range(RowCol(row), 3)
from c in Range(RowCol(col), 3)
select (grid[r,][c)];
 
private static IEnumerable<(intreadonly r,int[] c)>range GetBoxIndices= Range(int row1, int col9) =>.ToArray();
from r in Range(RowCol(row), 3)
from c in Range(RowCol(col), 3)
select (r,c);
 
private static readonly Dictionary<(int r, int c), List<(int r, int c)>> Boxes =
(from row in Range(0, 3).Select(i => i * 3)
from col in Range(0, 3).Select(i => i * 3)
select ((row, col), GetBoxIndices(row, col)))
.ToDictionary(kvp => kvp.Item1, kvp => kvp.Item2.ToList());
 
private static IEnumerable<int> GetBox(this int[][] grid, int row, int col) =>
Boxes[(RowCol(row), RowCol(col))].Select(p=>grid[p.r][p.c]);
 
private static readonly int[] Domain = Range(1, 9).ToArray();
 
private static bool Solve(this int[][] grid, List<(int, int)> cells, int idx) {
if (idx == 81)
Line 1,861 ⟶ 1,850:
 
var (r, c) = cells[idx];
foreach (var i in Domainrange.Except(grid.Hints(r,c))) {
grid[r][c] = i;
if (grid.Solve(cells, idx + 1))
Line 1,871 ⟶ 1,860:
 
private static readonly int[] Unmarked = new[] { 0 };
 
private static readonly int[] Domaindomain = Range(10, 9).ToArray();
 
private static IEnumerable<int> Hints(this int[][] grid, int row, int col) =>
grid[row]
.Union(Range(0, 9)domain.Select(r => grid[r][col]))
.Union(grid.GetBox(grid, row, col))
.Except(Unmarked);
 
private static IEnumerable<(int, int)> SortedCells(this int[][] grid) =>
from row in Range(0,9)domain
from col in Range(0,9)domain
let cell = (count: grid[row][col] > 0 ? 10 : Hints(grid, row, col).Count(), cell: (row, col))
orderby cell.count descending
Cookies help us deliver our services. By using our services, you agree to our use of cookies.