Sudoku-Checker in Python
Ich versuche zu erstellen, ein sudoku-checker in python:
ill_formed = [[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],
[8,5,9,7,6,1,4,2,3],
[4,2,6,8,5,3,7,9], # <---
[7,1,3,9,2,4,8,5,6],
[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]]
easy = [[2,9,0,0,0,0,0,7,0],
[3,0,6,0,0,8,4,0,0],
[8,0,0,0,4,0,0,0,2],
[0,2,0,0,3,1,0,0,7],
[0,0,0,0,8,0,0,0,0],
[1,0,0,9,5,0,0,6,0],
[7,0,0,0,9,0,0,0,1],
[0,0,1,2,0,0,3,0,6],
[0,3,0,0,0,0,0,5,9]]
Ich erwarte Eingabe - eine Liste von 9 Listen. Die Nullen repräsentieren Zahl, die noch nicht gefüllt sind, in durch den Benutzer. Sie können mehrfach in einer Zeile, Spalte oder 3x3.
def check_sudoku(grid):
if len(grid) == 9:
numsinrow = 0
for i in range(9):
if len(grid[i]) == 9:
numsinrow += 1
if numsinrow == 9:
for i in range(9):
rowoccurence = [0,0,0,0,0,0,0,0,0,0]
for j in range(9):
rowoccurence[grid[i][j]] += 1
temprow = rowoccurence[1:10]
if temprow == [1,1,1,1,1,1,1,1,1]:
return True
else:
return False
else:
return False
else:
return False
Ich offensichtlich brauche, um zu überprüfen, dass es eine 9x9 Liste von Listen (grid), und dass es keine Duplikate in jeder Reihe, Spalte und 3x3 kleines Quadrat. In den code habe ich zunächst überprüfen, um zu sehen, ob es eine richtige Anzahl von Zeilen (Es sollten 9 sein). Dann überprüfe ich, dass jede Zeile hat 9 Elemente in es (mit dem ill_formed Beispiel sehen Sie, dass dies nicht der Fall ist). Ich habe dann versucht zu überprüfen, Duplikate in jeder Reihe, aber ich bin mit einigen Schwierigkeiten zu tun. Ich dachte, ich könnte-Schleife über jede Zeile und Schleife über jedes element in dieser Zeile, und fügen Sie 1, um eine Liste von int-Werten (rowoccurence). Zum Beispiel, wenn die erste Zahl ist eine 2, dann rowoccurence[2] gleich 1 ist. Die Nullen sind in rowoccurence[0] und werden nicht überprüft(ich habe eine temporäre Liste, die sollten alles nehmen, außer dass das erste element - die Nullen - da könnte es mehr als 1 null in einer Zeile und das Gitter könnte noch echt sein). Probiere ich die temp-Liste (im Grunde rowoccurence) gegen eine Referenz-Liste der richtigen Werte, aber es scheint nicht zu funktionieren. Könnten Sie mir helfen, überprüfen Sie die Zeilen, die Duplikate in diesem sudoku-checker? Vielen Dank im Voraus!
Eh,
Counter
nützlich sein wird.Was bedeutet "scheint nicht zu funktionieren"? Was schief geht, und wo? Was Beispieldaten sind Sie versuchen, es auf, was Sie erwarten, es zu tun, und was tut Sie stattdessen? Ist
easy
soll zurück True
oder False
?Sollte die überprüfung fehlschlagen, wenn das Gitter nicht vollständig ausgefüllt oder nur, wenn mehr als eine Zahl von 1 bis 9 gefunden wird?
InformationsquelleAutor quagpwn | 2013-07-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denken Sie daran, Sie sind nicht der Suche nach Duplikaten -- nur ungleich null Duplikate. Fazit ein set funktioniert. Sie können auch überprüfen Sie die Rechtmäßigkeit der Zeile/Spalte in der gleichen Zeit:
max(l)+1 == 10 == len(set([0]+l))
könnte schneller sein.das ist eine schnelle (wenn auch verwirrend für mich) Möglichkeit, zu überprüfen, ob eine Zeile ist eine gültige Antwort, die Zeile in ein sudoku, aber der OP lediglich wissen will, ob eine Zeile ist noch nicht ungültig. d.h. Nullen, repräsentieren Leerzeichen, muss erlaubt sein.
+1, das war, was ich war nicht sicher, danke.
InformationsquelleAutor llb
Du
return True
zu früh, so dass Sie gar nie auf den test, den Sie hoffen, um zu sehen, fail:Misc sonstige Hinweise: eine einfache Möglichkeit, um sicherzustellen, dass alle Elemente einer vector sind gleich einige Konstanten ist:
eine Andere, noch einfacher: wenn(schlechte Idee, siehe Kommentar unten.)vec[1:10]
sind alle auf 1, dannsum(vec[1:10])
muss 9 sein.vec[1:10]
ist[0, 1, 2, 0, 1, 2, 0, 1, 2]
, dannsum(vec[1:10])
wäre auch 9.guter Punkt, besser, etwas zu verwenden, wie
all
oder der direkte test.InformationsquelleAutor torek
Definieren Sie eine Funktion, um zu überprüfen, dass keine Duplikate vorhanden sind, dann können Sie es verwenden, um zu überprüfen, Zeilen, Spalten und 3x3-raster. Reduzieren Sie die verschachtelte Blöcke durch Rücksendung früh, wenn eine Bedingung nicht erfüllt, zum Beispiel die Anzahl der Zeilen, die größer sind als 9. Und nur true zurückgeben, die ganz am Ende der Funktion, wenn keine der Prüfungen scheitern.
len(set([0]+l)) == len([0]+l)
zu prüfen, für die keine dupes?es sind Nullen werden ignoriert, und überprüfen Sie auch für zahlen größer als 9 ist
all(n in range(1,10) for n in l)
Kontrollen für alles, was nicht rechts.Ich glaube, meine Antwort ist OK für einen Anfänger. Auf der anderen Seite, wie funktioniert
all
überprüfen, gibt es keine Duplikate?Hoppla, Ihr Recht.
InformationsquelleAutor perreal
Ich bin nur dieses posting, weil die meisten anderen Lösungen sind kaum lesbar, obwohl Sie vielleicht wirklich effizient. Für jemanden, der neu ist und nur versucht zu lernen, ich glaube, dass der folgende code ist hilfreich und sehr gut lesbar. Hoffe, das hilft jedermann, das schaut, um zu erlernen, wie man ein sudoku-checker.
InformationsquelleAutor Clever Programmer
Nur überprüfen Sie nach jeder Zeile/Spalte mit:
oder für python 3
Stell ich mir die Laufzeit wird dominiert durch das erstellen einer neuen Liste (ob Sie das Histogramm-Ansatz oder die Sortier-Ansatz), damit der zusätzliche Faktor von log(n) sollte nicht spürbar sein
Um zu prüfen, jede Zeile,Spalte und subsquare, ich schlage vor, dass extractor Methoden, die die N-te Zeile, Spalte und subsquare aus der matrix (dh nicht versuchen, und setzen Sie alles in einer Methode).
So zum Beispiel:
O(log n)
im schlimmsten Fall?Ich sagte extra Faktor von O(logn), was bedeutet es dauern, log n mal so lang wie der Histogramm-Ansatz
InformationsquelleAutor dspyz
Ich glaube, der Grund, Ihren code der Kollaps, weil Ihre Einzug. Das sollten Sie tun:
Statt:
Oder verwenden Sie
Counter
:InformationsquelleAutor zhangyangyu
Ok Jungs, ich bin zurück mit einer Funktion prüfen, die Zeilen, die funktioniert. Ich danke Euch so sehr für all die Hilfe. Ich bin sozusagen ein noob in diesem, so dass ich nicht verstehen, einige Antworten, aber ich merkte, dass ich true zurückgeben viel zu früh. Ich erkannte auch, dass, wenn es mehrere Nullen in einer Zeile, dann ein paar zahlen würden nicht kommen in der rowoccurence/temp-Liste. Dies ist der Grund, warum ich hatte zu prüfen, für die sowohl 1 und 0 in der rowoccurence/temp-Liste. Ich habe auch geschrieben eine ähnliche Funktion zum überprüfen der Spalten. Nochmals vielen Dank!
InformationsquelleAutor quagpwn
Wenn Sie prüfen wollen, eine Zeile für Duplikate, statt
count:
Dein Ansatz ist ein wenig mehr als nur doppelte überprüfung, es sorgt auch dafür, dass nur eine einstellige Zahl vorhanden sind, sonst eine out-of-bound-exception wird ausgelöst,
sprechen eine input-Größe 9, so dass es ein n^2-Algorithmus ist nicht wirklich wichtig. aber es ist viel einfacher zu Lesen und zu verstehen
Die OP zeigte einige code, der nicht funktioniert, und gefragt, warum nicht. Sie bot anderen code, ohne Erklärung, das macht genau das gleiche wie sein code. Wie ist das hilfreich?
InformationsquelleAutor Moh Zah
Schrieb eine einfache Klasse für ein Modell eines (ausgefüllten) Sudoku-Brett. Nichts schwierig, aber eine einfache Lösung für ein 9x9-Brett.
InformationsquelleAutor Adam Donahue