Imprimer un rectangle Pentomino


16

Écrivez un programme ou une fonction qui ne prend aucune entrée mais imprime ou retourne une représentation textuelle constante d'un rectangle composé des 12 pentominos distincts :

12 pentominos

Le rectangle peut avoir n'importe quelle dimension et être dans n'importe quelle orientation, mais les 12 pentominos doivent être utilisés exactement une fois, donc il aura la zone 60. Chaque pentomino différent doit être composé d'un caractère ASCII imprimable différent (vous n'avez pas besoin d'utiliser le lettres d'en haut).

Par exemple, si vous avez choisi de sortir cette solution de rectangle pentomino 20 × 3:

Solution 3x20

La sortie de votre programme pourrait ressembler à ceci:

00.@@@ccccF111//=---
0...@@c))FFF1//8===-
00.ttttt)))F1/8888=-

Alternativement, vous pourriez trouver plus facile de jouer au golf avec cette solution 6 × 10:

000111
203331
203431
22 444
2   46
57 666
57769!
58779!
58899!
5889!!

N'importe quelle solution rectangle suffira, votre programme n'a besoin que d'en imprimer une. (Une nouvelle ligne de fin dans la sortie est très bien.)

Ce grand site Web propose de nombreuses solutions pour différentes dimensions de rectangle et il vaut probablement la peine de les parcourir pour vous assurer que votre solution est aussi courte que possible. C'est le code-golf, la réponse la plus courte en octets l'emporte.


15
Bonus si c'est une "quine" dans Piet.
mbomb007

@ mbomb007 C'est à peu près impossible avec seulement 12 blocs pour jouer avec: P
Sp3000

Je ne pense pas que les espaces devraient être autorisés aux frontières. Mais puisqu'ils le sont, puis-je omettre les espaces de fin? Est-ce que j'obtiens un bonus si j'imprime une solution verticale 5x12 avec un espace vide à la fin?
John Dvorak

@ Sp3000 que diriez-vous d'un programme Piet entièrement composé de solutions pentomino rectangle?
John Dvorak

@JanDvorak Vous ne pouvez pas omettre les espaces de fin si vous en avez. Ce sont des caractères comme le reste de l'ASCII imprimable.
Calvin's Hobbies

Réponses:


1

Pyth, 37 octets

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

Manifestation

Utilise une approche très simple: utilisez des octets hexadécimaux comme nombres. Convertissez en un nombre hexadécimal, la base 256 l'encode. Cela donne la chaîne magique ci-dessus. Pour décoder, utilisez la fonction de décodeur de base 256 de Pyth, convertissez-la en hexadécimal, divisez-la en 4 morceaux et rejoignez-vous sur des nouvelles lignes.


5

CJam (44 octets)

Donné au format xxd car il contient des caractères de contrôle (y compris un onglet brut, qui joue vraiment mal avec MarkDown):

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 

qui décode quelque chose le long des lignes de

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

Démo en ligne légèrement non golfée qui ne contient pas de caractères de contrôle et joue donc bien avec les fonctions de la bibliothèque de décodage d'URI du navigateur.

Le principe de base est que, comme aucune pièce ne couvre plus de 5 lignes, nous pouvons coder un décalage à partir d'une fonction linéaire du numéro de ligne (en base 5, en fait, bien que je n'aie pas essayé de déterminer si ce serait toujours le cas ).


5

Bash + utilitaires Linux courants, 50

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

Pour recréer cela à partir de la base64 codée:

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

Puisqu'il y a 12 pentominos, leurs couleurs sont facilement encodées en nybbles hexadécimaux.

Production:

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

4

J, 49 octets

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

Vous pouvez choisir les lettres de manière à ce que les incréments maximaux entre les lettres verticalement adjacentes soient 2. Nous utilisons ce fait pour coder les incréments verticaux en base3. Après cela, nous créons les sommes en cours et ajoutons un décalage pour obtenir les codes ASCII des lettres.

Certainement golfable. (Je n'ai pas encore trouvé de moyen d'entrer des nombres en base36 à précision étendue, mais le simple base36 devrait économiser 3 octets à lui seul.)

Production:

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

Essayez-le en ligne ici.


Très agréable. Avec le codage en base 256, appliquer cette différence de codage dans CJam donne 33 octets ( version 48 octets sans b256 ).
Peter Taylor

C'est génial! Cela fonctionnerait également avec le 4x15, qui fonctionnerait bien pour regrouper quatre nombres dans un octet, si vous stockez des données dans le sens de la largeur plutôt que dans le sens de la longueur. Vous auriez besoin d'une mise en page qui a le pentomino U orienté dans le bon sens. Il y a beaucoup dans le lien à la question.
Level River St

@steveverrill Vous auriez besoin d'un décalage de départ pour cela car il y aura plus de 4 morceaux commençant sur la première ligne, vous ne pouvez donc pas les coder en base4. Avec ce décalage supplémentaire (par exemple, 3#i.5qui est 0 0 0 1 1 1 ... 4 4 4), cela peut fonctionner mais ne sera probablement pas plus court (du moins la façon dont j'ai essayé).
randomra

2

Microscript II , 66 octets

Commençons par la réponse simple.

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

Hourra, impression implicite.


1

Rubis

Rév 3, 55 octets

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

Pour développer davantage l'idée de Randomra, considérons le tableau des sorties et des différences ci-dessous. La table des différences peut être compressée comme précédemment et développée en multipliant par 65 = binaire 1000001 et en appliquant un masque 11001100110011. Cependant, Ruby ne fonctionne pas de manière prévisible avec des caractères 8 bits (il a tendance à les interpréter comme Unicode.)

Étonnamment, la dernière colonne est entièrement uniforme. Pour cette raison, en compression, nous pouvons effectuer un changement de droits sur les données. Cela garantit que tous les codes sont ASCII 7 bits. En expansion, nous multiplions simplement par 65 * 2 = 130 au lieu de 65.

La première colonne est également entièrement uniforme. Par conséquent, nous pouvons ajouter 1 à chaque élément (32 à chaque octet) si nécessaire, pour éviter tout caractère de contrôle. Le 1 indésirable est supprimé en utilisant le masque 10001100110011 = 9011 au lieu de 11001100110011.

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

Bien que j'utilise 15 octets pour la table, je n'utilise vraiment que 6 bits de chaque octet, soit un total de 90 bits. Il n'y a en fait que 36 valeurs possibles pour chaque octet, soit 2,21E23 au total. Cela rentrerait dans 77 bits d'entropie.

Rev 2, 58 octets, en utilisant l'approche incrémentale de Randomra

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

Enfin, quelque chose de plus court que la solution naïve. L'approche incrémentale de Randomra, avec la méthode bytepacking de Rev 1.

Rev 1, 72 octets, version golfée de rev 0

Certaines modifications ont été apportées à la ligne de base pour permettre une réorganisation du code pour des raisons de golf, mais elles sont toujours plus longues que la solution naïve.

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

Les décalages sont codés dans chaque caractère de la chaîne magique au format base 4 BAC, c'est-à-dire avec les 1 représentant le symbole de droite, les 16 représentant le symbole du milieu et le symbole de gauche chausse-pied en position de 4. Pour les extraire, le code ascii est multiplié par 65 (binaire 1000001) pour donner BACBAC, puis il est andé avec 819 (binaire 1100110011) pour donner .A.B.C.

Certains des codes ascii ont le 7e bit défini, c'est-à-dire qu'ils sont 64 supérieurs à la valeur requise, pour éviter les caractères de contrôle. Du fait que ce bit est supprimé par le masque 819, ceci est sans conséquence, sauf lorsque la valeur de Cest 3, ce qui provoque un report. Cela doit être corrigé en un seul endroit (au lieu de gnous devons l'utiliser c.)

Rev 0, version non golfée

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} 

Production

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

Explication

De la solution suivante, je soustrais la ligne de base, donnant le décalage que je stocke en tant que données. La ligne de base est régénérée sous la forme d'un nombre hexadécimal dans le code par i/2*273(273 décimal = 111 hex.)

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

Cela ressemble essentiellement à la même approche que la mienne, mais vous avez réussi à éviter le seul delta de 4 qui m'a forcé à encoder en base 5. On dirait que j'ai choisi le mauvais étiquetage pour les pièces.
Peter Taylor

J'ai vu votre réponse après avoir posté la mienne. Je ne peux pas suivre Cjam, mais d'après ce que vous avez dit dans votre réponse, c'est une approche similaire. En fait, je n'en ai qu'un seul 3dans tout le tableau (juste près du bas), donc je pense qu'en augmentant la ligne de base d'un peu plus de 0,5 à chaque ligne, il peut être possible d'utiliser la base 3. N'hésitez pas à essayer. (Pour des raisons de golf, il semble que je vais devoir changer légèrement la ligne de base, ce qui me donne un peu plus de 3, et malheureusement, il semble que cela va durer 1 octet de plus que la solution naïve de Ruby.)
Level River St

Au cas où je ne serais pas clair plus tôt, mon intention était de vous féliciter d'avoir fait un meilleur travail que moi, pas de vous accuser de copier. Et je ne vais pas essayer d'utiliser un taux de croissance de 2,5 parce que je ne pense pas qu'il battra l'approche de codage de différence de randomra.
Peter Taylor

@PeterTaylor merci, j'ai bien compris que vous me félicitiez. D'un autre côté, vous êtes entré en premier avec essentiellement la même idée et vous l'avez raccourcie, alors félicitations à vous aussi. Avec l'approche de la différence de randomra, je peux enfin devenir plus court que la solution naïve. Cela fonctionnerait bien aussi en 4x15 (étant donné la bonne disposition pentomino). C'est ainsi que je le ferais en C ou dans tout autre langage qui fonctionne bien avec les chaînes 8.bit. Comme Ruby prend en charge l'unicode, il essaie d'interpréter les chaînes de 8 bits comme unicode et peut donner des messages d'erreur gênants.
Level River St

0

Foo, 66 octets

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

Ceci est caractère pour caractère identique à la solution Microscript II ci-dessus ... Je suppose que ces langues sont liées?
Darrel Hoffman

1
@DatrelHoffman pas vraiment, foo imprime simplement tout entre guillemets
Teoc
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.