Comment puis-je créer ça?

21

Il y a 21 objets dans Minecraft que vous pouvez fabriquer en utilisant uniquement du bois et des objets fabriqués à partir de bois:

hache
bateau
bol
bouton
poitrine
artisanat table
porte
clôture
porte
houe
échelle
pioche
planches
plaque de pression
pelle
signe
dalle
escaliers
bâton
épée
trappe

Cette liste suppose que les 6 différents types de planches / dalles / portes / etc. En bois. tous comptent comme le même article. Une autre façon de penser est de supposer que vous n'avez accès qu'à un seul type de bois.

Chacun de ces 21 articles a une recette d'artisanat différente . Nous représenterons chacune de ces recettes comme une grille 2 × 2 ou 3 × 3 des personnages .WPS. Il .s'agit d'un emplacement d'artisanat vide, Wdestiné au bois , Paux planches de bois et Saux bâtons . Aucun autre personnage n'est nécessaire pour ces éléments particuliers.

Par exemple, voici la recette d'un coffre :

PPP
P.P
PPP

Défi

Écrivez un programme qui prend le nom de l'un de nos 21 articles, exactement comme il apparaît ci-dessus, et imprime une recette d'artisanat valide pour cet article.

Les recettes de fabrication sont invariantes par rapport à la traduction, donc si l'entrée est fence, les deux sont valides:

PSP
PSP
...
...
PSP
PSP

Si une recette tient dans une grille 2 × 2, vous pouvez la sortir dans une grille 2 × 2 ou 3 × 3. par exemple stick:

.P
.P
...
.P.
.P.

Les recettes peuvent également être mises en miroir horizontalement (autour d'une ligne de symétrie verticale), bien que cela ne fasse une différence que pour la hache, la houe et les escaliers. par exemple hoe:

.PP
.S.
.S.
PP.
.S.
.S.

Donc, la sortie de toute recette qui tient dans la grille et qui a la bonne forme (en ignorant la traduction et la mise en miroir) est ce que votre programme doit faire. Ce sont toutes les recettes que le jeu officiel reconnaîtra. (Notez que les recettes ne peuvent pas être tournées ou mises en miroir verticalement.)

Détails

  • Prenez l'entrée de stdin ou de la ligne de commande. Vous pouvez supposer que l'entrée est toujours valide. Exiger des guillemets autour de l'entrée (par exemple "chest") est très bien.
  • Sortie vers stdout (ou l'alternative la plus proche) avec une nouvelle ligne de fin facultative.
  • La soumission la plus courte en octets l' emporte.

Exemple

Voici une liste de toutes les entrées et exemples de sorties:

axe
PP.
SP.
S..

boat
P.P
PPP
...

bowl
P.P
.P.
...

button
P.
..

chest
PPP
P.P
PPP

crafting table
PP
PP

door
PP.
PP.
PP.

fence
PSP
PSP
...

gate
SPS
SPS
...

hoe
PP.
S..
S..

ladder
S.S
SSS
S.S

pickaxe
PPP
.S.
.S.

planks
W.
..

pressure plate
PP
..

shovel
P..
S..
S..

sign
PPP
PPP
.S.

slab
PPP
...
...

stairs
P..
PP.
PPP

stick
P.
P.

sword
P..
P..
S..

trapdoor
PPP
PPP
...
Loisirs de Calvin
la source
1
Compte tenu de vos échantillons de sortie, je ne vois aucune exception. Tout peut être mis en miroir, mais la plupart sont symétriques.
edc65
Depuis « en octets » liens vers le compteur UTF-8, est -ce que cela veut dire que nous devons compter octets en UTF-8?
Martin Ender
Programmes complets uniquement? Pas de fonctions?
Alex A.
@Alex A. C'est vrai.
Calvin's Hobbies
@ MartinBüttner Faites que non. (Vous savez pourquoi, même si cela n'a plus d'importance.: P)
Calvin's Hobbies

Réponses:

15

CJam, 100 96 94 91 octets

"+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/l72b970%={Z"O>HVa=4a"98bZb+"P.SW"f=3/=}%N*

StackExchange modifie les non imprimables, donc plutôt que de copier et coller ici est le permalien . De plus, voici le programme de test .

(Merci à @Optimizer de m'avoir parlé fet à @ MartinBüttner de m'avoir parlé de l'indexation modulo de CJam.)

Cygwin hexdump:

0000000 0122 2b1e 571a 6308 621f 4b05 2046 5141
0000010 1608 1848 5f3b 1115 1d7b 4d47 4c38 6679
0000020 5f3d 6d74 0c54 226e 3431 6231 6244 2f33
0000030 376c 6232 3739 2530 7b3d 225a 1b4f 483e
0000040 6156 343d 2261 3839 5a62 2b62 5022 532e
0000050 2257 3d66 2f33 7d3d 4e25 002a          
000005b

Explication

Pour construire les recettes, nous utilisons 13 lignes différentes (également expliquées pourquoi cela est minimal):

0    W..    (required by planks)
1    ...    (required by many)
2    .PP    (required by many)
3    PPP    (required by chest)
4    .P.    (required by bowl)
5    ..P    (required by stairs)
6    S.S    (required by ladder)
7    SSS    (required by ladder)
8    .S.    (required by sign)
9    .SP    (required by axe)
10   P.P    (required by bowl)
11   PSP    (required by fence)
12   SPS    (required by gate)

Nous encodons les lignes via Z"O>HVa=4a"98bZb+"P.SW"f=3/, ce qui donne

["W.." "..." ".PP" "PPP" ".P." "..P" "S.S" "SSS" ".S." ".SP" "P.P" "PSP" "SPS"]

Le premier bit "+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/encode les recettes, donnant

[[3 3 8] [1 0 0] [1 0 0] [3 8 8] [1 3 3] [2 8 8] [6 7 6] [1 0 0] [1 10 3] [1 1 2] [2 2 2] [1 11 11] [1 1 4] [1 0 1] [1 10 4] [2 9 8] [3 10 3] [1 2 2] [4 8 8] [1 4 4] [1 1 3] [1 12 12] [4 4 8] [5 2 3]]

Notez comment est la première entrée [3 3 8], qui est la recette sign.

l72b970%=lit l'entrée, puis applique un peu de magie pour déterminer la recette à prendre dans la liste. Même si nous n'avons que 21 recettes, il y en a 24 dans la liste - les quelques spots supplémentaires correspondent aux [1 0 0]s.

Après avoir lu l'entrée, choisi la recette et converti la recette en lignes, nous avons ajouté quelques nouvelles lignes N*et l'impression automatique.


CJam, 89 86 83 octets

'W"9=!%)S@*m:@DQzk?V$%qyR55AmVEpPNW}"132b3b"P.S"f=+3/3/l57b5342%24%(=N*

... il s'avère que le codage en dur de toutes les sorties fait un peu mieux dans CJam. Je suis assez déçu.

Encore une fois, nous avons quelques imprimables donc voici le programme de permalien et de test .

Cygwin hexdump:

0000000 5727 0222 3d39 1021 2925 531e 2a40 6d0b
0000010 403a 1844 7a51 3f6b 2456 7125 5279 3506
0000020 4135 046d 1a56 7045 1550 164e 1057 7d01
0000030 3122 3233 3362 2262 2e50 2253 3d66 332b
0000040 332f 6c2f 3735 3562 3433 2532 3432 2825
0000050 4e3d 002a                              
0000053

Explication

Les sorties sont codées en utilisant la base 3, le seul Wétant cloué sur le devant avant que la chaîne ne soit divisée en 3 pour donner des lignes, et les lignes sont divisées en groupes de 3 pour donner des recettes.

Comme ci-dessus, la conversion de base et la magie modulo sont utilisées pour sélectionner la recette. Il y a 22 recettes (une inutilisée) mais nous devons prendre modulo 24, nous devons donc spécifier explicitement 24%cette heure plutôt que de compter sur l'indexation modulo.

Sp3000
la source
Pouvez-vous publier un hexdump avec xxd? Les permaliens ne fonctionnent pas sur Firefox.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Malheureusement, je suis sous Windows, j'ai donc mis en place la meilleure chose que je pourrais gérer pour l'instant.
2015
6

JavaScript (ES6), 235 241 262

Modifier En abusant encore plus de la règle selon laquelle la saisie est toujours valide: il n'y a qu'un seul élément qui nécessite W, et qui peut être un boîtier spécial. Ainsi, la grille de sortie est codée en 9 chiffres de base 3.

235 octets avec E / S via popup.

w=prompt();
"926a722boa182bo2b19520ch224c6056d644f448g764h7651l2294pi8pr758sh2915si26sl19172sta56st785s728t"
.replace(/(\d+)(\D+)/g,(c,p,m)=>w.search(m+z)||[for(c of'11\n11\n111')z+='.SP'[~~p%3]+(p/=3,-c?'':c)],z='');
alert(&&z||'W.\n..')

221 octets comme fonction testable.

F=w=>"926a722boa182bo2b19520ch224c6056d644f448g764h7651l2294pi8pr758sh2915si26sl19172sta56st785s728t"
.replace(/(\d+)(\D+)/g,(c,p,m)=>w.search(m+z)||[for(c of'11\n11\n111')z+='.SP'[~~p%3]+(p/=3,-c?'':c)],z='')&&z||'W.\n..'

Sortie toujours en grille 3x3. Avec 4 symoboles de sortie disponibles, la grille est codée sous la forme d'un nombre de 3x3x2 (18) bits. Et comme l'entrée doit être toujours valide, la chaîne est stockée tronquée au strict minimum.

Tester dans la console Firefox / FireBug

;["axe", "boat", "bowl", "button", "chest", "crafting table", "door", 
 "fence", "gate", "hoe", "ladder", "pickaxe", "planks", "pressure plate", 
 "shovel", "sign", "slab", "stairs", "stick", "sword", "trapdoor"]
.forEach(v=>console.log(v+'\n'+F(v)))

Production

axe
PP.
SP.
S..

boat
P.P
PPP
...

bowl
P.P
.P.
...

button
P..
...
...

chest
PPP
P.P
PPP

crafting table
PP.
PP.
...

door
PP.
PP.
PP.

fence
PSP
PSP
...

gate
SPS
SPS
...

hoe
PP.
S..
S..

ladder
S.S
SSS
S.S

pickaxe
PPP
.S.
.S.

planks
W.
..

pressure plate
PP.
...
...

shovel
P..
S..
S..

sign
PPP
PPP
.S.

slab
PPP
...
...

stairs
P..
PP.
PPP

stick
P..
P..
...

sword
P..
P..
S..

trapdoor
PPP
PPP
...
edc65
la source
2

Python, 305 octets

n=2**(23-hash(raw_input())/535366%24);print "W..\n...\n..." if n==1024 else "\n".join(["".join(['P' if [16706041,9740732,7635081,7399784,5267501,7372808,57344,57344,49152][j+i*3]&n==n else 'S' if [6,2097152,6,131078,10748162,6,131138,9699584,2][j+i*3]&n==n else '.' for j in range(3)]) for i in range(3)])

Explication

# Compute a unique number for each item.
# 535366 and 24 are precalculated values that were bruteforced.
n = 23 - hash(raw_input()) / 535366 % 24

# Use precalculated tables that represent which ingredient in this recipe of
# an item. The nth bit of p[0] will be set if the first ingredient of the item
# associated with the unique number n is some planks. It works the same for s.
p = [16706041,9740732,7635081,7399784,5267501,7372808,57344,57344,49152]
s = [6,2097152,6,131078,10748162,6,131138,9699584,2]

# Handle planks differently, as it is the only one using wood.
if n == 10:
    print "W..\n...\n..."
else:
    for i in xrange(3):
        line = ""
        for j in xrange(3):
            # Now we can check if the ingredient is some planks...
            if p[j + i * 3] & 1 << n == 1 << n:
                line += 'P'
            # ...or if it is some sticks...
            elif s[j + i * 3] & 1 << n == 1 << n:
                line += 'S'
            # ...or if it is simply empty.
            else:
                line += '.'
        print line

Commentaire

Ce code n'est certainement pas le plus petit mais il fonctionne très bien. Je suis satisfait. :)

Python, 282 octets

n=hash(raw_input())/808789215%21;print "\n".join(["P.PPPP...P..S..S..PP.......PP.PP....P........SPSSPS...PPPPPP.S.PP.PS..S.W........PPPPPP...PP..S..S.P..PP.PPPS.SSSSS.SPPP.S..S.PPP......P..P..S..PPPP.PPPPPSPPSP...PP.PP.PP.P..P.....P.P.P...."[9*n+i*3:9*n+(i+1)*3] for i in range(3)])

En utilisant la même technique pour générer un identifiant unique mais en recherchant directement la recette dans un tableau. C'est beaucoup plus simple et un peu plus compact que mon premier code.

NeatMonster
la source
Ayant un cas spécial pour les «planches», vous pouvez raccourcir la chaîne àW.\n..
edc65