Seite 1 von 2

Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:22
von Blue Flare
hi ich hab folgendes problem:

ich muss prüfen ob es sich um ein gültiges Sudoku handelt:

hier mein code:

Code: Alles auswählen

def nach_rechts_pruefen(p_liste):
    leere_liste = []
    wahr = True
    liste = [1,2,3,4,5,6,7,8,9]
    for i in range(0,9,1):
        leere_liste = p_liste[i]
        leere_liste = sorted(leere_liste)
        for j in range(0,9,1):
            if leere_liste[i] != liste[i]:
                wahr = False
    print(wahr)
            
    




#******************************************************

liste = [[7,4,2,6,5,9,3,1,8], [5,1,9,4,8,3,6,2,7], [8,3,6,1,2,7,5,9,4],
         [4,6,1,5,7,8,9,3,2], [3,8,5,2,9,4,1,7,6], [9,2,7,3,1,6,4,8,5],
         [6,7,3,9,4,2,8,5,1], [2,5,4,8,3,1,7,6,9], [1,9,8,7,6,5,2,4,3] ]

nach_rechts_pruefen(liste)
wenn es sich um ein richtiges sudoku handelt sprich

liste = [[7,4,2,6,5,9,3,1,8]] printet er mir True was ja richtig ist ;)
aber wenn es sich um ein falsches handelt so wie oben printet er mir auch True -.-
kann mir iwer sagen was da falsch ist ???

lg Blue Flare

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:23
von Blue Flare
was ich noch vergessen habe:

hier soll ich nur mal prüfen ob die zeilen stimmen...

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:30
von Hyperion
Blue Flare hat geschrieben: hier soll ich nur mal prüfen ob die zeilen stimmen...
Wie wäre es dann, einfach eine Menge (set(zeile)) zu benutzen? Wenn die Menge weniger als 9 Einträge besitzt, dann muss eine Zahl doppelt vorgekommen sein und damit wäre es kein gültiges Sudoku mehr.

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:33
von Blue Flare
dürfen wir leider nicht verwenden -.-

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:36
von deets
versuch's mal damit:

- sortieren
- feststellen, ob liste[0] == 1 und liste[-1] == 9
- feststellen, ob len(liste) == 9
- feststellen, ob fuer alle elemente in der liste das element danach um eines groesser ist.

wenn eine der 3 tests fehlschlaegt, ist deine Zeile ungueltig.

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:40
von Barabbas
@Blue Flare:

Ich wundere mich etwas: Eine gute Idee hast du ja eigentlich: Du hast eine Referenzliste (1-9) und möchtest nun jede Zeile im Sudoku damit vergleichen. Das machst du aber dann doch recht umständlich. Du kannst doch einfach über die Zeilen (p_liste) iterieren und jede Zeile dann direkt mit der Referenzliste 1-9 vergleichen. Da benötigst du dann auch keine Sets etc.

Also als Pseudocode zur Anregung :)

Code: Alles auswählen

ref_liste = [1, 2, 3, 4, 5, 6, 7, 8, 9] # Tipp: range(1,10)
für_jede Zeile in Sudoku:
    wenn Zeile != ref_liste:
        gebe_zurück Falsch
gebe_zurück Richtig

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:40
von Hyperion
Ich bins mal so angegangen:

Code: Alles auswählen

In [14]: sudoku_valid = [
   ....:     [7,4,2,6,5,9,3,1,8],
   ....:     [5,1,9,4,8,3,6,2,7],
   ....:     [8,3,6,1,2,7,5,9,4],
   ....:     [4,6,1,5,7,8,9,3,2],
   ....:     [3,8,5,2,9,4,1,7,6],
   ....:     [9,2,7,3,1,6,4,8,5],
   ....:     [6,7,3,9,4,2,8,5,1],
   ....:     [2,5,4,8,3,1,7,6,9],
   ....:     [1,9,8,7,6,5,2,4,3]
   ....: ]

In [15]: all(map(lambda count: True if count == 9 else False, map(len, map(set, sudoku_valid))))
Out[15]: True


In [16]: sudoku_invalid = [
   ....:     [7,4,2,6,5,9,3,1,8],
   ....:     [5,1,9,4,8,3,6,2,7],
   ....:     [8,3,6,1,2,7,5,9,4],
   ....:     [4,6,1,5,7,8,9,3,2],
   ....:     [3,8,5,2,9,4,1,7,6],
   ....:     [9,2,7,3,1,6,4,8,5],
   ....:     [6,7,3,9,4,2,8,5,1],
   ....:     [2,5,4,8,3,1,7,6,9],
   ....:     [1,1,8,7,6,5,2,4,3]
   ....: ]

In [17]: all(map(lambda count: True if count == 9 else False, map(len, map(set, sudoku_invalid))))
Out[17]: False

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:46
von Blue Flare
Hyperion danke für deine hilfe, jedoch haben wir das noch nicht gelernt und dürfen es somit noch nicht benutzen sry -.-

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:46
von Hyperion
@Barabbas: Das klappt so nicht, da die Zeilen ja alle unterschiedlich sein müssen! ;-)

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:50
von Hyperion
Ok, Hausaufgabe... na dann werfe ich mal sum() ein ;-) Mit meinem Ansatz ist das einfach verwurstbar!

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:52
von deets
@Hyperion

Barabas muss noch sortieren, aber er hat recht. Wenn du alle Zeilen & Spalten so pruefst, bist du da. Das sortieren ist ja im grunde nix anderes, als die Mengen-Operation ein bisschen durch Brust & Auge. Und wenn das Sudoku ungueltig ist, dann hat es irgendwo dubletten - egal, an welcher Stelle die sind. Du verlierst also nichts.

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:54
von Hyperion
deets hat geschrieben:@Hyperion

Barabas muss noch sortieren, aber er hat recht. Wenn du alle Zeilen &
Aber vom Sortieren oder dem Prüfen der Spalten hat er ja grad nix geschrieben ;-)

Ich finde ja meine Idee mit der Aufsummierung ganz gut ehrlich gesagt... jaja, Eigenlob... :mrgreen:

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:56
von Blue Flare

Code: Alles auswählen

for j in range(0,9,1):
for i in range(0,9,1):
    if liste[j] == liste[i]
da wird doch dann geprüft ob sich in einer zeile 2 zahlen vorkommen, sprich ob welche doppelt sind und dann returne ich False

mom ich probier das mal aus^^

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 12:59
von Barabbas
*hust* sorted() hatte ich vergessen, offensichtlich. Aber falls Zweifel an meiner Zurechnungsfähigkeit bestehen, kann ich versichern, dass in iPython zuvor mit sorted() implementiert zu haben. :) Ich wollte dem TE nur keine fertige Lösung liefern.

Besten Gruß,

brb

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 13:01
von Hyperion
Blue Flare hat geschrieben:

Code: Alles auswählen

for j in range(0,9,1):
for i in range(0,9,1):
    if liste[j] == liste[i]
da wird doch dann geprüft ob sich in einer zeile 2 zahlen vorkommen, sprich ob welche doppelt sind und dann returne ich False
Nö! ;-)

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 13:04
von Blue Flare

Code: Alles auswählen

def nach_rechts_pruefen(p_liste):
    leere_liste = []
    wahr = True
    liste = [1,2,3,4,5,6,7,8,9]
    for i in range(0,1,1):
        leere_liste = p_liste[i]
        leere_liste = sorted(leere_liste)
        for j in range(0,9,1):
            if leere_liste[i] == leere_liste[j]:
                wahr = False
    print(wahr)

#***************************

liste = [[7,4,2,6,5,9,3,1,8]]


nach_rechts_pruefen(liste)

um es mal leichter zu machen habe ich jz mal nur eine zeile genommen
diese wäre ja richtig...
aber er schreibt mir immer False ???

wieso ??? hilfe !

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 13:08
von Blue Flare
ich hab's jetzt^^

Code: Alles auswählen

def nach_rechts_pruefen(p_liste):
    leere_liste = []
    wahr = False
    liste = [1,2,3,4,5,6,7,8,9]
    for i in range(0,1,1):
        leere_liste = p_liste[i]
        leere_liste = sorted(leere_liste)
        for j in range(0,9,1):
            if leere_liste == liste:
                wahr = True
    print(wahr)

#***************************

liste = [[2,4,2,6,5,9,3,1,8]]


nach_rechts_pruefen(liste)

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 13:13
von Hyperion
Vergiss doch mal den Code und und überlege Dir eine Strategie, wie Du Dein Ziel erreichen kannst!

Du mischst hier zig Ansätze durcheinander... da ist für mich keine klare Strategie erkennbar.

Schreib es doch mal so auf, wie deets es vorgemacht hat, also alles in Prosa oder ggf. Pseudo-Code. Dann nimm Dir mal eine beliebige Zeile und teste den Algo mit den konkreten Zahlen einfach mal durch. Danach überlege Dir, wie man die einzelnen Schritte in Python formulieren würde.

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 13:14
von Hyperion
Ich glaube nicht, dass Dein Code korrekt ist:

Code: Alles auswählen

for i in range(0,1,1):
Dafür kann man auch einfach "i=0" schreiben ;-)

Re: Sudoku Zeilen

Verfasst: Montag 4. April 2011, 13:15
von Xynon1
Das schreit ja förmlich nach numpy:

Code: Alles auswählen

>>> import numpy
>>> array = numpy.array([[7,4,2,6,5,9,3,1,8], [5,1,9,4,8,3,6,2,7], [8,3,6,1,2,7,5,9,4],   
                         [4,6,1,5,7,8,9,3,2], [3,8,5,2,9,4,1,7,6], [9,2,7,3,1,6,4,8,5],
                         [6,7,3,9,4,2,8,5,1], [2,5,4,8,3,1,7,6,9], [1,9,8,7,6,5,2,4,3]])
>>> all(all(map(lambda x: x==45, array.sum(xy))) for xy in (0, 1))
True
@Hyperion
Ist ja deinem Ansatz sehr ähnlich.