Das ist Code Golf. Für diese Herausforderung akzeptiere ich eine Methode (Sie benötigen kein vollständiges Programm), aber die Methodensignatur wird für die Byteanzahl gezählt, und ich möchte die vollständige Signatur sehen (keine Lamdba). Die Eingabe für die Methode ist ein Integer-Array mit 81 Elementen. Der Ausgabe- / Rückgabewert der Methode ist eine Zeichenfolge, die das Array als ASCII-Sudoku-Karte darstellt.
Wenn Sie eine esoterische Sprache verwenden oder etwas, das absolut keine Methoden hat, können Sie sich anpassen, aber wenn die Sprache dies überhaupt unterstützt, möchte ich sehen, dass tatsächlich etwas in ein "echtes" ungolfed Programm eingesteckt wird, selbst wenn das Der Methodenkörper selbst ist ein Schmerz, mit dem man arbeiten muss. Die Anforderung soll nicht Sprachen wie Jelly oder 05AB1E blockieren, sondern es Sprachen wie Java erleichtern, etwas zu erstellen, das für diese Plattform sinnvoll ist.
Für die Eingabe sollten die ganzzahligen Werte 1 bis 9 offensichtliche Bedeutungen haben. Eine 0 sollte immer als leere Zelle interpretiert werden. Sie können auch alles andere außerhalb des Bereichs von 1 bis 9 als leere Zelle interpretieren, dies ist jedoch nicht erforderlich. Die Positionierung vom Array zum Puzzle beginnt oben links und füllt jede Zeile von links nach rechts, bevor zur nächsten Zeile übergegangen wird.
Für die Felder möchte ich doppelte Linien um die Außenseite und zwischen jeder 3x3-Region und einzelne Linien zwischen anderen Zellen. Diese sollten mit Strichzeichen gezeichnet werden (wenn Ihr E / A-Format Zeichenfolgen als Folge von Bytes und nicht als Folge von Zeichen darstellt, sollten Sie sie in einer bekannten Codierung wie UTF-8 oder Codepage 347 darstellen).
Für diese Herausforderung bitte ich Sie NICHT , das Sudoku-Puzzle zu generieren. Das ist der Eingang für die Funktion. Ich bitte Sie NICHT , das Rätsel zu lösen. Ich bitte Sie nur, eine Zeichenfolge zu erstellen, um zu "zeichnen", was Sie erhalten (in so wenigen Bytes wie möglich).
Beispiel Eingabe:
Werte für das Array:
{ 8, 5, 0, 0, 0, 2, 4, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 2, 3, 0, 5, 0, 0, 0, 9, 0, 0 ,0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 7, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 0, 4, 0}
Die Werte können den für Ihre Sprache natürlichen Mechanismus verwenden: int [], ArrayList, sequence, tuple, string of digits, was auch immer, solange Sie für jede Zelle einen Wert in der Eingabe haben (keine Zuordnungen nur für bestückte Zellen zu Positionen) ). Denken Sie daran, dass die Eingabe bereitgestellt wird ... sie ist nicht Teil Ihrer Byteanzahl. Die Eingabe kann jedoch ein beliebiges Sudoku-Puzzle darstellen, und das Puzzle hat möglicherweise nicht einmal eine gültige Lösung . Sie bekommen davon ausgehen , dass Puzzle ist bedruckbar. Sie werden zum Beispiel mit 82 Elementen nichts bekommen.
Sie können auch von einer angemessenen Schriftart mit fester Breite ausgehen.
Entsprechende Ausgabe:
╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗ ║ 8 │ 5 │ ║ │ │ 2 ║ 4 │ │ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ ║ 7 │ 2 │ ║ │ │ │ ║ │ 9 ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ ║ ║ │ 4 ║ ║ │ │ ║ │ │ ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ ║ ║ │ ║ 1 │ │ 7 │ │ │ 2 ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ ║ 3 │ │ 5 ║ │ │ ║ 9 │ │ │ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ │ ║ 4 │ │ ║ │ │ ║ │ │ ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ Es werden 8 bis 7 Punkte vergeben ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ │ ║ 1 │ 7 ║ ║ │ │ ║ │ │ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ ║ ║ │ ║ │ 3 │ 6 ║ │ 4 │ │ ╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝
Antworten:
Python 3 , 232 Bytes
Vielen Dank an diejenigen, die geholfen haben, das Golf zu spielen.
Verschlüsselung innerhalb der Verschlüsselung ...
Probieren Sie es online!
Golf spielen.
quelle
i=["╔"+(g+"╦")*2+g+"╗"]+d+2*(["╠"+(e+"╬")*2+e+"╣"]+d)+["╚"+(h+"╩")*2+h+"╝"]
spart 4 BytesC (gcc) ,
398395291 BytesDurch umgekehrtes Durcharbeiten der Zeichenfolge wurden 3 Byte und durch Leaky Nun 104 (!) Byte eingespart.
Probieren Sie es online!
C (gcc) , 395 Bytes
Ich werde das hier beibehalten, damit klarer wird, wie das Programm funktioniert.
Probieren Sie es online!
Die Arbeit mit Unicode in C ist ... kostspielig. Nimmt Eingaben als
int*
im Link und in der Spezifikation gezeigt vor.Ich werde sehen, ob ich mit etwas Zahlenmagie Bytes speichern kann, anstatt die Zeichenfolge hart zu codieren.
quelle
PHP , 297 Bytes
Probieren Sie es online!
Erweitert
verwendete Funktionen für beide Versionen
vsprintf , strtr , str_pad , array_slice , array_chunk
PHP , 313 Bytes
Probieren Sie es online!
quelle
T-SQL,
445437 Bytes (in 381 Zeichen)Eingang über eine Folge von Ziffern in der Spalte gespeichert a vorbestehender Tabelle t , pro anerkannten Methoden .
Format und Erklärung :
In der obersten Zeile der Schleife erhalte ich die nächsten 9 Stellen der Eingabezeichenfolge aus der Spalte a der bereits vorhandenen Tabelle t .
Ich konvertiere diese Ziffernfolge in eine Ganzzahl und verwende die .Net-
FORMAT
Funktion, um sie mithilfe einer benutzerdefinierten Textvorlage anzuzeigen'║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║P'
.Danach hänge ich einfach die entsprechende Trennlinie an und ersetze sie vor der Ausgabe bytesparend.
Die Ausgabe wird im Ergebnisbereich angezeigt:
Ich hatte vorher einige zusätzliche Ersetzungen für einige der anderen Zeichen, aber sie haben mir letztendlich keine Bytes erspart.
BEARBEITEN 1 : 8 Bytes werden gespeichert, indem
@r
bei Null anstelle von 1 begonnen und nicht benötigte Leerzeichen entfernt werden.quelle
Retina ,
196167 BytesProbieren Sie es online! Wird als Zeichenfolge mit der Länge 81 eingegeben. Erläuterung: Da die Zeichen in der Box drei Bytes kosten, werden die Unicode-Codepunkte
═-╬
im Code mit dargestellt=|#A-Z
(nicht alle Zeichen werden verwendet, aber es werden Bytes gespeichert, wenn Bereiche eingehalten werden). Zusätzlich werden die Zeilen mit#
Vorzeichen komprimiert :a#bcd#e
erweitert umabbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbe
.Einfügungen
╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣
für jede dritte Reihe sowie ein║
am Anfang jeder Gruppe von 27.Fügt
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
zwischen den anderen Zeilen plus║
s am Anfang dieser Zeilen ein.Fügt
║
s nach jeweils drei Ziffern ein. Alle║
s wurden nun eingefügt.Fügt
|
s zwischen alle verbleibenden Ziffernpaare ein. (Dies ist das eigentliche Boxzeichen und keine Pipe. Leider haben die Zeichen─│┼
Codes, die zu weit voneinander entfernt sind, und die Doppelboxzeichen, um Platzhalter zu verwenden.)Ändert die erste Zeile in
╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗
(dies spart 1 Byte, wenn die erste Zeile nicht an erster Stelle hinzugefügt wird).Fügt
╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝
nach der letzten Zeile hinzu.Erweitert
a#bcd#e
sich zuerst zua#bc#d#bc#d#bc#e
, dann zua#b#c#b#c#b#d#b#c#b#c#b#d#b#c#b#c#b#e
.Änderungen
#b#
anbbb
. Damit ist die Dekomprimierung abgeschlossen.Löscht alle Null-Einträge und ersetzt die Platzhalter durch die Zeichen der Kastenzeichnung.
quelle
0
durch Leerzeichen zu ersetzen .SOGL V0.12 ,
174172164160158 BytesZu lange Erklärung:
Das ausgeführte Programm:
wo alle bis auf die letzte Zeile gerade sind
in the entire program replace occurrences of the last char of this line with the rest of this line
. Dies ist der Grund, warum es möglich war, die Hälfte der Zeichen als zufällige ASCII-Zeichen zu definieren.Probieren Sie es hier aus!
Der Online-Interpretercode ist korrekter, da Tabs mit SE nicht funktionieren
-8 Bytes: Brute-Force-Ersatz, der das gesamte Board komprimiert und dann fremde Zeichen (zur Codepage) durch ihre Codepunkte ersetzt. Dies dauerte eine Stunde weniger als das alte Programm ...
-4 Bytes: Komprimieren der komprimierten Zeichenfolge ...
-2 Bytes: Verwenden einer Variablen + Zeichenfolge anstelle eines Arrays
quelle
JavaScript (ES6), 246 Byte / 198 Zeichen
Die Eingabe ist ein Array von Ganzzahlen. Endete mit den gleichen zwei Hilfsfunktionen wie die Python-Antwort von Leaky Nun verwendet , also geht das Verdienst dahin.
Ob
function
erforderlich, 263 Byte / 215 ZeichenTestschnipsel
Jede Eingabe von 81 Nummern wird unterstützt (
1234
,1, 2, 3, 4
.[1 2 3 4]
, Etc). Am besten als ganze Seite betrachtet.quelle
Batch, 332 Bytes
Die Konsole muss sich im CP437 befinden. Wenn dies nicht Ihre Standardeinstellung ist, können Sie sie mit dem
CHCP 437
Befehl ändern, wenn Ihre Konsole auf TrueType-Schriftarten eingestellt ist. (Es funktioniert nur mit Raster-Schriftarten, wenn CP437 bereits Ihre Standard-Codepage ist.) So sieht der Code in CP437 aus:quelle
Mit Ideen aus anderen Antworten:
C # (.NET Core) , 401 Byte, 349 Zeichen
Ungolfed:
Probieren Sie es online!
Meine Antwort:
C # (.NET Core) ,
509 430418 Byte, 328 ZeichenUngolfed:
Probieren Sie es online!
quelle
Chip , 3645 Bytes
... das ist kein Tippfehler ...
Probieren Sie es online! irgendwie. Die TIO - Version enthält einen Cutoff von ungefähr einem Drittel des Weges in (the
t
nach dem 4oooooo
), sodass die in weniger als 60 Sekunden erfolgen sollte. Die Vollversion benötigt auf meinem Computer ungefähr 1: 25 Minuten, und TIO scheint ungefähr halb so schnell zu sein. Dies bedeutet auch, dass der TIO nur die ersten 7 Ausgabezeilen anzeigt.Mein erster Entwurf wog bei massiven 19758 Bytes und brauchte ungefähr 8:30 Minuten, um zu rennen. Die endgültige Lösung, das Pre-Golfing, war ein Spry von 5980 Bytes, der nur 2m07s benötigte.
Wie funktioniert es dann?
Dies dauert eine Zeichenfolge von 82 Bytes, 81 Ziffern, gefolgt von einem Abschlusszeichen.
\0
oder\n
oder sogar eine andere Nummer reicht aus. (Diese Implementierung betrachtet eigentlich nur die ersten 81, benötigt aber mindestens eine weitere, da Chip beendet wird, wenn seine Eingabe erschöpft ist. Wenn dies nicht akzeptabel ist, kann das Flag-z
verwendet werden, das effektiv eine unendliche Anzahl von anhängt\0
Bytes an das Ende der Eingabe.) Der verkürzte TIO-Code erreicht nicht alle 81 Bytes, daher ist der Punkt dort umstritten.In der Art, wie ich das implementiert habe, werden nur die niedrigen 4 Bits der Eingabe betrachtet, sodass alles, was wirklich ist, ein Sudoku-Puzzle sein kann, von rohen Binärdaten bis hin zu den weniger bekannten Werken von Shakespeare. Jedes Zeichen, dessen niedrige 4 Bits alle Null sind, wird als Leerzeichen angezeigt (ein Sonderfall), alle anderen Zeichen werden zugeordnet
123456789:;<=>?
. (Die letzten Ziffern sind also keine Ziffern, aber 10 ist auch keine gültige Zahl im normalen Sudoku).Für die Box-Zeichen wird UTF-8 erzeugt, was jeweils 3 Bytes entspricht.
Was ist mit der tatsächlichen Implementierung?
Chip ist eine 3D-Sprache, die von integrierten Schaltkreisen inspiriert ist. Es hat Drähte, Logikgatter und Speicherzellen. Die meisten Aufgaben werden in 2D-Ebenen ausgeführt, aber diese Ebenen können übereinander gestapelt werden. So wird dieses Programm aufgebaut.
Die Zeilen, die mit beginnen,
=
sind die Ebenentrennzeichen. Dann werden die Schichten gestapelt, wobei die obere und die linke Seite ausgerichtet sind. Daso
's dienen als Stifte, die es ermöglichen, dass Signale von einer Schicht zur anderen gelangen.Jede Ebene hier hat einen Zweck, man könnte sie sich als Funktionen vorstellen. Die erste Ebene steuert alles; es ruft nacheinander jede der anderen Schichten auf. Hier gibt es ein sich wiederholendes Muster von links nach rechts. Dieses Muster verfolgt, welche der 19 Ausgabezeilen gerade gedruckt werden.
Die zweite Schicht ist ziemlich winzig und hat eine sehr kleine Aufgabe. Es setzt das
0x80
Bit für alle Ausgabezeilen mit Ausnahme der Zeilen, die Zahlen enthalten.h
ist das Chip-Element, das dem0x80
Bit entspricht. (Das untere Ende des Alphabetsh
durcha
definiert alle acht Ausgangsbits.)In Schicht drei kommen wir wirklich in das Fleisch des Druckens. Diese Schicht ist verantwortlich für Zeile eins. Die ungolfed-Version hat acht Zeilen mit
x
's und)
' s, die für jedes der acht Bits jedes Bytes mit 0 und 1 verknüpft sind . Wir können jedoch die Muster in den Bits nutzen, um die gleiche Aufgabe in weniger Zeilen auszuführen.Die vierte Schicht ist der dritten sehr ähnlich. Es behandelt die horizontalen Doppellinien.
Die fünfte Ebene behandelt die letzte Zeile. Beachten Sie, dass der Draht an der Oberseite der anderen Schichten fehlt. Dies liegt daran, dass wir die Steuerung nicht an den Sequenzer zurückgeben müssen. Stattdessen können wir hier mit nur die Ausführung beenden
t
.Die sechste Ebene behandelt die horizontalen Einzellinien.
In Schicht sieben werden die Zahlen gedruckt. Es wird für jede der neun numerischen Zeilen "aufgerufen". Es verbraucht 9 Bytes an Eingaben als Teil seiner Ausführung.
quelle
JavaScript (ES6), 222 Byte
Verwenden der Kurzsyntax für ES6-Funktionen - 174 Zeichen in utf8, 222 Byte ( https://mothereff.in/byte-counter ). Für die Verwendung
function ...
sind 16 weitere Bytes erforderlich.Weniger golfen
quelle
Java (OpenJDK 8) , 279 Byte
Probieren Sie es online!
Verwenden Sie für die Byteanzahl CP-437, das von Java als
IBM437
(aktuelle APIs) oder nativ unterstützt wirdCp437
(ältere APIs) unterstützt wird. Verwenden Sie daher ein System mit diesem Zeichensatz, das diesen Zeichensatz als Standardzeichensatz verwendet.Dieser Code ist ab Java 5 kompatibel, wurde jedoch nur auf Java 8 getestet.
Erläuterung
quelle
Tcl , 599 Bytes (295 Zeichen)
Sehr naive Herangehensweise, aber ich musste es einfach tun, auch wenn es in keiner Weise ein Gewinner war:
Probieren Sie es online!
quelle