Como faço isso?

21

Existem 21 itens no Minecraft que você pode criar usando apenas madeira e itens criados a partir de madeira:

machado
barco
tigela
botão
no peito
elaboração de mesa
porta
cerca
portão
enxada
escada
picareta
pranchas de
placa de pressão

sinal
laje
escadas
ficar
espada
alçapão

Esta lista pressupõe que os 6 tipos diferentes de pranchas / lajes / portas de madeira / etc. todos contam como o mesmo item. Outra maneira de pensar é assumir que você só tem acesso a um tipo de madeira.

Cada um desses 21 itens tem uma receita de artesanato diferente . Representaremos cada uma dessas receitas como uma grade 2 × 2 ou 3 × 3 dos caracteres .WPS. O .slot para criação é vazio, Wé para madeira , Pé para pranchas de madeira e Sé para paus . Nenhum outro caractere é necessário para esses itens em particular.

Por exemplo, esta é a receita para um baú :

PPP
P.P
PPP

Desafio

Escreva um programa com o nome de um de nossos 21 itens, exatamente como aparece acima, e imprima uma receita de fabricação válida para esse item.

As receitas de criação são invariantes à tradução; portanto, se a entrada for fence, ambas são válidas:

PSP
PSP
...
...
PSP
PSP

Se uma receita se encaixa em uma grade 2 × 2, você pode produzi-la em uma grade 2 × 2 ou 3 × 3. por exemplo stick:

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

As receitas também podem ser espelhadas horizontalmente (em torno de uma linha vertical de simetria), embora isso só faça diferença para o machado, a enxada e as escadas. por exemplo hoe:

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

Portanto, a saída de qualquer receita que se encaixe na grade e tenha a forma correta (ignorando a tradução e o espelhamento) é o que o seu programa precisa fazer. Estas são todas as receitas que o jogo oficial reconhecerá. (Observe que as receitas não podem ser giradas ou espelhadas verticalmente.)

Detalhes

  • Receba as informações do stdin ou da linha de comando. Você pode assumir que a entrada é sempre válida. Exigir aspas em torno da entrada (por exemplo "chest") é bom.
  • Saída para stdout (ou alternativa mais próxima) com uma nova linha à direita opcional.
  • O menor envio em bytes vence.

Exemplo

Aqui está uma lista de todas as entradas e saídas de amostra:

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
...
Passatempos de Calvin
fonte
11
Dadas as amostras de saída, não vejo nenhuma exceção. Tudo pode ser espelhado, mas a maioria é simétrica.
edc65
Como "in bytes" está vinculado ao contador UTF-8, isso significa que precisamos contar bytes em UTF-8?
Martin Ender
Apenas programas completos? Sem funções?
Alex A.
@Alex A. Certo.
Hobbies de Calvin
@ MartinBüttner Faça isso não. (Você sabe porque, embora ele provavelmente não importa mais: P.)
de Calvino Hobbies

Respostas:

15

CJam, 100 96 94 91 bytes

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

O StackExchange controla os imprimíveis, então, em vez de copiar e colar aqui, está o link permanente . Além disso, aqui está o programa de teste .

(Obrigado ao @Optimizer por me falar sobre fe @ MartinBüttner por me falar sobre a indexação do módulo do CJam.)

Cygwin's 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

Explicação

Para construir as receitas, usamos 13 linhas diferentes (também listadas estão explicações sobre por que isso é mínimo):

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)

Codificamos as linhas via Z"O>HVa=4a"98bZb+"P.SW"f=3/, o que fornece

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

O primeiro bit "+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/codifica as receitas, dando

[[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]]

Observe como é a primeira entrada [3 3 8], qual é a receita sign.

l72b970%=lê a entrada e, em seguida, aplica alguma mágica para descobrir qual receita extrair da lista. Embora tenhamos apenas 21 receitas, há 24 na lista - os poucos pontos extras correspondem aos [1 0 0]s.

Depois de ler a entrada, escolher a receita e converter a receita em linhas, inserimos algumas linhas novas N*e a impressão automática.


CJam, 89 86 83 bytes

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

... acontece que codificar todas as saídas é um pouco melhor no CJam. Estou muito decepcionado.

Mais uma vez, temos alguns imprimíveis, então aqui está o programa de permalink e teste .

Cygwin's 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

Explicação

As saídas são codificadas usando a base 3, com o solitário Wsendo pregado na frente antes que a sequência seja dividida em 3s para dar linhas, e as linhas são divididas em grupos de 3s para dar receitas.

Como acima, a conversão de base e o módulo mágico são usados ​​para selecionar a receita. Existem 22 receitas (uma não utilizada), mas precisamos 24%usar o módulo 24, portanto, na verdade, precisamos especificar explicitamente esse tempo, em vez de confiar na indexação do módulo.

Sp3000
fonte
Você pode postar um hexdump com xxd? Os links permanentes não funcionam no Firefox.
ǹ̷̰ĥ̷̳h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 23/03
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̷̨̰́̀ĥ̷̳ Infelizmente, estou no Windows, então coloquei a próxima melhor coisa que consegui gerenciar por enquanto.
Sp3000 24/03
6

JavaScript (ES6), 235241226

Editar Abusando ainda mais da regra de que a entrada é sempre válida: há apenas 1 item que requer W e que pode ser especial. Portanto, a grade de saída é codificada como 9 dígitos base 3 números.

235 bytes com E / S via pop-up.

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 bytes como uma função testável.

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

Saída sempre como grade 3x3. Com 4 symobols de saída disponíveis, a grade é codificada como um número de bits 3x3x2 (18). E como a entrada deve ser sempre válida, a sequência é armazenada truncada no mínimo.

Teste no 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)))

Saída

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
fonte
2

Python, 305 bytes

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

Explicação

# 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

Comente

Esse código certamente não é o menor, mas funciona muito bem. Estou satisfeito. :)

Python, 282 bytes

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

Usando a mesma técnica para gerar um identificador exclusivo, mas procurando diretamente a receita em uma matriz. É muito mais simples e um pouco mais compacto que o meu primeiro código.

NeatMonster
fonte
Ter um caso especial para 'tábuas' você pode encurtar a corda paraW.\n..
edc65