www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

franzigoth1

Gepostet:
06.12.2007 16:23

Sudoku in Haskell???  
Hallo ihr,....

Ich mache geade ein rogrammierpraktikum in Haskell und weiß nicht mehr weiter.
Ich soll eine Sudoku in Haskell implementieren.
Eine Vorlage soll implementiert werden, etwa so:
v = [[0,2,3,5,8,9,7,4,6],
[4,0,8,6,7,3,5,2,1],
[6,5,0,4,1,2,3,9,8],
[2,1,5,0,3,8,4,6,9],
[7,3,4,9,0,1,8,5,2],
[9,8,6,2,4,0,1,7,3],
[3,7,2,8,5,6,0,1,4],
[5,6,1,3,9,4,2,0,7],
[8,4,9,1,2,7,6,3,0]]

und Haskell soll die stellen, wo eine Null steht in die richtigen Zahlen umwandel, etwa so:
sudoku v ==
[[1,2,3,5,8,9,7,4,6],
[4,9,8,6,7,3,5,2,1],
[6,5,7,4,1,2,3,9,8],
[2,1,5,7,3,8,4,6,9],
[7,3,4,9,6,1,8,5,2],
[9,8,6,2,4,5,1,7,3],
[3,7,2,8,5,6,9,1,4],
[5,6,1,3,9,4,2,8,7],
[8,4,9,1,2,7,6,3,5]]

Dies war noch eine Vorgabe:

type Vorgaben = [[Wert]]
type Loesung = [[Wert]]
type Sudoku = Vorgaben->Loesung
type Wert = Int


Hab sehr lange im Internet geschaut, hat mir aber nicht wirklich geholfen.
Hat einer von euch eine Idee, wie man das machen kann.
Danke schon mal.....
Zum Seitenanfang ICQ    
 
Siracusa

Gepostet:
06.12.2007 22:22

   
Hallo du! :-)

Also wenn die Vorgaben alle so einfach sind, die das Beispiel, sollte die Funktion nicht so schwer sein, wie z.B. für "richtige" Sudokus. Denn so brauchst du nur alle Listen einzeln durchgehen, mit der Funktion sum die Summe der Liste berechnen, diese Summe von 45 abziehen (denn sum [1..9] = 45) und erhältst damit die fehlende Zahl. Eine zweite Funktion geht nun jede Liste nochmal durch und sucht die Position, wo die 0 steht. Dort ersetzt sie die 0 durch die fehlende Zahl. Alle diese resultierenden Listen werden in der richtigen Reihenfolge wieder zu einer Liste von Listen verbunden und du erhältst das gelöste Sudoku.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
franzigoth1

Gepostet:
10.12.2007 17:07

   
danke für die Hilfe.....!!!!!! ;-)
Zum Seitenanfang ICQ    
 
franzigoth1

Gepostet:
25.12.2007 13:58

Lösungsansatz?  
Hi...

Ich hab mal eine Implementierung zum Sudoku geschrieben:

type Vorgaben = [[Wert]]
type Loesung = [[Wert]]
type Sudoku = Vorgaben->Loesung
type Wert = Int

sudoku::Sudoku
sudoku a = []
x = [1,2,3,4,5,6,7,8,9]

f a1 = einfüge (fehlt x (quicksort a1)) a1 --Gibt vollstänige Liste heraus, wo vorher noch eine Zahl gefehlt hat.

quicksort [] = []
quicksort [a] = [a]
quicksort (a:l) = (quicksort l1) ++ (a:quicksort l2)
where (l1,l2) = sep a l
sep a [] = ([],[])
sep a (x:l)
| x<a = (x:l1,l2)
| otherwise = (l1, x:l2)
where (l1,l2) = sep a l

fehlt (x:y) (a:b)
| a == 0 = fehlt (x:y) b
| x == a = fehlt y b
| x /= a = x

einfüge x (t:r)
| t /= 0 = t:(einfüge x r)
| t == 0 = x:r


Damit kann man eine fehlende Zahl in einer Liste rausbekommen, das Problem, wenn zum Beispiel mehrere Fehlen in einer Reihe, dann funktioniert es nicht ganz....
Wie kann man bestimmte Elemente aus einer Liste nehmen und diese Vergleichen???
Kann einer Helfen...
Zum Seitenanfang ICQ    
 
Siracusa

Gepostet:
27.12.2007 16:20

   
Hallo,

stimmt, wenn mehrere Zahlen fehlen, wird das Problem ungleich schwerer. Dann reicht es nämlich nicht nur innerhalb der Liste die fehlenden Zahlen zu suchen, sondern auch zwischen den Listen (also vertikal) zu schauen, ob die Zahl paßt. Oder sogar nur über bestimmte Bereiche von drei Listen verteilt zu suchen, weil es beim Sudoku ja auch noch diese 3x3-Kästchen-Regel gibt.

Das i-te Element einer Liste bestimmst du mit liste !! i (Zählung beginnt bei 0!). Vergleichen geht dann ganz normal (liste !! i) == (liste !! j).


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Christian

Gepostet:
27.01.2008 18:12

Bitte an Siracusa  
Hallo

Du hast mir immer sehr geholfenbei Haskell. hast du auch Ahnung von Prologprogrammierung.

Ich muss ein Schachspiel programmieren als Testat und weiss nicht ob meine Lösung richtig ist. Ich habe Probleme bei der den Abfragen.

Christian
Zum Seitenanfang    
 
Siracusa

Gepostet:
27.01.2008 22:35

   
Hallo,

naja nicht soviel wie von Haskell, aber ich hab auch schonmal ein kleineres Spiel in Prolog programmiert. Also entweder postest du dein Problem im Prolog-Forum (auf www.coder-forum.eu) oder du schreibst mich per ICQ an.


Viele Grüße,

Siracusa
Zum Seitenanfang