Schreiben Sie ein Programm oder eine Funktion, die keine Eingabe benötigt, sondern eine konstante Textdarstellung eines Rechtecks aus den 12 verschiedenen Pentominos ausgibt oder zurückgibt :
Das Rechteck kann beliebige Abmessungen haben und in beliebiger Ausrichtung sein, aber alle 12 Pentominos müssen genau einmal verwendet werden, damit es den Bereich 60 hat. Jedes unterschiedliche Pentomino muss aus einem anderen druckbaren ASCII- Zeichen bestehen (Sie müssen das nicht verwenden) Buchstaben von oben).
Wenn Sie beispielsweise diese 20 × 3-Pentomino-Rechtecklösung ausgeben möchten, gehen Sie wie folgt vor:
Die Ausgabe Ihres Programms könnte etwa so aussehen:
00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-
Alternativ fällt es Ihnen möglicherweise leichter, diese 6 × 10-Lösung zu spielen:
000111
203331
203431
22 444
2 46
57 666
57769!
58779!
58899!
5889!!
Jede Rechtecklösung reicht aus, Ihr Programm muss nur eine drucken. (Eine nachgestellte Zeile in der Ausgabe ist in Ordnung.)
Diese großartige Website bietet eine Vielzahl von Lösungen für verschiedene Rechteckdimensionen und es lohnt sich wahrscheinlich, sie zu durchsuchen, um sicherzustellen, dass Ihre Lösung so kurz wie möglich ist. Dies ist Code-Golf, die kürzeste Antwort in Bytes gewinnt.
quelle
Antworten:
Pyth, 37 Bytes
Demonstration
Verwendet einen sehr einfachen Ansatz: Verwenden Sie hexadezimale Bytes als Zahlen. In eine Hex-Zahl umwandeln, Basis 256 kodiert das. Das gibt die magische Zeichenfolge oben. Verwenden Sie zum Dekodieren Pyths Basis-256-Dekoder-Funktion, konvertieren Sie in hexadezimale Zeichen, teilen Sie sie in 4 Teile auf und fügen Sie Zeilenumbrüche hinzu.
quelle
CJam (44 Bytes)
Wird im xxd-Format angegeben, da es Steuerzeichen enthält (einschließlich eines unformatierten Tabulators, der mit MarkDown sehr schlecht funktioniert):
was zu etwas in der Art von
Etwas ungolfed Online-Demo, die keine Steuerzeichen enthält und daher gut mit den Funktionen der Browser-URI-Dekodierungsbibliothek funktioniert.
Das Grundprinzip ist, dass wir, da kein Stück mehr als 5 Zeilen umfasst, einen Versatz von einer linearen Funktion der Zeilennummer kompakt codieren können (in der Tat in Basis 5, obwohl ich nicht versucht habe, zu bestimmen, ob dies immer der Fall sein würde ).
quelle
Bash + gängige Linux-Utils, 50
So erstellen Sie dies aus codiertem base64 neu:
Da es 12 Pentominos gibt, können ihre Farben leicht in hexadezimalen Zahlen kodiert werden.
Ausgabe:
quelle
J, 49 Bytes
Sie können die Buchstaben so auswählen, dass die maximalen Inkremente zwischen vertikal benachbarten Buchstaben 2 betragen. Wir verwenden diese Tatsache, um vertikale Inkremente in base3 zu codieren. Danach erstellen wir die laufenden Summen und fügen einen Offset hinzu, um die ASCII-Codes der Buchstaben zu erhalten.
Auf jeden Fall golfen. (Ich muss noch einen Weg finden, um erweiterte Genauigkeit für base36-Zahlen einzugeben, aber einfaches base36 sollte allein 3 Bytes sparen.)
Ausgabe:
Probieren Sie es hier online aus.
quelle
3#i.5
welcher ist0 0 0 1 1 1 ... 4 4 4
) kann es funktionieren, wird aber wahrscheinlich nicht kürzer (zumindest so, wie ich es versucht habe).Mikroskript II , 66 Bytes
Beginnen wir mit der einfachen Antwort.
Hurra implizites Drucken.
quelle
Rubin
Rev 3, 55 Byte
Beachten Sie als Weiterentwicklung von Randomras Idee die folgende Ausgabe- und Differenztabelle. Die Differenztabelle kann wie zuvor komprimiert und durch Multiplizieren mit 65 = binär 1000001 und Anwenden einer Maske 11001100110011 erweitert werden. Ruby funktioniert jedoch nicht vorhersehbar mit 8-Bit-Zeichen (es interpretiert sie tendenziell als Unicode).
Überraschenderweise ist die letzte Spalte völlig gerade. Aus diesem Grund können wir bei der Komprimierung eine Verschiebung der Rechte an den Daten vornehmen. Dies stellt sicher, dass alle Codes 7-Bit-ASCII sind. Bei der Erweiterung multiplizieren wir einfach mit 65 * 2 = 130 anstatt mit 65.
Die erste Spalte ist auch ganz gerade. Daher können wir bei Bedarf zu jedem Element 1 hinzufügen (32 zu jedem Byte), um Steuerzeichen zu vermeiden. Die unerwünschte 1 wird mit der Maske 10001100110011 = 9011 anstelle von 11001100110011 entfernt.
Obwohl ich 15 Bytes für die Tabelle verwende, verwende ich wirklich nur 6 Bits von jedem Byte, was insgesamt 90 Bits entspricht. Tatsächlich gibt es nur 36 mögliche Werte für jedes Byte, was insgesamt 2.21E23 Möglichkeiten entspricht. Das würde in 77 Bits Entropie passen.
Rev 2, 58 Bytes, mit Randomras inkrementellem Ansatz
Schließlich etwas kürzer als die naive Lösung. Randomras inkrementeller Ansatz mit der Bytepack-Methode von Rev. 1.
Rev 1, 72 Bytes, Golfversion von Rev 0
Einige Änderungen wurden an der Grundlinie vorgenommen, um eine Neuordnung des Codes aus Golfgründen zu berücksichtigen, kamen aber immer noch länger als die naive Lösung.
Die Offsets werden in jedem Zeichen der magischen Zeichenkette in Basis 4 im Format codiert
BAC
, dh die Einsen stehen für das rechte Symbol, die Sechsen für das mittlere Symbol und das linke Symbol werden an die Position der Vier gesetzt. Um sie zu extrahieren, wird der ASCII-Code mit 65 (binär 1000001) multipliziert, um zu gebenBACBAC
, und dann wird er mit 819 (binär 1100110011) anded, um zu geben.A.B.C
.Einige der ASCII-Codes haben das 7. Bit gesetzt, dh sie sind 64 höher als der erforderliche Wert, um Steuerzeichen zu vermeiden. Da dieses Bit von der Maske 819 entfernt wird, ist dies nicht von Belang, außer wenn der Wert
C
3 ist, was einen Übertrag verursacht. Dies muss nur an einer Stelle korrigiert werden (stattg
wir müssen verwendenc
.)Rev. 0, ungolfed version
Ausgabe
Erläuterung
Von der folgenden Lösung subtrahiere ich die Grundlinie und gebe den Versatz an, den ich als Daten speichere. Die Grundlinie wird im Code als Hexadezimalzahl um
i/2*273
(273 Dezimal = 111 Hex.) Neu generiert .quelle
3
in der gesamten Tabelle (rechts unten), also denke ich, wenn ich die Grundlinie mit jeder Zeile um etwas mehr als 0,5 erhöhe, ist es tatsächlich möglich, die Basis 3 zu verwenden. Versuchen Sie es einfach. (Aus Golfgründen muss ich wohl die Grundlinie ein wenig ändern, was mir mehr 3 ergibt. Leider sieht es so aus, als würde es 1 Byte länger sein als die naive Lösung in Ruby.)Foo, 66 Bytes
quelle