Hi, Ich bin noch neu in Haskell und hab die Aufgabe eines Sudokus vor mir,die genaue Aufgabenstellung lautet:
schreiben Sie ein Haskell-Programm zur Lösung von Sudokus.
Zur Erleichterung werden folgende Annahmen gemacht:
1. In jeder Zeile fehlt nur ein Wert.
2. Fehlende Werte werden durch eine 0 dargestellt.
3. Die Funktion zum Lösen des Sudokus soll vom Typ
"
Sudoku\ sein.
4. Der Typ
"
Sudoku\ ist folgendermaen deniert:
1 type Sudoku = [ [Wert ] ] -> [ [Wert ] ]
5. Der Typ von
"
Wert\ soll in diesem Beispiel Integer sein.
6. Es kann davon ausgegangen werden, dass ein korrektes Sudoku als Ratsel vorliegt (Es muss
also nicht jedes 3er-Quadrat und jede Spalte zusatzlich gepruft werden, sondern es reicht
aus in jeder Zeile zu prufen, ob die Zahlenwerte von 1 bis 9 vorkommen.)
Ein Sudoku sieht dann zum Beispiel folgendermaen aus:
5 3 0 6 7 8 9 1 2
6 0 2 1 9 5 3 4 8
0 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 0
4 2 6 0 5 3 7 9 1
7 1 3 9 2 4 8 0 6
9 6 1 0 3 7 2 8 4
2 8 0 4 1 9 6 3 5
3 4 5 2 8 0 1 7 9
In Haskell wird das ganze wie folgt dargestellt:
1 b e i s p i e l =
2 [ [ 5 , 3 , 0 , 6 , 7 , 8 , 9 , 1 , 2 ] , [ 6 , 0 , 2 , 1 , 9 , 5 , 3 , 4 , 8 ] , [ 0 , 9 , 8 , 3 , 4 , 2 , 5 , 6 , 7 ] ,
3 [ 8 , 5 , 9 , 7 , 6 , 1 , 4 , 2 , 0 ] , [ 4 , 2 , 6 , 0 , 5 , 3 , 7 , 9 , 1 ] , [ 7 , 1 , 3 , 9 , 2 , 4 , 8 , 0 , 6 ] ,
4 [ 9 , 6 , 1 , 0 , 3 , 7 , 2 , 8 , 4 ] , [ 2 , 8 , 0 , 4 , 1 , 9 , 6 , 3 , 5 ] , [ 3 , 4 , 5 , 2 , 8 , 0 , 1 , 7 , 9 ] ]
Gelost ergibt sich folgendes Ergebnis:
1 Main> sudoku b e i s p i e l
2 [ [ 5 , 3 , 4 , 6 , 7 , 8 , 9 , 1 , 2 ] , [ 6 , 7 , 2 , 1 , 9 , 5 , 3 , 4 , 8 ] , [ 1 , 9 , 8 , 3 , 4 , 2 , 5 , 6 , 7 ] ,
3 [ 8 , 5 , 9 , 7 , 6 , 1 , 4 , 2 , 3 ] , [ 4 , 2 , 6 , 8 , 5 , 3 , 7 , 9 , 1 ] , [ 7 , 1 , 3 , 9 , 2 , 4 , 8 , 5 , 6 ] ,
4 [ 9 , 6 , 1 , 5 , 3 , 7 , 2 , 8 , 4 ] , [ 2 , 8 , 7 , 4 , 1 , 9 , 6 , 3 , 5 ] , [ 3 , 4 , 5 , 2 , 8 , 6 , 1 , 7 , 9 ] ]
Ich würde jetzt versuchen irgentwie die fehlende Zahl durch [1..9]-[summe der beispielliste] zu ermitteln, und dann die null zu eliminieren, aber dass kann ich mit dem ersten element der Liste, aber wie komm ich dann an das 2. ran u.s.w und wie füg ich das dann zu einer Liste zusammen? bzw. ist mein Ansatz überhaupt okay?
liebe Grüße,
Chirotocxa
schreiben Sie ein Haskell-Programm zur Lösung von Sudokus.
Zur Erleichterung werden folgende Annahmen gemacht:
1. In jeder Zeile fehlt nur ein Wert.
2. Fehlende Werte werden durch eine 0 dargestellt.
3. Die Funktion zum Lösen des Sudokus soll vom Typ
"
Sudoku\ sein.
4. Der Typ
"
Sudoku\ ist folgendermaen deniert:
1 type Sudoku = [ [Wert ] ] -> [ [Wert ] ]
5. Der Typ von
"
Wert\ soll in diesem Beispiel Integer sein.
6. Es kann davon ausgegangen werden, dass ein korrektes Sudoku als Ratsel vorliegt (Es muss
also nicht jedes 3er-Quadrat und jede Spalte zusatzlich gepruft werden, sondern es reicht
aus in jeder Zeile zu prufen, ob die Zahlenwerte von 1 bis 9 vorkommen.)
Ein Sudoku sieht dann zum Beispiel folgendermaen aus:
5 3 0 6 7 8 9 1 2
6 0 2 1 9 5 3 4 8
0 9 8 3 4 2 5 6 7
8 5 9 7 6 1 4 2 0
4 2 6 0 5 3 7 9 1
7 1 3 9 2 4 8 0 6
9 6 1 0 3 7 2 8 4
2 8 0 4 1 9 6 3 5
3 4 5 2 8 0 1 7 9
In Haskell wird das ganze wie folgt dargestellt:
1 b e i s p i e l =
2 [ [ 5 , 3 , 0 , 6 , 7 , 8 , 9 , 1 , 2 ] , [ 6 , 0 , 2 , 1 , 9 , 5 , 3 , 4 , 8 ] , [ 0 , 9 , 8 , 3 , 4 , 2 , 5 , 6 , 7 ] ,
3 [ 8 , 5 , 9 , 7 , 6 , 1 , 4 , 2 , 0 ] , [ 4 , 2 , 6 , 0 , 5 , 3 , 7 , 9 , 1 ] , [ 7 , 1 , 3 , 9 , 2 , 4 , 8 , 0 , 6 ] ,
4 [ 9 , 6 , 1 , 0 , 3 , 7 , 2 , 8 , 4 ] , [ 2 , 8 , 0 , 4 , 1 , 9 , 6 , 3 , 5 ] , [ 3 , 4 , 5 , 2 , 8 , 0 , 1 , 7 , 9 ] ]
Gelost ergibt sich folgendes Ergebnis:
1 Main> sudoku b e i s p i e l
2 [ [ 5 , 3 , 4 , 6 , 7 , 8 , 9 , 1 , 2 ] , [ 6 , 7 , 2 , 1 , 9 , 5 , 3 , 4 , 8 ] , [ 1 , 9 , 8 , 3 , 4 , 2 , 5 , 6 , 7 ] ,
3 [ 8 , 5 , 9 , 7 , 6 , 1 , 4 , 2 , 3 ] , [ 4 , 2 , 6 , 8 , 5 , 3 , 7 , 9 , 1 ] , [ 7 , 1 , 3 , 9 , 2 , 4 , 8 , 5 , 6 ] ,
4 [ 9 , 6 , 1 , 5 , 3 , 7 , 2 , 8 , 4 ] , [ 2 , 8 , 7 , 4 , 1 , 9 , 6 , 3 , 5 ] , [ 3 , 4 , 5 , 2 , 8 , 6 , 1 , 7 , 9 ] ]
Ich würde jetzt versuchen irgentwie die fehlende Zahl durch [1..9]-[summe der beispielliste] zu ermitteln, und dann die null zu eliminieren, aber dass kann ich mit dem ersten element der Liste, aber wie komm ich dann an das 2. ran u.s.w und wie füg ich das dann zu einer Liste zusammen? bzw. ist mein Ansatz überhaupt okay?
liebe Grüße,
Chirotocxa
Comment