4 data Variant = Basic | Cross | Color deriving (Eq,Show)
\r
8 isValid :: Sudoku -> Variant -> Bool
\r
9 isValid s v | not (checkRows s) = False
\r
10 | not (checkColumns s 0) = False
\r
11 | not (checkSquares s 0) = False
\r
12 | (v==Cross) && not (checkCross s 0) = False
\r
13 | (v==Color) && not (checkColors s 0) = False
\r
16 checkDigits :: [Integer] -> [Integer] -> Bool
\r
17 checkDigits [] d = True
\r
18 checkDigits (f:xs) d | (f>=1) && (f<=9) && (notElem f d) = False
\r
19 | otherwise = checkDigits xs (filter (/=f) d)
\r
21 checkRows :: Sudoku -> Bool
\r
23 checkRows (row:xs) | not (checkDigits row [1..9]) = False
\r
24 | otherwise = checkRows xs
\r
26 checkColumns :: Sudoku -> Integer -> Bool
\r
27 checkColumns s c | (c==9) = True
\r
28 | not (checkDigits ([(s!!0)!!fromInteger c]++[(s!!1)!!fromInteger c]++[(s!!2)!!fromInteger c]++[(s!!3)!!fromInteger c]++[(s!!4)!!fromInteger c]++[(s!!5)!!fromInteger c]++[(s!!6)!!fromInteger c]++[(s!!7)!!fromInteger c]++[(s!!8)!!fromInteger c]) [1..9]) = False
\r
29 | otherwise = checkColumns s (c+1)
\r
31 checkSquares :: Sudoku -> Integer -> Bool
\r
32 checkSquares s c | (c==9) = True
\r
33 | (c==0) && not (checkDigits ([(s!!0)!!0]++[(s!!0)!!1]++[(s!!0)!!2]++[(s!!1)!!0]++[(s!!1)!!1]++[(s!!1)!!2]++[(s!!2)!!0]++[(s!!2)!!1]++[(s!!2)!!2]) [1..9]) = False
\r
34 | (c==1) && not (checkDigits ([(s!!0)!!3]++[(s!!0)!!4]++[(s!!0)!!5]++[(s!!1)!!3]++[(s!!1)!!4]++[(s!!1)!!5]++[(s!!2)!!3]++[(s!!2)!!4]++[(s!!2)!!5]) [1..9]) = False
\r
35 | (c==2) && not (checkDigits ([(s!!0)!!6]++[(s!!0)!!7]++[(s!!0)!!8]++[(s!!1)!!6]++[(s!!1)!!7]++[(s!!1)!!8]++[(s!!2)!!6]++[(s!!2)!!7]++[(s!!2)!!8]) [1..9]) = False
\r
36 | (c==3) && not (checkDigits ([(s!!3)!!0]++[(s!!3)!!1]++[(s!!3)!!2]++[(s!!4)!!0]++[(s!!4)!!1]++[(s!!4)!!2]++[(s!!5)!!0]++[(s!!5)!!1]++[(s!!5)!!2]) [1..9]) = False
\r
37 | (c==4) && not (checkDigits ([(s!!3)!!3]++[(s!!3)!!4]++[(s!!3)!!5]++[(s!!4)!!3]++[(s!!4)!!4]++[(s!!4)!!5]++[(s!!5)!!3]++[(s!!5)!!4]++[(s!!5)!!5]) [1..9]) = False
\r
38 | (c==5) && not (checkDigits ([(s!!3)!!6]++[(s!!3)!!7]++[(s!!3)!!8]++[(s!!4)!!6]++[(s!!4)!!7]++[(s!!4)!!8]++[(s!!5)!!6]++[(s!!5)!!7]++[(s!!5)!!8]) [1..9]) = False
\r
39 | (c==6) && not (checkDigits ([(s!!6)!!0]++[(s!!6)!!1]++[(s!!6)!!2]++[(s!!7)!!0]++[(s!!7)!!1]++[(s!!7)!!2]++[(s!!8)!!0]++[(s!!8)!!1]++[(s!!8)!!2]) [1..9]) = False
\r
40 | (c==7) && not (checkDigits ([(s!!6)!!3]++[(s!!6)!!4]++[(s!!6)!!5]++[(s!!7)!!3]++[(s!!7)!!4]++[(s!!7)!!5]++[(s!!8)!!3]++[(s!!8)!!4]++[(s!!8)!!5]) [1..9]) = False
\r
41 | (c==8) && not (checkDigits ([(s!!6)!!6]++[(s!!6)!!7]++[(s!!6)!!8]++[(s!!7)!!6]++[(s!!7)!!7]++[(s!!7)!!8]++[(s!!8)!!6]++[(s!!8)!!7]++[(s!!8)!!8]) [1..9]) = False
\r
42 | otherwise = checkSquares s (c+1)
\r
44 checkCross :: Sudoku -> Integer -> Bool
\r
45 checkCross s c | (c==2) = True
\r
46 | (c==0) && not (checkDigits ([(s!!0)!!0]++[(s!!1)!!1]++[(s!!2)!!2]++[(s!!3)!!3]++[(s!!4)!!4]++[(s!!5)!!5]++[(s!!6)!!6]++[(s!!7)!!7]++[(s!!8)!!8]) [1..9]) = False
\r
47 | (c==1) && not (checkDigits ([(s!!0)!!8]++[(s!!1)!!7]++[(s!!2)!!6]++[(s!!3)!!5]++[(s!!4)!!4]++[(s!!5)!!3]++[(s!!6)!!2]++[(s!!7)!!1]++[(s!!8)!!0]) [1..9]) = False
\r
48 | otherwise = checkSquares s (c+1)
\r
50 checkColors :: Sudoku -> Integer -> Bool
\r
51 checkColors s c | (c==9) = True
\r
52 | (c==0) && not (checkDigits ([(s!!0)!!0]++[(s!!0)!!3]++[(s!!0)!!6]++[(s!!3)!!0]++[(s!!3)!!3]++[(s!!3)!!6]++[(s!!6)!!0]++[(s!!6)!!3]++[(s!!6)!!6]) [1..9]) = False
\r
53 | (c==1) && not (checkDigits ([(s!!1)!!0]++[(s!!1)!!3]++[(s!!1)!!6]++[(s!!4)!!0]++[(s!!4)!!3]++[(s!!4)!!6]++[(s!!7)!!0]++[(s!!7)!!3]++[(s!!7)!!6]) [1..9]) = False
\r
54 | (c==2) && not (checkDigits ([(s!!2)!!0]++[(s!!2)!!3]++[(s!!2)!!6]++[(s!!5)!!0]++[(s!!5)!!3]++[(s!!5)!!6]++[(s!!8)!!0]++[(s!!8)!!3]++[(s!!8)!!6]) [1..9]) = False
\r
55 | (c==3) && not (checkDigits ([(s!!0)!!1]++[(s!!0)!!4]++[(s!!0)!!7]++[(s!!3)!!1]++[(s!!3)!!4]++[(s!!3)!!7]++[(s!!6)!!1]++[(s!!6)!!4]++[(s!!6)!!7]) [1..9]) = False
\r
56 | (c==4) && not (checkDigits ([(s!!1)!!1]++[(s!!1)!!4]++[(s!!1)!!7]++[(s!!4)!!1]++[(s!!4)!!4]++[(s!!4)!!7]++[(s!!7)!!1]++[(s!!7)!!4]++[(s!!7)!!7]) [1..9]) = False
\r
57 | (c==5) && not (checkDigits ([(s!!2)!!1]++[(s!!2)!!4]++[(s!!2)!!7]++[(s!!5)!!1]++[(s!!5)!!4]++[(s!!5)!!7]++[(s!!8)!!1]++[(s!!8)!!4]++[(s!!8)!!7]) [1..9]) = False
\r
58 | (c==6) && not (checkDigits ([(s!!0)!!2]++[(s!!0)!!5]++[(s!!0)!!8]++[(s!!3)!!2]++[(s!!3)!!5]++[(s!!3)!!8]++[(s!!6)!!2]++[(s!!6)!!5]++[(s!!6)!!8]) [1..9]) = False
\r
59 | (c==7) && not (checkDigits ([(s!!1)!!2]++[(s!!1)!!5]++[(s!!1)!!8]++[(s!!4)!!2]++[(s!!4)!!5]++[(s!!4)!!8]++[(s!!7)!!2]++[(s!!7)!!5]++[(s!!7)!!8]) [1..9]) = False
\r
60 | (c==8) && not (checkDigits ([(s!!2)!!2]++[(s!!2)!!5]++[(s!!2)!!8]++[(s!!5)!!2]++[(s!!5)!!5]++[(s!!5)!!8]++[(s!!8)!!2]++[(s!!8)!!5]++[(s!!8)!!8]) [1..9]) = False
\r
61 | otherwise = checkColors s (c+1)