]> git.somenet.org - pub/jan/funcprog.git/blob - Aufgabe8.hs
GITOLITE.txt
[pub/jan/funcprog.git] / Aufgabe8.hs
1 type Row=[Integer]\r
2 type Sudoku=[Row]\r
3 \r
4 data Variant = Basic | Cross | Color deriving (Eq,Show)\r
5 \r
6 -- Bsp 8.2 a)\r
7 \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
14             | otherwise = True\r
15 \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
20 \r
21 checkRows :: Sudoku -> Bool\r
22 checkRows [] = True\r
23 checkRows (row:xs) | not (checkDigits row [1..9]) = False\r
24                    | otherwise = checkRows xs\r
25 \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
30 \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
43 \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
49 \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)