Erstellen Sie eine Sudoku-Lösung CHECKER
Es gibt unzählige Sudoku-LÖSER hier, aber ich möchte, dass Sie eine Lösung erstellen, die so klein wie möglich ist (Code-Golf).
Ein gültiger Eintrag kann entweder ein 9x9-Array als Argument verwenden (als Referenz übergeben, in der Befehlszeile serialisiert oder wie auch immer Sie es verwenden möchten) oder eine Eingabedatei akzeptieren, die neun Zeilen mit neun Zahlen für das endgültige Raster enthält . Beispiele für Eingaben finden Sie weiter unten.
Gültige Eingaben sollten Zahlen zur Basis 10 (1-9) sein.
Fehlende, leere, zusätzliche, nicht numerische Positionen oder Positionen mit Zahlen außerhalb von 1-9 sollten als ungültige Eingabe zurückgewiesen werden, indem ein Ergebnis ungleich Null zurückgegeben wird, ein Fehler gedruckt wird oder beides.
Ihr Programm muss testen, ob jede Zahl einmal pro Spalte, einmal pro Zeile und einmal pro 3x3-Teilraster erscheint. Wenn es erfolgreich ist, geben Sie "0" zurück, und wenn nicht, geben Sie ein Ergebnis ungleich Null zurück.
Die Verwendung externer Ressourcen (Websites usw.) ist zu vermeiden.
Wenn es sich bei Ihrer Lösung um ein eigenständiges Programm handelt, ist das Beenden mit dem Status "Bestanden" oder "Nicht bestanden" oder "Nicht bestanden" oder "Nicht bestanden" oder nicht bestanden "in Ordnung.
Lass die kleinste Antwort gewinnen!
Eingabebeispiele:
c array:
int input[9][9]={{1,2,3,4,5,6,7,8,9},
{4,5,6,7,8,9,1,2,3},
{7,8,9,1,2,3,4,5,6},
{2,3,1,5,6,4,8,9,7},
{5,6,4,8,9,7,2,3,1},
{8,9,7,2,3,1,5,6,4},
{3,1,2,6,4,5,9,7,8},
{6,4,5,9,7,8,3,1,2},
{9,7,8,3,1,2,6,4,5}
};
Datei:
123456789
456789123
789123456
231564897
564897231
897231564
312645978
645978312
978312645
Die 9 Teilraster:
+---+---+---+
|123|456|789|
|456|789|123|
|789|123|456|
+---+---+---+
|231|564|897|
|564|897|231|
|897|231|564|
+---+---+---+
|312|645|978|
|645|978|312|
|978|312|645|
+---+---+---+
quelle
1
oder-1
Python, 103
Ich hasse Sudoku.
So funktioniert es: Jede Zeile, Spalte und jeder Block muss eine Zahl von 1 bis 9 haben
0 <= i, j < 9
. Die Zellei,j
befindet sich also für jeden Block3*floor(i/3) + floor(j/3)
. Somit sind 243 Anforderungen zu erfüllen. Ich mache jede Anforderung zu einem Tupel,((item index,item type number),symbol)
wobeiitem index
eine Zahl zwischen 0 und 8 (einschließlich),item type number
0,1 oder 2 für Zeile, Spalte oder Block undsymbol
der Eintrag istb[i][j]
.Bearbeiten: Ich habe fälschlicherweise nicht nach gültigen Einträgen gesucht. Jetzt mache ich.
quelle
0
wenn die Lösung erfolgreich ist, nichtTrue
APL (46)
Dies erfordert eine 9-mal-9-Matrix. Das Beispiel kann in TryAPL folgendermaßen eingegeben werden:
Erläuterung:
↓⍉⍵
: Holen Sie sich die Spalten von⍵
,↓⍵
: Holen Sie sich die Reihen von⍵
,3/3⌿3 3⍴Z←⍳9
: Erstelle eine 3-mal-3-Matrix mit den Zahlen1
bis9
und dreifache jede Zahl in beide Richtungen, um eine 9-mal-9-Matrix mit den Zahlen1
für9
jede Gruppe zu erhalten.Z∘.=
: Für jede Zahl1
zu9
, eine Bitmaske für die gegebene Gruppe machen,/∘(,⍵)¨
: und maskiere⍵
mit jedem, gib die Gruppen von⍵
.∊∘Z¨
: für jedes Sub-Array, sehen Sie, ob es die Zahlen1
zu enthält9
,∧/,↑
: Nehmen Sie die Logikand
aller dieser Zahlen zusammen.quelle
↓9 9⍴1 3 2⍉3 3 9⍴⍵
gleichbedeutend mit/∘(,⍵)¨↓Z∘.=,3/3⌿3 3⍴Z←⍳9
aber ziemlich kürzer. Ich bin sicher, dass es noch kürzere Formeln gibt.⍪
und am Ende eine einzelne Teilung durchführen:↓(9 9⍴1 3 2⍉3 3 9⍴⍵)⍪⍵⍪⍉⍵
∊∘Z¨
testet, ob jedes Sub-Array (Zeile, Spalte oder Block) nur aus den Zahlen 1 bis 9 besteht. Er testet nicht, ob alle Zahlen dargestellt werden. Sie müssen so etwas wieZ∘.∊
testen, dass jede Zahl in Z in jedem Sub-Array enthalten ist.∧/,↑
kann gekürzt werden∧/∊
. Ich bin fertig, ich bin fertig! ;-)If it passes, return "0" and if not, return a non-zero result.
Java / C # -
183/180181/178173/170 Bytes(Wechseln
boolean
zubool
für C #)Formatiert:
Die Methode erstellt ein Array
u
mit 27 Bitmasken, die die Ziffern in den neun Zeilen, Spalten und Quadraten darstellen.Anschließend durchläuft es alle Zellen und führt die Operation aus
1 << a[x][y]
, um eine Bitmaske zu erstellen, die die Ziffer darstellt, und verknüpft damit die Spalten-, Zeilen- und Quadratbitmaske mit OR.Anschließend werden alle 27 Bitmasken durchlaufen, wobei sichergestellt wird, dass sich alle zu 27594 addieren (1022 * 9, 1022 ist die Bitmaske für alle vorhandenen Ziffern 1-9). (Beachten Sie, dass der
y
Wert 27603 lautet, da dieser Wert nach der Doppelschleife bereits 9 enthält.)Bearbeiten: Versehentlich in einer gelassen
%3
, die nicht mehr benötigt wird.Edit 2: Inspiriert von Bryce Wagners Kommentar wurde der Code etwas stärker komprimiert.
quelle
Python = 196
Nicht der Golfspieler, aber die Idee ist da. Sets sind ziemlich nützlich.
Tafel:
Programm:
quelle
n={*range(1,10)}
, aber das ist neuer als die Herausforderung. Verwendenset(range(1,10))
Sie stattdessen, wie MatrixFrog sagte.Java -
385 306 328260 ZeichenEdit: Ich dummerweise die Anweisungen falsch verstanden , dass die Antwort hatte ein komplettes Programm sein. Da es sich nur um eine gültige Funktion handeln kann, habe ich sie umgeschrieben und zu einer Funktion verkleinert und meine Einführung in die Lösung entsprechend umgeschrieben.
Als Herausforderung für mich dachte ich, ich würde versuchen, den kleinsten Java-Lösungsprüfer zu entwickeln.
Um dies zu erreichen, gehe ich davon aus, dass das Sudoku-Puzzle als mehrdimensionales Java-Array übergeben wird:
Dann haben wir den eigentlichen Löser, der bei gültiger Lösung "0" zurückgibt, andernfalls "1".
Völlig Golf gespielt:
Lesbar:
Wie funktioniert das? Ich erstelle einfach eine eigene Zahlenbasis mit einer ausreichenden Auflösung für jede Ziffer, sodass ich nur drei numerische Vergleiche durchführen muss, nachdem ich das Puzzle einmal durchlaufen habe, um zu wissen, ob es gültig ist. Ich habe Basis 49 für dieses Problem gewählt, aber jede Basis größer als 45 würde ausreichen.
Ein (hoffentlich) klares Beispiel: Stellen Sie sich vor, dass jede "Zeile" im Sudoku-Puzzle eine einzelne Ziffer in einer Basis-49-Zahl ist. Wir werden der Einfachheit halber jede Ziffer in der Zahl zur Basis 49 als Zahl zur Basis 10 in einem Vektor darstellen. Wenn also alle Zeilen "korrekt" sind, erwarten wir die folgende Basis-49-Zahl (als Basis-10-Vektor):
oder in eine einzelne Basis-10-Zahl umgewandelt:
1526637748041045
Befolgen Sie eine ähnliche Logik für alle Spalten und für die "Teilgitter". Jeder Wert, der letztendlich dieser "idealen Zahl" nicht entspricht, bedeutet, dass die Rätsellösung ungültig ist.
Bearbeiten, um die Sicherheitsanfälligkeit von all-5s und andere damit zusammenhängende Probleme zu lösen: Ich füge eine vierte Zahl zur Basis 49 hinzu, basierend auf der Idee, dass in jedem Rätsel 9 Zahlen enthalten sein sollten. Also addiere ich 5 zu jeder Ziffer in der Zahl zur Basis 49 für jedes Vorkommen der Zahl zur Basis 10, die den Index der Ziffer darstellt. Wenn es beispielsweise 10 9 und 9 8, 9 7, 8 6 und 9 von allen anderen gibt, erhalten Sie eine Basis-49-Zahl (als Basis-10-Vektor der Größe 10, um Überlauf zu behandeln):
Was im Vergleich zu unserer "idealen" Basis-49-Zahl scheitern wird.
Meine Lösung nutzt diese mathematische Lösung, um so viele Schleifen und Vergleiche wie möglich zu vermeiden. Ich verwende einfach einen
long
Wert, um jede Basis-49-Zahl als Basis-10-Zahl zu speichern, und verwende ein Nachschlage-Array, um die "Faktoren" für jede Basis-49-Ziffer während der Spalten- / Zeilen- / Subgrid-Prüfwertberechnung zu erhalten.Da Java nicht so konzipiert ist, dass es prägnant ist, dachte ich, ich könnte einen prägnanten Checker nur erstellen, wenn ich bei der mathematischen Konstruktion vorsichtig bin.
Lass mich wissen was du denkst.
quelle
R 145
Den (mehr oder weniger) de-golfed Code finden Sie hier /programming//a/21691541/1201032 .
quelle
Haskell (Lambdabot), 65 Bytes
quelle
Perl, 193 Bytes
Die Eingabe wird in Array-Form erwartet:
Der Exit-Code ist 0, wenn
@a
es sich um eine Lösung handelt, andernfalls1
wird zurückgegeben.Ungolfed-Version:
Jede der 9 Zeilen, 9 Spalten und 9 Sub-Arrays wird in ein sortiertes Array gestellt und überprüft, ob es mit dem Array übereinstimmt
(1..9)
. Die Zahl$r
wird für jede erfolgreiche Übereinstimmung erhöht, die für eine gültige Lösung 27 ergeben muss.quelle
J
5254Nimmt das in die Kommandozeile eingefügte Argument und endet mit a) als:
Gibt 1 zurück, wenn bestanden, 0, wenn nicht.
Intern konvertiert es das 9x9-Raster in ein 3x3x3x3-Raster und führt einige Permutationen an den Achsen durch, um die gewünschte Einheit (Zeilen, Linien und Kästchen) in den letzten beiden Dimensionen zu erhalten.
Danach wird überprüft, ob jede Einheit 9 eindeutige Werte hat.
Wohl alles andere als perfekt, schlägt aber die Mehrheit schon ;-)
quelle
Mathematica,
8479 ZeichenBeispiele:
quelle
3
immer ungültige Eingaben an, oder ist es manchmal eine Antwort auf eine fehlgeschlagene Lösung?Javascript ES6, 150 Zeichen
Nimmt die Eingabe als Zeichenfolge mit 81 Zeichen ohne Begrenzer auf.
Die Funktion gibt
null
eine negative Antwort und ein Array mit der ursprünglichen Zeichenfolge im ersten Element als positive Antwort zurück. Kann durch Hinzufügen!!
zu der beginnenden Funktion in bool geändert werden .Test (siehe verwandte Challenge für mehr Details):
quelle
R
6350 BytesAngenommen, die Eingabe
m
ist eine 9x9-Zahlenmatrix.Ich hatte Recht, dass weiteres Golfen möglich war.
Erläuterung:
Nehmen Sie
m
und wenden Sie für jede Zeile diematch
Funktion an. Wir geben ein weiteres Argumentx=1:9
an, an das weitergeleitet werden sollmatch
.x
ist das Standardargument für die erste Position, und daher wird jede Zeile an der zweiten Argumentposition platziert, d. htable
. Die Funktionmatch
sucht nach Instanzen vonx
intable
. In diesem Fall wird1:9
in jeder Zeile nach (den Nummern 1 bis 9) gesucht . Für jedes von1:9
wird zurückgegebenTRUE
(oderFALSE
), ob diese Nummer gefunden wird (oder nicht).Dies ergibt also eine Reihe von 81 Booleschen Werten.
Wiederholen Sie die obigen Schritte für jede Spalte der Eingabe.
all
Prüft abschließend , ob jedes Element der Liste der Booleschen Werte vorhanden istTRUE
. Dies ist genau dann der Fall, wenn die Lösung korrekt ist (dh jede Zahl1:9
ist in jeder Spalte und jeder Zeile nur einmal vorhanden).Alter Ansatz:Es nimmt jede Zeile, sortiert sie und vergleicht sie dann mit[1, 2, ... 9]
. Eine richtige Zeile sollte genau übereinstimmen. Dann macht es für jede Spalte dasselbe. Insgesamt sollten wir 162 exakte Übereinstimmungen haben, worauf der letzte Teil prüft. Hier besteht wahrscheinlich noch Spielraum für weiteres Golfen ...quelle
Haskell - 175
Die Funktion muss
v
aufgerufen werden. Es funktioniert, indem die Differenz jeder Zeile, Spalte und jedes Blocks gegen die Liste[1..9]
abgerufen und die Länge dieser Differenzlisten aufsummiert wird.Demo am Beispiel Sudoku:
quelle
Javascript - 149 Zeichen
Erwartet, dass ein Array
a
vorhanden ist, und erstellt eine Variableo
für die Ausgabe, die0
bei Erfolg und ansonsten ungleich Null ist.Überprüfen Sie, ob die Summe der Positionen, an denen die einzelnen Werte für jede Zeile, Spalte und jedes 3 * 3-Raster auftreten, 36 ergibt (0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8).
Testen
Gibt 'o = 0'
(Die letzten 2 Ziffern wurden getauscht.)
Gibt
o=-1
Gibt
o=-284
quelle
Haskell,
121130127 Bytes (87 Lambdabot)Verwendet:
Lambdabot lädt standardmäßig Data.List und Data.List.Split (ich glaube nicht, dass die BlackCap-Lösung die Kontrollkästchen aktiviert).
Verbesserungsvorschläge willkommen
// Edit: Ich habe es vermasselt :)
// Edit: 3 Bytes, die von BlackCap gespeichert wurden
quelle
(map sort)
mit(sort<$>)
.c$(sort<$>)<$>
mit$(sort<$>)=<<
05AB1E , 36 Bytes | NoN-Competing |
Probieren Sie es online!
1 ist wahr, alles andere ist falsch.
quelle
Clojure, 151 Bytes
Ziemlich lange, aber andere scheinen es auch zu sein. Ebenfalls ärgerlich, dass die Vereinigung von Mengen ein erfordert
require
, weshalb ich stattdessen ein Konzentrat von Vektoren verwendet habe.Durchläuft jede Zeile und Spalte und gibt bei einem Wert zwischen 1 und 9 drei Vektoren aus, einen für Zeile, Spalte und 3x3-Zelle. Gibt bei Erfolg 0 zurück,
nil
andernfalls könnten zwei zusätzliche Zeichen bei Fehlschlagen 1 zurückgeben. Behandelt Zahlen außerhalb von 1 bis 9, indem sie zurückgegebennil
werden, stürzt jedoch bei anderen Anomalien ab, z. B. bei nicht ganzzahligen Werten. Quotienten sind 0 - 2, sodass es sicher ist, Werte zu verwenden8
und9
Zellenwerte von Zeilen und Spalten zu unterscheiden.Die Eingabe ist ein verschachtelter Vektor von Vektoren (so dass
nth
funktioniert):Ungolfed:
quelle
PHP
196190 BytesDas Programm verwendet 9 separate Befehlszeilenargumente (eine Ziffernfolge für jede Zeile des Rasters).
Beendet mit
1
(Fehler) für ungültig,0
(OK) für gültig.Laufen Sie mit
php -nr '<code>' <row1> <row2> ...
.Nervenzusammenbruch
Erläuterung
count_chars
Zählt Zeichen in einer Zeichenfolge und erstellt normalerweise ein Array mit ASCII-Codes als Schlüssel und die Anzahl der Zeichen als Werte. Mit dem3
Parameter mode wird jedoch eine sortierte Zeichenfolge aus den Zeichen erstellt. und das kann man leicht mit der nummer mit den gewünschten ziffern vergleichen.Der Vergleich prüft nicht nur auf Duplikate, sondern auch auf ungültige Zeichen. Und es erfordert nur
<
, nicht!=
, weil dies ein numerischer Vergleich ist: PHP interpretiert den String so weit wie möglich als Zahl.123e56789
,0x3456789
oder ähnliches kann nicht angezeigt werden, da die Zeichen sortiert sind. und jede reine ganze Zahl mit einer fehlenden Ziffer ist kleiner als123456789
... und.23456789
natürlich auch.$a=$argv
Speichert ein Byte,$d=123456789
speichert neun und$u=count_chars
speichert 13.quelle
C # -
306298288 ZeichenDas folgende Konsolenprogramm wurde zum Aufrufen der Überprüfungsfunktion verwendet.
Dazu muss nur das Array initialisiert und an die Prüffunktion P übergeben werden.
Die Überprüfungsfunktion ist wie folgt (in Golf-Form);
Oder in vollständiger Form;
Dabei wird die Idee zugrunde gelegt, dass alle Spalten, Zeilen und Teilraster 45 ergeben sollten. Dabei wird das Eingabearray durchlaufen und der Wert jeder Position von den Zeilen, Spalten und Teilrastern subtrahiert. Nach Abschluss wird überprüft, ob in keiner der Zeilen, Spalten oder Teilraster noch ein Wert vorhanden ist.
Nach Aufforderung wird eine 0 zurückgegeben, wenn das Array eine gültige Sudoku-Lösung ist und nicht Null (1), wenn dies nicht der Fall ist.
quelle
private static int P(int[,]i){int[]r=new int[9],c=new int[9],g=new int[9];
stattdessen verwenden. (Beachten Sie das Entfernen des Leerzeichens nach der engen eckigen Klammer]
.) Ich bin mir auch nicht sicher, aber ich denke, Sie können das entfernenprivate static
.for(int p=0;p<9;p++)if(r[p]>0|c[p]>0|g[p]>0)return 1;return 0;}
nicht sicher, ob es in C # funktioniert. (C # kenne ich eigentlich nicht)