-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup.py
More file actions
94 lines (78 loc) · 3.43 KB
/
Copy pathsetup.py
File metadata and controls
94 lines (78 loc) · 3.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
def cross(A : list[str], B : list[str]) -> list[str]:
'''
Cross product of elements in A and elements in B.
:param str A: String with all elements in A to cross
:param str B: String with all elements in B to cross
'''
return [ a + b for a in A for b in B ]
def getAllSquares(rows : str, cols: str) -> list[str]:
'''
Returns list with all possible sudoku squares.
:param str rows: String with all row values
:param str cols: String with all column values
'''
# [A1 A2 A3 A4 A5 A6 A7 A8 A9 B1 ... I7 I8 I9]
squares = cross(rows, cols)
# squares = []
# for letter in rows:
# for number in cols:
# squares.append(letter + number)
return squares
def getAllUnits(rows : str, cols: str) -> list[str]:
'''
Returns list with all possible units (columns, rows, boxes).
:param str rows: String with all row values
:param str cols: String with all column values
'''
# All possible columns
# [A1 B1 C1 D1 E1 F1 G1 H1 I1], [A2 B2 C2 D2 E2 F2 G2 H2 I2], ...
unitcols = [ cross(rows, number) for number in cols ]
# unitcols = []
# for number in cols:
# unitcols.append(cross(rows, number))
# All possible rows
# [A1 A2 A3 A4 A5 A6 A7 A8 A9], [B1 B2 B3 B4 B5 B6 B7 B8], ...
unitrows = [ cross(letter, cols) for letter in rows ]
# for letter in rows:
# unitrows.append(cross(letter, cols))
# All possible boxes
# [A1 A2 A3 B1 B2 B3 C1 C2 C3], ..., [A7 A7 A9 B7 B8 B9 C7 C8 C9], [D1 D2 D3 E1 E2 E3 F1 F2 F3], ..., [D7 D8 D9 E7 E8 E9 F7 F8 F9], ...
# (ABC, DEF, GHI), (123, 456, 789)
unitboxes = [ cross(letterGroup, numberGroup) for letterGroup in ('ABC', 'DEF', 'GHI') for numberGroup in ('123', '456', '789') ]
# unitboxes = []
# for letterGroup in ('ABC', 'DEF', 'GHI'):
# for numberGroup in ('123', '456', '789'):
# unitboxes.append(cross(letterGroup, numberGroup))
unitlist = ( unitcols + unitrows + unitboxes )
return unitlist
def getSquareUnitsMap(unitlist : list[str], squares : list[str]) -> dict[str, list]:
'''
Returns all units mapped to individual squares (square: [column, row, box]).
:param list unitlist: List with all possible units
:param list squares: List with all sudoku squares
'''
# {A1: [col that contains A1, row that contains A1, box that contains A1]}, {B2: ...}, ...
units = dict((square, [ item for item in unitlist if square in item ]) for square in squares)
# units = dict()
# for square in squares:
# squareunits = []
# for item in unitlist:
# if square in item:
# squareunits.append(item)
# units[square] = squareunits
return units
def getAllSquarePeers(units : dict[str, list], squares : list[str]) -> dict[str, set]:
'''
Returns all squares' peers.
:param dict units: All squares' units
:param list squares: List with all sudoku squares
'''
# Peers are all units on which a square appears
# A1 appears on its row, its column, and its box. Get all squares in each of those lists
# {A1:{B3 A4 A6 C3 E1 F1 A8 A7 A2 G1 I1 A3 B1 A9 C1 D1 H1 C2 B2 A5}, {A2: ...}, ...
peers = dict((square, set(sum(units[square], [])) - set([square])) for square in squares)
# peers = dict()
# for square in squares:
# squarepeers = set(sum(units[square], [])) - set([square])
# peers[square] = squarepeers
return peers