Herausforderung:
Bestimmen Sie bei einem Sudoku-Board mit Standardeingabe die Mindestanzahl der hinzugefügten Nummern, um das Board eindeutig zu machen.
Besonderheiten / Regeln:
Die Eingabe ist wie folgt formatiert (alle Leerzeichen sind signifikant)
516|827|943 278|394|615 349|615|872 ---+---+--- 98 |4 2|156 465|189|237 12 |5 6|489 ---+---+--- 892|743|561 634|951|728 751|268|394
Die Ausgabe wird mit einer Zahl pro Zeile formatiert, die wie folgt formatiert ist:
(x,y):z
- x und y beginnen links oben bei eins und erhöhen sich nach unten und rechts; z ist die Zahl, die hinzugefügt werden soll.- In diesem Fall wird diese alle gültigen Ausgaben würde:
(3,4):3
,(3,4):7
,(5,4):3
,(5,4):7
,(3,6):3
,(3,6):7
,(5,6):3
, und(5,6):7
, als einer dieser das Board zu lösende erlauben würde.
- In diesem Fall wird diese alle gültigen Ausgaben würde:
- Wenn eine eindeutige / gelöste Sudoku-Tafel eingegeben wird, sollte das Programm nichts drucken, auch keine neue Zeile.
- Das Programm sollte für jedes Board in weniger als einer Stunde ausgeführt werden (ich empfehle, ein vollständig leeres Board oder ein Board mit einer Zufallszahl zu verwenden ...).
Wertung:
- Geben Sie die Gesamtgröße Ihres Codes (Golf) in Zeichen an, einschließlich Leerzeichen ...
Boni:
1/2 Codegröße : Wenn das Programm ein einzelnes Ausrufezeichen druckt und eine Tafel ohne eingegebene Lösungen nicht mehr anzeigt.
1/2 Codegröße : Wenn das Programm zwei Ausrufezeichen druckt und eine Tafel mit einem internen Widerspruch nicht mehr eingibt (zwei gleiche Zahlen in derselben Zeile / Spalte / Quadrat).
Antworten:
Brachylog , 245 Bytes / 2 = 122,5
(Beachten Sie, dass Sie bei diesem Commit die Version der Sprache verwenden müssen . Für diesen Code sind einige geringfügige Änderungen erforderlich, damit er in den folgenden Versionen von Brachylog ordnungsgemäß funktioniert.)
Dies wird gedruckt,
"!!"
wenn das angegebene Board interne Widersprüche aufweist (dies dauert in diesem Fall einige Sekunden, jedoch bei TIO, also haben Sie etwas Geduld).Ich bin mir nicht sicher, ob ich den ersten Bonus richtig verstehe, also gehe ich nicht darauf ein.
Dies ist offensichtlich nicht konkurrierend, da die Sprache viel jünger ist als die Herausforderung. Da es jedoch keine anderen Antworten gibt, bin ich mir nicht sicher, ob dies eine große Rolle spielt.
Erläuterung
Hauptprädikat:
Prädikat 1: Entferne alle "
|
" Zeilen in, transformiere die---+---+---
in-
, um sie danach zu entfernenPrädikat 2: Konvertieren Sie ein Zeichen in eine Ganzzahl oder, falls leer, in eine Variable zwischen 1 und 9.
Prädikat 3: Legen Sie fest, dass alle Werte der Eingabeliste von Zellen unterschiedlich sein müssen
Prädikat 4: Wenden Sie die Unterscheidungsbedingung auf Werte in 3 * 3-Blöcken an
Prädikat 5:
Prädikat 6: Weisen Sie einer Teilmenge der leeren Zellen Werte zu, die die Einschränkungen erfüllen. Mit diesen Werten gibt es dann nur eine Lösung für die Karte.
Prädikat 7: Transformiert die Karte so, dass jetzt jede Zelle
[V:X:Y]
statt nurV
(der Wert) ist.Prädikat 8: Transformiert eine Linie so, dass sich jede Zelle jetzt befindet
[V:X]
.Prädikat 9: Ruft die Werte von Zellen ab
Prädikat 10: Hängen Sie die Länge einer Teilmenge am Anfang an
Prädikat 11: Eine Zelle drucken
quelle