Sudoku Zeilen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Blue Flare
User
Beiträge: 21
Registriert: Dienstag 7. September 2010, 18:34

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
Blue Flare
User
Beiträge: 21
Registriert: Dienstag 7. September 2010, 18:34

was ich noch vergessen habe:

hier soll ich nur mal prüfen ob die zeilen stimmen...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Blue Flare
User
Beiträge: 21
Registriert: Dienstag 7. September 2010, 18:34

dürfen wir leider nicht verwenden -.-
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.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

@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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Blue Flare
User
Beiträge: 21
Registriert: Dienstag 7. September 2010, 18:34

Hyperion danke für deine hilfe, jedoch haben wir das noch nicht gelernt und dürfen es somit noch nicht benutzen sry -.-
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Barabbas: Das klappt so nicht, da die Zeilen ja alle unterschiedlich sein müssen! ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ok, Hausaufgabe... na dann werfe ich mal sum() ein ;-) Mit meinem Ansatz ist das einfach verwurstbar!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Blue Flare
User
Beiträge: 21
Registriert: Dienstag 7. September 2010, 18:34

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^^
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

*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
Zuletzt geändert von Barabbas am Montag 4. April 2011, 13:02, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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ö! ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Blue Flare
User
Beiträge: 21
Registriert: Dienstag 7. September 2010, 18:34

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 !
Blue Flare
User
Beiträge: 21
Registriert: Dienstag 7. September 2010, 18:34

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)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten