Ihre Aufgabe ist es, ein Programm (oder zwei separate Programme) in einer beliebigen Sprache zu schreiben, die:
- Kann ein fertiges Sudoku-Board als Eingabe nehmen (in einem beliebigen logischen Format) und es in eine Zeichenfolge komprimieren
- Kann den komprimierten String als Eingabe nehmen und dekomprimieren, um genau dasselbe fertige Sudoku-Board zu erhalten (Ausgabe in einem beliebigen logischen Format von 9 Zeilen)
Hinweis: Verwenden Sie die Regeln von Sudoku zu Ihrem Vorteil. das ist die idee hinter dieser herausforderung.
Sudoku-Regeln auf Wikipedia
Regeln
- In der komprimierten Ausgabe sind nur druckbare ASCII-Zeichen (32 - 126) zulässig (z. B. keine Multibyte-Zeichen ).
- Sie können davon ausgehen, dass es sich bei der Eingabe um eine gültige 3x3-Sudoku-Karte handelt (normale Regeln, keine Variationen).
- Ich werde kein Zeitlimit festlegen, aber keinen Brute-Force-Algorithmus erstellen. Alternativ können Einreicher ihre Einreichungen vor dem Posten testen (Dank an Jan Dvorak).
Wenn Sie Fragen oder Bedenken haben, können Sie in den Kommentaren um Klarstellung bitten oder Vorschläge machen.
Gewinnbedingungen
Score = Summe der Anzahl der Zeichen aus allen zehn Testfällen
Die niedrigste Punktzahl gewinnt.
Testfälle
Sie können diese verwenden, um zu testen, wie gut Ihr Programm funktioniert.
9 7 3 5 8 1 4 2 6
5 2 6 4 7 3 1 9 8
1 8 4 2 9 6 7 5 3
2 4 7 8 6 5 3 1 9
3 9 8 1 2 4 6 7 5
6 5 1 7 3 9 8 4 2
8 1 9 3 4 2 5 6 7
7 6 5 9 1 8 2 3 4
4 3 2 6 5 7 9 8 1
7 2 4 8 6 5 1 9 3
1 6 9 2 4 3 8 7 5
3 8 5 1 9 7 2 4 6
8 9 6 7 2 4 3 5 1
2 7 3 9 5 1 6 8 4
4 5 1 3 8 6 9 2 7
5 4 2 6 3 9 7 1 8
6 1 8 5 7 2 4 3 9
9 3 7 4 1 8 5 6 2
1 5 7 6 8 2 3 4 9
4 3 2 5 1 9 6 8 7
6 9 8 3 4 7 2 5 1
8 2 5 4 7 6 1 9 3
7 1 3 9 2 8 4 6 5
9 6 4 1 3 5 7 2 8
5 4 1 2 9 3 8 7 6
2 8 9 7 6 1 5 3 4
3 7 6 8 5 4 9 1 2
8 3 5 4 1 6 9 2 7
2 9 6 8 5 7 4 3 1
4 1 7 2 9 3 6 5 8
5 6 9 1 3 4 7 8 2
1 2 3 6 7 8 5 4 9
7 4 8 5 2 9 1 6 3
6 5 2 7 8 1 3 9 4
9 8 1 3 4 5 2 7 6
3 7 4 9 6 2 8 1 5
6 2 8 4 5 1 7 9 3
5 9 4 7 3 2 6 8 1
7 1 3 6 8 9 5 4 2
2 4 7 3 1 5 8 6 9
9 6 1 8 2 7 3 5 4
3 8 5 9 6 4 2 1 7
1 5 6 2 4 3 9 7 8
4 3 9 5 7 8 1 2 6
8 7 2 1 9 6 4 3 5
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 1 4 3 6 5 8 9 7
3 6 5 8 9 7 2 1 4
8 9 7 2 1 4 3 6 5
5 3 1 6 4 8 9 7 2
6 4 8 9 7 2 5 3 1
9 7 2 5 3 1 6 4 8
1 4 5 7 9 2 8 3 6
3 7 6 5 8 4 1 9 2
2 9 8 3 6 1 7 5 4
7 3 1 9 2 8 6 4 5
8 5 9 6 4 7 3 2 1
4 6 2 1 3 5 9 8 7
6 2 4 8 7 3 5 1 9
5 8 7 4 1 9 2 6 3
9 1 3 2 5 6 4 7 8
5 2 7 4 1 6 9 3 8
8 6 4 3 2 9 1 5 7
1 3 9 5 7 8 6 4 2
2 9 1 8 5 4 3 7 6
3 4 8 6 9 7 5 2 1
6 7 5 1 3 2 4 8 9
7 1 2 9 4 5 8 6 3
4 8 3 2 6 1 7 9 5
9 5 6 7 8 3 2 1 4
2 4 6 7 1 3 9 8 5
1 8 5 4 9 6 7 3 2
9 3 7 8 2 5 1 4 6
6 7 8 5 4 2 3 9 1
4 9 3 1 6 8 2 5 7
5 1 2 3 7 9 4 6 8
8 2 4 9 5 7 6 1 3
7 5 9 6 3 1 8 2 4
3 6 1 2 8 4 5 7 9
8 6 1 2 9 4 5 7 3
4 7 5 3 1 8 6 9 2
3 9 2 5 6 7 8 1 4
2 3 6 4 5 9 7 8 1
1 5 4 7 8 3 2 6 9
9 8 7 6 2 1 3 4 5
5 2 9 1 7 6 4 3 8
6 4 8 9 3 2 1 5 7
7 1 3 8 4 5 9 2 6
Wir danken http://www.opensky.ca/~jdhildeb/software/sudokugen/ für einige davon
Wenn Sie Probleme mit den Testfällen haben, teilen Sie mir dies bitte mit.
code-challenge
compression
sudoku
kukac67
quelle
quelle
fudge
Unterroutine in meiner zweiten Antwort, die 12 Punkte gewinnt). Ein fairerer Test wäre, vorauszusetzen, dass (a) die Testlösungen funktionieren, (b) auf 1.000 zufällig generierten Sudoku-Gittern punkten und die Antwort durch 100 teilen. Ich glaube, das Beste, was man mit zufälligen Daten machen kann, ist etwa 110, basierend auf 10 x log-base-95 (6670903752021072936960)Antworten:
Haskell, 107 Punkte
Die Testfallergebnisse:
Der Code ist nicht schön, aber es funktioniert. Die Grundlage des Algorithmus ist, dass die Aufzählung aller Lösungen zu lange dauern würde, die Aufzählung aller Lösungen innerhalb eines einzelnen Blocks jedoch relativ schnell vonstatten geht - und zwar schneller als die anschließende Konvertierung nach base95. Das Ganze läuft innerhalb von Sekunden im Interpreter auf meinem Low-End-Rechner. Ein kompiliertes Programm würde sofort beendet.
Das schwere Heben wird durch die
solution2ix
Funktion ausgeführt, die für jeden 3 × 3-Block alle möglichen Permutationen erzeugt, wobei Einschränkungen von links und von oben gelten, bis sie diejenige in der codierten Lösung findet, die nur den Index dieser Permutation speichert. Anschließend werden die Indizes unter Verwendung einiger vorberechneter Gewichte und des Horner-Schemas kombiniert.In der anderen Richtung
ix2solution
zerlegt die Funktion den Index zunächst in neun Werte. Dann indiziert es für jeden Block die Liste möglicher Permutationen mit seinem jeweiligen Wert und extrahiert dann die Einschränkungen für die nächsten Blöcke.assignments
ist eine einfache, aber hässliche unrollierte Rekursion mit der Listenmonade. Es wird eine Liste von Permutationen mit einer Reihe von Einschränkungen erstellt.Die wahre Kraft ergibt sich aus den engen Grenzen der Permutationslistenlängen:
9!
. Dieser Wert wird nur verwendet, um eine Obergrenze für die Ausgabelänge zu ermitteln.6*5*4*6!
ist siebenmal schlechter als die tatsächliche Anzahl, die durch Aufzählung ermittelt wurde:12096
Das Produkt all dieser Grenzwerte ist
71025136897117189570560
~ =95^11.5544
, was bedeutet, dass kein Code länger als 12 Zeichen ist und fast die Hälfte davon 11 Zeichen oder weniger enthalten sollte. Ich habe beschlossen, nicht zwischen einer kürzeren Zeichenfolge und derselben mit Leerzeichen rechts aufgefüllten Zeichenfolge zu unterscheiden. Leerzeichen an anderen Stellen sind von Bedeutung.Die theoretische Grenze der Codierungseffizienz für präfixfreie Codes - Basis-95-Logarithmus von
6670903752021072936960
-11.035
bedeutet, dass selbst ein optimaler Algorithmus die Erzeugung von Längen-12-Ausgaben nicht vermeiden kann, obwohl sie in nur 3,5% aller Fälle erzeugt werden. Wenn Sie zulassen, dass die Länge signifikant ist (oder entsprechend nachgestellte Leerzeichen), werden zwar einige Codes hinzugefügt (1% der Gesamtmenge), dies reicht jedoch nicht aus, um die Notwendigkeit von Länge-12-Codes zu beseitigen.quelle
Python, 130 Punkte
Der Algorithmus codiert nacheinander jede Position auf der Platine in eine große Ganzzahl. Für jede Position berechnet es die möglichen Werte bei allen bisher codierten Zuordnungen. Wenn also [1,3,7,9] die möglichen Werte für eine bestimmte Position sind, werden 2 Bits benötigt, um die Auswahl zu codieren.
Das Schöne an diesem Schema ist, dass eine Position, die nur noch eine einzige Auswahlmöglichkeit hat, keinen Platz zum Codieren benötigt.
Sobald wir die große ganze Zahl haben, schreiben wir sie in Basis 95 aus.
Es gibt wahrscheinlich bessere Kodierungsreihenfolgen als lexikografische, aber ich habe nicht viel darüber nachgedacht.
Encoder:
Decoder:
Führen Sie es so aus:
quelle
perl - score
115113103113Ausgabe:
Ausgabe:Keine dieser Zeilen hat ein Abschlusszeichen. Beachten Sie, dass die erste Zeile leer ist.
Dieser Algorithmus funktioniert wie folgt. Komprimieren:
Beginnen Sie mit einer leeren 'aktuellen' Zeichenfolge, die das Sudoku-Gitter darstellt
Erwägen Sie, der Reihe nach die Ziffern 1 bis 9 zu dieser Zeichenfolge hinzuzufügen und festzustellen, welche davon sinnvoll ist.
Holen Sie sich die nächste Ziffer aus dem Antwortraster (und fügen Sie es dem aktuellen hinzu)
Wenn nur einer lebensfähig ist, gibt es nichts zu codieren
Wenn mehr als eine Option möglich ist, zählen Sie die Anzahl der möglichen Optionen, sortieren Sie sie und codieren Sie diese Ziffer als Index in das sortierte Array. Notieren Sie die Ziffer und die Zahl als 2-Tupel in einem Array.
Wenn alles erledigt ist, codieren Sie jedes der 2 Tupel (in umgekehrter Reihenfolge) in einer variablen Zahl, die als Bigint gespeichert ist.
Drücken Sie den Bigint in Basis 95 aus.
Dekodieren:
Beginnen Sie mit einer leeren 'aktuellen' Zeichenfolge, die das Sudoku-Gitter darstellt
Dekodiere die Base95-Zahl zu einer Bigint
Erwägen Sie, der Reihe nach die Ziffern 1 bis 9 zu dieser Zeichenfolge hinzuzufügen und festzustellen, welche davon sinnvoll ist.
Wenn nur einer lebensfähig ist, gibt es nichts zu codieren; füge diese Auswahl dem Gitter hinzu
Wenn mehr als eine Option möglich ist, zählen Sie die Anzahl der möglichen Optionen, sortieren Sie sie und codieren Sie diese Ziffer als Index in das sortierte Array.
Dekodieren Sie die Variable-Base-Bigint unter Verwendung der Anzahl der realisierbaren Optionen als Basis und des Moduls als Index in das Array und geben Sie diese Ziffer als Zellenwert aus.
Um die Anzahl der realisierbaren Optionen zu bestimmen, wird Games :: Sudoku :: Solver verwendet. Dies dient hauptsächlich der Übersichtlichkeit, da sich auf dieser Website 3-Zeilen-Sudoku-Löser befinden.
Um alle 10 zu erledigen, brauchte ich 8 Sekunden auf meinem Laptop.
Die
fudge
Operation sortiert das Array unterschiedlich, um den Minimalwert für die Testfälle zu erreichen. Wie dokumentiert, ist dies ein Fudge. Das Fudge reduziert die Punktzahl von 115 auf 103. Es ist handgemacht, um sicherzustellen, dass der Bigint-Code für den ersten Test 0 ist. Die schlechteste Punktzahl für ein Sudoku ist 12, was eine Punktzahl von 120 ergibt. Ich denke also, dass dies nicht zählt als Hardcodierung; Vielmehr optimiert es für die Testdaten. Um zu sehen, wie es ohne dies funktioniert, wechseln Siesort fudge
zusort
in beiden Orten.Code folgt:
quelle
CJam, 309 Bytes
Dies ist nur eine schnelle Basislösung. Es tut mir leid, dass ich dies in einer Golfsprache getan habe, aber es war tatsächlich der einfachste Weg, dies zu tun. Ich werde morgen eine Erklärung des tatsächlichen Codes hinzufügen, aber ich habe den Algorithmus unten umrissen.
Encoder
Decoder
Teste es hier.
Der Eingang des Codierers (bei STDIN) und der Ausgang des Decodierers (bei STDOUT) haben die Form eines verschachtelten CJam-Arrays. Z.B
Die 10 Testausgänge sind:
Der Algorithmus ist sehr einfach:
quelle
Python 2.7, 107 Zeichen insgesamt
TL; DR Brute-Force-Aufzählung von 3x3-Quadraten mit Einschränkungen von oben + links
Testfälle:
Hilfsfunktion zum Drucken von Sudoku
generiert alle möglichen Quadrate mit den oben und links angegebenen Bedingungen
Weitere Einzelheiten finden Sie im Codekommentar
Extrahiert alle Quadrate aus dem Sudoku-Board als Tupel
Weitere Einzelheiten finden Sie im Codekommentar
wandelt Quadrate wieder in Sudoku um
im Grunde eine Umkehrung der obigen Funktion
gegebene Quadrate links, Rückgabebedingungen
Weitere Einzelheiten finden Sie im Codekommentar
gegebene Quadrate oben, Rückgabeeinschränkungen
Weitere Einzelheiten finden Sie im Codekommentar
macht eine Zeichenfolge
Dies ist eine hartcodierte Liste von Abhängigkeiten für jedes Quadrat
Weitere Einzelheiten finden Sie im Codekommentar
Dies ist eine hartcodierte Liste der maximal möglichen Optionen für jedes Quadrat
Weitere Einzelheiten finden Sie im Codekommentar
Diese kombinieren die obigen Funktionen und konvertieren eine Karte in eine Liste von ganzen Zahlen
und zurück zu einem Brett
Okay, das sind alle Funktionen
Für jede Tafel einen String machen und ausdrucken
Jetzt drucken Sie die Gesamtlänge aller Zeichenfolgen
und aufheben, um zu beweisen, dass es sich nicht um eine Einwegkomprimierung handelt
Ausgabe:
quelle
Mathematica, Punktzahl:
1309Aktualisieren:
Nachdem diese Antwort veröffentlicht wurde, inspirierte sie eine neue Lücke: "Optimierung für die gegebenen Testfälle" . Ich werde diese Antwort jedoch so lassen, wie sie ist, als Beispiel für die Lücke. Fühlen Sie sich frei zu stimmen. Ich werde nicht verletzt.
Dadurch wird eine Zelle in einer bestimmten Rasterreihenfolge codiert, und für jede Zelle wird der Wert entsprechend den Grundregeln von Sudoku für nachfolgende Zellen ausgeschlossen. Wenn also beispielsweise eine Zelle codiert ist und nur vier Möglichkeiten hat, wird der großen Ganzzahl eine vierstellige Basis hinzugefügt. Außerdem werden die Testfälle direkt als kleine Ganzzahlen codiert, wobei alle gültigen Sudoku-Boards mit einer durchschnittlichen komprimierten Länge von ~ 12,5 Zeichen, 1,5 mehr als die optimale Länge von 11,035, korrekt komprimiert und dekomprimiert werden. Dabei ist relativ einfacher Code und kein Sudoku-Löser erforderlich.
Codierte Testfälle:
Dies führt nicht zu einer perfekten Codierung (Durchschnitt ~ 11), da die Grundregeln einige Entscheidungen nicht ausschließen, für die es tatsächlich keine Lösung gibt. Die Leistung könnte perfekt gemacht werden (dh die große Ganzzahl wäre immer kleiner als die Anzahl der möglichen Sudoku-Karten), indem überprüft wird, ob es für einige der aktuellen Auswahlmöglichkeiten mit einem Sudoku-Löser keine Lösung gibt, und diese ebenfalls beseitigt werden.
quelle
J, 254 Punkte
Kompression DekompressionStandard-E / A ist in J etwas umständlich, da
jconsole
es sich tatsächlich um eine REPL handelt. Daher habe ich mir die Freiheit genommen, die komprimierte Ausgabe in eine Datei zu schreiben.Findet den Anagrammindex jeder Zeile, behandelt die resultierenden neun Zahlen als Basis- (9!) - Zahl und konvertiert schließlich zu Basis-95, addiert 32 und konvertiert zu ASCII, genau wie in Martin Büttners Lösung. Der Anagrammindex einer Permutation von 1..n ist einfach der Index der Permutation in der lexikalisch sortierten Liste aller solcher Permutationen, zB
5 4 3 2 1
hat Anagrammindex 5! - 1 = 119 .Alle Operationen haben einfache Umkehrungen, so dass die Dekomprimierung einfach ist.
Als Bonus haben die Beispiele ein sehr J-freundliches Format, sodass die Eingabe / Ausgabe für dekomprimierte Sudokus genau den in den Beispielen angegebenen Werten entspricht (obwohl für die Eingabe in den Encoder ein Zeilenumbruch erforderlich ist ).
Komprimierte Zeichenfolgen für die Testfälle:
quelle
Python 3, 120 Punkte
Dieses Programm listet alle möglichen 3x3-Blöcke auf und merkt sich, welcher davon tatsächlich im ursprünglichen Sudoku vorhanden war, und fügt dann alle diese Zahlen in einer Base-95-Darstellung zusammen. Obwohl dies der Hardcodierung sehr nahe kommt, werden die Beispiele auf meinem Computer in jeweils ca. 5 Sekunden komprimiert und dekomprimiert.
Die Hauptfunktionen sind
compress(sudoku)
unddecompress(text)
.Ausgänge:
quelle
Python 2.5, 116 Punkte
Code:
Ergebnisse:
Sehr langsam. Es dauerte 517 Sekunden, bis mein Computer ausgeführt und überprüft wurde.
encconfig eine Sudoku- und eine Ziffer von 1 bis 9, listet die xy-Koordinaten auf, an denen diese Ziffer erscheint, und gibt eine Zahl im Bereich (6 ** 6) aus, die diese Koordinaten darstellt. (die "Ziffernkonfiguration")
decconfig ist die umgekehrte Funktion. Es wird eine Zahl im Bereich (6 ** 6), eine Ziffer und eine Sudoku-Tafel benötigt (standardmäßig leer). Es gibt die Sudoku-Karte aus, die mit der Ziffernkonfiguration überlagert ist. Wenn eine der Positionen in der Ziffernkonfiguration bereits in der eingegebenen Sudoku-Karte enthalten ist, wird die Ziffer an dieser Position durch die neue Ziffer überschrieben.
kompatibel eine Sudoku-Karte und eine Ziffernkonfiguration (definiert durch conf und dig), überlagert die Ziffernkonfiguration mit der Sudoku-Karte und prüft auf Konflikte. Je nach Ergebnis wird dann True oder False zurückgegeben.
kodieren ist die Kompressionsfunktion. Es nimmt eine Sudoku-Karte und gibt eine Zahl aus, die diese repräsentiert. Dies geschieht, indem zuerst die Positionen der Einsen auf eine leere Tafel kopiert werden und eine Liste aller Konfigurationen der Nummer 2 erstellt wird, die mit der Einsen-Konfiguration kompatibel sind (die keine der bereits von der Einsen eingenommenen Stellen einnehmen) 1). Es findet dann die Reihenfolge der tatsächlichen 2-Konfiguration der Karte in der Liste und speichert sie. Anschließend kopiert es diese Konfiguration auf die neue Karte, die jetzt nur die 1 und 2 enthält. Es werden dann alle Konfigurationen der Nummer 3 aufgelistet, die mit den Positionen der Einsen und Zweisen kompatibel sind, und so weiter.
dekodieren ist die umgekehrte Funktion.
Python 2.5.
quelle
C #, 150 Bytes
Komprimierte Ausgabe:
Wie es funktioniert:
Es generiert alle möglichen Permutationen von 123456789 und merkt sich diese. Dann werden die Permutationen mit den Zeilen im Sudoku verglichen. Wenn eine passende Permutation für eine gebende Zeile gefunden wird, merkt sie sich den Index dieser Permutation. Nach jeder Zeile werden alle Permutationen entfernt, bei denen sich mindestens ein Zeichen an derselben Position wie die aktuelle Zeile befindet. Dadurch wird sichergestellt, dass jede Nummer in ihrer Spalte eindeutig ist. Dann werden alle Permutationen entfernt, die nach den Box-Kriterien nicht mehr funktionieren. Da die letzte Zeile trivial ist, werden 8 Zahlen generiert. Ich testete, wie hoch der Maximalwert jeder dieser Zahlen sein würde und generierte eine Ziffern-Zählmaske für jede Position dieser Zahlen. {6, 5, 3, 5, 3, 1, 2, 1, 1}. Die erste ist mit 362880 Permutationen offensichtlich die längste. Unter Verwendung der Ziffernmaske konstruiere ich eine BigInteger mit einer führenden 1, um sie 28 Ziffern lang zu machen. Dies ergibt insgesamt 11 Bytes. Dann werden diese Bytes in base64 konvertiert. Um ein Zeichen zu sparen, entferne ich das Zeichen = am Ende.
Der Wiederaufbau funktioniert ähnlich.
Es rekonstruiert den BigInteger aus dem base64string und wandelt ihn dann wieder in einen String um und teilt ihn unter Verwendung der erwähnten Ziffernzählmaske wieder auf. Diese Zeichenfolgen werden zurück in die Indizes analysiert.
Dann macht der Algorithmus fast dasselbe, anstatt die Zeile in den Permutationen zu finden, verwendet er nur den Index, um die Zeile abzurufen, der Rest funktioniert genauso.
Wahrscheinlich könnte dies ein bisschen besser sein, um wirklich die 94 möglichen Charaktere anstelle von nur 64 zu verwenden, aber mir fehlt der Verstand, um dies zu tun.
Quelle : Kopierbar und einfügbar, damit es mit den 10 Beispielen funktioniert. .dotNet-Fiddle teilt mir mit, dass das Memorylimit überschritten wurde, sodass Sie es auf Ihrem Computer ausführen müssen, um Text zu erhalten.
quelle
Perl - 290 Zeichen = 290 Punkte
Dieses Programm verwendet keine harte Codierung und komprimiert ein Raster zuverlässig in genau 29 Zeichen (theoretisch könnten einige kleinere gefunden werden).
So funktioniert das:
Konvertieren Sie zuerst das 9 x 9-Array in 60 Zahlen. Dies kann erfolgen, indem die letzte Spalte, die letzte Zeile und das letzte Quadrat jeder 3 × 3-Zelle entfernt werden.
Dann konvertieren Sie mit bigint in eine einzelne Ganzzahl mit 9 ^ 60 Elementen.
Dann konvertieren Sie die Bigint zur Basis 95.
Kompressor und Dekompressor:
quelle
PHP, 214
Diese Lösung löscht zuerst die rechte Spalte und die untere Reihe sowie die untere rechte Ecke jedes 3x3-Blocks. Anschließend wird versucht, eine Zelle auszuräumen. Wenn eine einfache Lösung vorliegt, bleibt die Zelle leer.
Anschließend wird das Sudoku-Raster von links nach rechts und von oben nach unten mit Ausnahme der rechten Spalte, der unteren Zeile und der unteren rechten Ecke in eine Zeichenfolge formatiert. Führende Nullen werden gezählt (sei dies
z
) und entfernt. Nachgestellte Nullen werden ebenfalls entfernt.Die Zeichenfolge wird entweder in eine Ganzzahl zur Basis 10, 11 oder 12 (sei diese Basis
b
) mit formatiertA
zwei Nullen undB
drei dargestellt werden.Dies wird in eine Ganzzahl zur Basis 95 umgewandelt und durch die Zahl zur Basis 95 vorangestellt
z << 2 | (b - 10)
.Rufen Sie
php sudoku-compress.php enc
an, um zu codieren undphp sudoku-compress.php dec
Dekodieren. Der Encoder verwendet das in der Frage angegebene Format mit einem obligatorischen Zeilenumbruch.Testausgänge:
quelle
Java, 330 Punkte
Bevor ich mich über eine so hohe Punktzahl lustig mache, möchte ich klarstellen, dass ich versucht habe, diese auf eine andere Art und Weise zu lösen. Ich war mehr oder weniger gespannt , ob ich bekommen konnte schließen , die zu meiner Überraschung ich nicht nur wusste , wie viel schlimmer würde es sich herausstellen . Hier ist der Überblick über meine Vorgehensweise:
Entwickle eine Algo zum Lösen eines Sudoku-Puzzles.
Entwickle einen Rätselalgo, der immer noch lösbar ist. Dies geschieht etwas zufällig, während Hinweise entfernt werden, die trivial vorher bestimmt werden können. Ich konnte ungefähr 22 Hinweise zuverlässig finden, bevor es viel zu lange dauerte.
Einmal verschlüsselt, könnte das Rätsel durch ein Triplett von einstelligen ganzen Zahlen für jeden Hinweis dargestellt werden, in meinem Fall 22 Tripletts von 3. Ich dachte, wenn ich diese zu einer einzelnen 66-stelligen Zahl kombinieren könnte, dann codiere base95 dies, dann habe ich etwas, das kann leicht zu entschlüsseln.
Die codierte Zeichenfolge war länger als ich mir erhofft hatte und hatte im Allgemeinen eine Länge von 33 Zeichen. Zu diesem Zeitpunkt habe ich eine andere Methode als die Verwendung von Java BigInteger ausprobiert, bei der ich eine große Zahl aus einer 81-Bit-Maske erstellt habe, die die 81 Zellen eines Gitters darstellt, wobei 1 bedeutet, dass ein Hinweis für diese Zelle vorhanden ist. Ich habe dann diese Bitmaske zu 4-Bit-Darstellungen jedes Zellenwerts in sequentieller Reihenfolge kombiniert, auf Bytes aufgerundet und festgestellt, dass ich nach base95-Codierung ungefähr dieselbe codierte Zeichenfolgenlänge habe.
Im Grunde poste ich meinen Code für den Fall, dass jemand an einem anderen Ansatz interessiert war, der nicht so gut funktioniert hat.
Klasse Puzz
Mein Testfall
Ausgang testen
quelle
C ++ 241, Ergebnis: 82 · 10 = 820
Fügt hinzu '!' zum Anfang der codierten Zeichenfolge, um zu bestimmen, welche Operation ausgeführt werden soll.
Golf 241 Zeichen
Ungolfed 312 Zeichen
quelle