Drucken Sie ein Pentomino-Rechteck


16

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 :

12 Pentominos

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:

3x20 Lösung

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.


15
Bonus, wenn es ein "Quine" in Piet ist.
mbomb007

@ mbomb007 Mit nur 12 Blöcken ist das so ziemlich unmöglich: P
Sp3000 10.11.15

Ich denke nicht, dass Leerzeichen an den Grenzen erlaubt sein sollten. Kann ich nachstehende Leerzeichen weglassen, da dies der Fall ist? Bekomme ich einen Bonus, wenn ich eine vertikale 5x12-Lösung drucke und am Ende kein Leerzeichen mehr vorhanden ist?
John Dvorak

@ Sp3000 Wie wäre es mit einem Piet-Programm, das ausschließlich aus Pentomino-Rechteck-Lösungen besteht?
John Dvorak

@JanDvorak Nachgestellte Leerzeichen können nicht ausgelassen werden, wenn sie vorhanden sind. Sie sind Zeichen, genau wie der Rest des druckbaren ASCII.
Calvins Hobbys

Antworten:


1

Pyth, 37 Bytes

jc4.HC"&f3ªªwril3:[·)ÌDU[r)ÌDA»

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.


5

CJam (44 Bytes)

Wird im xxd-Format angegeben, da es Steuerzeichen enthält (einschließlich eines unformatierten Tabulators, der mit MarkDown sehr schlecht funktioniert):

0000000: 2202 7e0d 8ef3 570d e085 e168 cf27 092c
0000010: a235 0c22 3235 3662 3562 332f 5f2c 2c2e
0000020: 7b32 2f27 412b 662b 7d7a 4e2a 

was zu etwas in der Art von

"MAGIC STRING"256b5b3/_,,.{2/'A+f+}zN*

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 ).


5

Bash + gängige Linux-Utils, 50

xxd -s20 -p -c2 $0
#<30 bytes of binary data>

So erstellen Sie dies aus codiertem base64 neu:

base64 -d <<< eHhkIC1zMjAgLXAgLWMyICQwCiMiImaSaZlmkDAAMwSjRKNEqoGogYhRVVF7UXu7d3s= > pent.sh

Da es 12 Pentominos gibt, können ihre Farben leicht in hexadezimalen Zahlen kodiert werden.

Ausgabe:

$ ./pent.sh
2222
6692
6999
6690
3000
3304
a344
a344
aa81
a881
8851
5551
7b51
7bbb
777b
$ 

4

J, 49 Bytes

u:64++/\|:3#.inv 1377859090 1567813024 1337683230

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:

AAA
ABA
BBB
DBC
DCC
DCC
DEE
DFE
FFE
FGE
FGG
GGH
HHH
IIH
JII
JJI
JKK
JKL
KKL
LLL

Probieren Sie es hier online aus.


Sehr schön. Bei einer Base-256-Codierung ergibt diese Differenzcodierung in CJam 33 Byte ( 48-Byte-Version ohne b256 ).
Peter Taylor

Das ist fantastisch! Es würde auch mit dem 4x15 funktionieren, der sich gut zum Packen von vier Zahlen in ein Byte eignet, wenn Sie Daten eher in der Breite als in der Länge speichern. Sie benötigen ein Layout, bei dem das U-Pentomino in die richtige Richtung zeigt. In dem Link zu der Frage gibt es reichlich.
Level River St

@steveverrill Du brauchst dafür einen Startoffset, da in der ersten Zeile mehr als 4 Teile beginnen, sodass du diese nicht in base4 codieren kannst. Mit diesem zusätzlichen Versatz (z. B. 3#i.5welcher ist 0 0 0 1 1 1 ... 4 4 4) kann es funktionieren, wird aber wahrscheinlich nicht kürzer (zumindest so, wie ich es versucht habe).
Randomra

2

Mikroskript II , 66 Bytes

Beginnen wir mit der einfachen Antwort.

"00.@@@ccccF111//=---\n0...@@c))FFF1//8===-\n00.ttttt)))F1/8888=-"

Hurra implizites Drucken.


1

Rubin

Rev 3, 55 Byte

i=1
'S, OJ1*$HCH(#%0'.bytes{|e|puts "%x"%i+=e*130&9011}

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.

Solution 59 of document linked in question

Start0001

Out  Diff
2223 2222
2433 0210
2433 0000
4445 2012
6555 2110
6577 0022
6687 0110
6887 0200
8897 2010
aa99 2202
caa9 2010
cab9 0010
cbbb 0102
cdbd 0202
cddd 0020

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

i=0
'UPEIP@bPHPBETTEPRADT'.bytes{|e|puts "%x"%i+=e*65&819}

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.

i=0
'UPUIYD&!)$&V*).);c+*'.bytes{|e|i+=1;puts "%x"%(i/2*273+(e*65&819))}

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 geben BACBAC, 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 C3 ist, was einen Übertrag verursacht. Dies muss nur an einer Stelle korrigiert werden (statt gwir müssen verwenden c.)

Rev. 0, ungolfed version

a= %w{000 010 000 201 100 100 011 021 110 120 011 112 111 221 211 221 122 123 112 222}
i=2
a.each{|e|puts "%x"%(i/2*273+e.to_i(16));i+=1} 

Ausgabe

111
121
222
423
433
433
455
465
665
675
677
778
888
998
a99
aa9
abb
abc
bbc
ccc

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 .

solution   baseline   offset
AAA        AAA        000
ABA        AAA        010
BBB        BBB        000
DBC        BBB        201
DCC        CCC        100
DCC        CCC        100
DEE        DDD        011
DFE        DDD        021
FFE        EEE        110
FGE        EEE        120
FGG        FFF        011
GGH        FFF        112
HHH        GGG        111
IIH        GGG        221
JII        HHH        211
JJI        HHH        221
JKK        III        122
JKL        III        123
KKL        JJJ        112
LLL        JJJ        222

Das sieht im Wesentlichen so aus wie bei mir, aber Sie haben es geschafft, das einzelne Delta von 4 zu vermeiden, das mich gezwungen hat, in Basis 5 zu codieren. Es sieht so aus, als hätte ich die falsche Beschriftung für die Teile gewählt.
Peter Taylor

Ich habe deine Antwort gesehen, nachdem ich meine gepostet habe. Ich kann Cjam nicht folgen, aber was Sie in Ihrer Antwort gesagt haben, ist ein ähnlicher Ansatz. Ich habe tatsächlich nur eine einzige 3in 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.)
Level River St

Für den Fall, dass ich früher nicht klar war, war meine Absicht, Ihnen zu einer besseren Arbeit als mir zu gratulieren und Sie nicht des Kopierens zu beschuldigen. Und ich werde nicht versuchen, eine Wachstumsrate von 2,5 zu verwenden, da ich nicht denke, dass sie Randomras Ansatz zur Differenzcodierung übertrifft.
Peter Taylor

@PeterTaylor danke, ich habe verstanden, dass du mir gratuliert hast. Auf der anderen Seite sind Sie zuerst mit der gleichen Idee eingestiegen und haben sie viel kürzer gemacht, also auch Glückwunsch an Sie. Mit Randomras Differenzansatz kann ich endlich kürzer werden als die naive Lösung. Es würde auch bei 4x15 gut funktionieren (vorausgesetzt, das richtige Pentomino-Layout). So würde ich es in C oder einer anderen Sprache machen, die gut mit 8-Bit-Strings funktioniert. Da Ruby Unicode unterstützt, wird versucht, 8-Bit-Zeichenfolgen als Unicode zu interpretieren, und es können nervige Fehlermeldungen auftreten.
Level River St

0

Foo, 66 Bytes

"00.@@@ccccF111//=---\n0...@@c))FFF1//8===-\n00.ttttt)))F1/8888=-"

Dies ist zeichenweise identisch mit der obigen Lösung von Microscript II ... Ich nehme an, dass diese Sprachen verwandt sind?
Darrel Hoffman

1
@DatrelHoffman nicht wirklich, foo druckt im Grunde nur alles in Anführungszeichen
Teoc
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.