4
4
from typing import List
5
5
from collections import defaultdict
6
6
7
+
7
8
def is_valid_sudoku (board : List [List [str ]]) -> bool :
8
9
rows = defaultdict (set )
9
10
cols = defaultdict (set )
@@ -13,13 +14,13 @@ def is_valid_sudoku(board: List[List[str]]) -> bool:
13
14
for col in range (9 ):
14
15
cell = board [row ][col ]
15
16
16
- if cell == '.' : # Skip empty cells
17
+ if cell == "." : # Skip empty cells
17
18
continue
18
19
19
20
if (
20
- cell in rows [row ] or
21
- cell in cols [col ] or
22
- cell in squares [(row // 3 , col // 3 )]
21
+ cell in rows [row ]
22
+ or cell in cols [col ]
23
+ or cell in squares [(row // 3 , col // 3 )]
23
24
):
24
25
return False
25
26
@@ -29,23 +30,36 @@ def is_valid_sudoku(board: List[List[str]]) -> bool:
29
30
30
31
return True
31
32
33
+
32
34
class Test (unittest .TestCase ):
33
35
def test_is_valid_sudoku (self ):
34
- self .assertTrue (is_valid_sudoku ([["1" ,"2" ,"." ,"." ,"3" ,"." ,"." ,"." ,"." ],
35
- ["4" ,"." ,"." ,"5" ,"." ,"." ,"." ,"." ,"." ],
36
- ["." ,"9" ,"8" ,"." ,"." ,"." ,"." ,"." ,"3" ],
37
- ["5" ,"." ,"." ,"." ,"6" ,"." ,"." ,"." ,"4" ],
38
- ["." ,"." ,"." ,"8" ,"." ,"3" ,"." ,"." ,"5" ],
39
- ["7" ,"." ,"." ,"." ,"2" ,"." ,"." ,"." ,"6" ],
40
- ["." ,"." ,"." ,"." ,"." ,"." ,"2" ,"." ,"." ],
41
- ["." ,"." ,"." ,"4" ,"1" ,"9" ,"." ,"." ,"8" ],
42
- ["." ,"." ,"." ,"." ,"8" ,"." ,"." ,"7" ,"9" ]]))
43
- self .assertFalse (is_valid_sudoku ([["1" ,"2" ,"." ,"." ,"3" ,"." ,"." ,"." ,"." ],
44
- ["4" ,"." ,"." ,"5" ,"." ,"." ,"." ,"." ,"." ],
45
- ["." ,"9" ,"1" ,"." ,"." ,"." ,"." ,"." ,"3" ],
46
- ["5" ,"." ,"." ,"." ,"6" ,"." ,"." ,"." ,"4" ],
47
- ["." ,"." ,"." ,"8" ,"." ,"3" ,"." ,"." ,"5" ],
48
- ["7" ,"." ,"." ,"." ,"2" ,"." ,"." ,"." ,"6" ],
49
- ["." ,"." ,"." ,"." ,"." ,"." ,"2" ,"." ,"." ],
50
- ["." ,"." ,"." ,"4" ,"1" ,"9" ,"." ,"." ,"8" ],
51
- ["." ,"." ,"." ,"." ,"8" ,"." ,"." ,"7" ,"9" ]]))
36
+ self .assertTrue (
37
+ is_valid_sudoku (
38
+ [
39
+ ["1" , "2" , "." , "." , "3" , "." , "." , "." , "." ],
40
+ ["4" , "." , "." , "5" , "." , "." , "." , "." , "." ],
41
+ ["." , "9" , "8" , "." , "." , "." , "." , "." , "3" ],
42
+ ["5" , "." , "." , "." , "6" , "." , "." , "." , "4" ],
43
+ ["." , "." , "." , "8" , "." , "3" , "." , "." , "5" ],
44
+ ["7" , "." , "." , "." , "2" , "." , "." , "." , "6" ],
45
+ ["." , "." , "." , "." , "." , "." , "2" , "." , "." ],
46
+ ["." , "." , "." , "4" , "1" , "9" , "." , "." , "8" ],
47
+ ["." , "." , "." , "." , "8" , "." , "." , "7" , "9" ],
48
+ ]
49
+ )
50
+ )
51
+ self .assertFalse (
52
+ is_valid_sudoku (
53
+ [
54
+ ["1" , "2" , "." , "." , "3" , "." , "." , "." , "." ],
55
+ ["4" , "." , "." , "5" , "." , "." , "." , "." , "." ],
56
+ ["." , "9" , "1" , "." , "." , "." , "." , "." , "3" ],
57
+ ["5" , "." , "." , "." , "6" , "." , "." , "." , "4" ],
58
+ ["." , "." , "." , "8" , "." , "3" , "." , "." , "5" ],
59
+ ["7" , "." , "." , "." , "2" , "." , "." , "." , "6" ],
60
+ ["." , "." , "." , "." , "." , "." , "2" , "." , "." ],
61
+ ["." , "." , "." , "4" , "1" , "9" , "." , "." , "8" ],
62
+ ["." , "." , "." , "." , "8" , "." , "." , "7" , "9" ],
63
+ ]
64
+ )
65
+ )
0 commit comments