Gepostet: |
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 | ||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||
Gepostet: |
|||||||||||
danke für die Hilfe.....!!!!!! ;-) | |||||||||||
Zum Seitenanfang | ICQ | ||||||||||
Gepostet: |
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 | ||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||
Gepostet: |
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 | |||||||||||
Gepostet: |
|||||||||||
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 | |||||||||||