¿Cómo hago eso?

21

Hay 21 elementos en Minecraft que puedes crear usando solo madera y elementos hechos de madera:

hacha
barco
tazón
botón
cofre
elaboración mesa
puerta
valla
puerta
azada
escalera
pico
tablones
placa de presión
pala
signo
losa
escaleras
palo
espada
trampa

Esta lista supone que los 6 tipos diferentes de tablones de madera / losas / puertas / etc. Todos cuentan como el mismo artículo. Otra forma de pensar es asumir que solo tienes acceso a un tipo de madera.

Cada uno de estos 21 artículos tiene una receta de elaboración diferente . Representaremos cada una de estas recetas como una cuadrícula de 2 × 2 o 3 × 3 de los personajes .WPS. El .es una ranura de hacer a mano vacía, Wes para la madera , Pes para los tablones de madera , y Ses para palos . No se necesitan otros personajes para estos elementos en particular.

Por ejemplo, esta es la receta para un cofre :

PPP
P.P
PPP

Reto

Escriba un programa que tome el nombre de uno de nuestros 21 artículos, exactamente como aparece arriba, e imprima una receta de elaboración válida para ese artículo.

Las recetas de elaboración son invariables en la traducción, por lo que si la entrada es fenceválida, ambas son válidas:

PSP
PSP
...
...
PSP
PSP

Si una receta cabe en una cuadrícula de 2 × 2, puede generarla en una cuadrícula de 2 × 2 o 3 × 3. por ejemplo stick:

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

Las recetas también se pueden reflejar horizontalmente (alrededor de una línea vertical de simetría), aunque esto solo hace una diferencia para el hacha, la azada y las escaleras. por ejemplo hoe:

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

Por lo tanto, la salida de cualquier receta que se ajuste a la cuadrícula y tenga la forma correcta (ignorando la traducción y la duplicación) es lo que su programa debe hacer. Estas son todas las recetas que el juego oficial reconocerá. (Tenga en cuenta que las recetas no se pueden girar ni reflejar verticalmente).

Detalles

  • Tome la entrada de stdin o la línea de comando. Puede suponer que la entrada siempre es válida. Requerir comillas alrededor de la entrada (por ejemplo "chest") está bien.
  • Salida a stdout (o alternativa más cercana) con una nueva línea final opcional.
  • La presentación más corta en bytes gana.

Ejemplo

Aquí hay una lista de todas las entradas y salidas de muestra:

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
...
Pasatiempos de Calvin
fuente
1
Dadas sus muestras de salida, no veo ninguna excepción. Todos se pueden reflejar, pero la mayoría son simétricos.
edc65
Dado que "en bytes" enlaza con el contador UTF-8, ¿eso significa que tenemos que contar bytes en UTF-8?
Martin Ender
¿Programas completos solamente? ¿Sin funciones?
Alex A.
@Alex A. Correcto.
Calvin's Hobbies
@ MartinBüttner Haz que no. (Sabes por qué, aunque probablemente ya no importe.: P)
Calvin's Hobbies

Respuestas:

15

CJam, 100 96 94 91 bytes

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

StackExchange destruye los elementos no imprimibles, por lo que en lugar de copiar y pegar aquí, está el enlace permanente . Además, aquí está el programa de prueba .

(Gracias a @Optimizer por informarme fy a @ MartinBüttner por informarme sobre la indexación de módulos de 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

Explicación

Para construir las recetas, utilizamos 13 filas diferentes (también se enumeran las explicaciones de por qué esto es 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 las filas a través de Z"O>HVa=4a"98bZb+"P.SW"f=3/, lo que da

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

El primer bit "+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/codifica las recetas, 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]]

Tenga en cuenta cómo es la primera entrada [3 3 8], que es la receta sign.

l72b970%=lee en la entrada, luego aplica un poco de magia para determinar qué receta tomar de la lista. Aunque solo tenemos 21 recetas, hay 24 en la lista; los pocos puntos adicionales corresponden al [1 0 0]s.

Después de leer la entrada, elegir la receta y convertir la receta en filas, agregamos algunas líneas nuevas N*y la impresión automática.


CJam, 89 86 83 bytes

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

... resulta que codificar todas las salidas funciona un poco mejor en CJam. Estoy bastante decepcionado

Una vez más tenemos algunos no imprimibles, así que aquí está el programa de enlace permanente y prueba .

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

Explicación

Las salidas se codifican usando la base 3, con el solitario Wpegado al frente antes de que la cadena se divida en 3 para dar filas, y las filas se dividen en grupos de 3 para dar recetas.

Al igual que arriba, la conversión de bases y el módulo de magia se utilizan para seleccionar la receta. Hay 22 recetas (una sin usar) pero necesitamos tomar el módulo 24, por lo que en realidad necesitamos especificar explícitamente 24%este tiempo en lugar de depender de la indexación del módulo.

Sp3000
fuente
¿Puedes publicar un hexdump con xxd? Los enlaces permanentes no funcionan en Firefox.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 23/03/2015
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Lamentablemente, estoy en Windows, así que he puesto lo mejor que pude por ahora.
Sp3000
6

JavaScript (ES6), 235241262

Editar Abusar aún más de la regla de que la entrada siempre es válida: solo hay 1 elemento que requiere W, y eso puede ser un caso especial. Por lo tanto, la cuadrícula de salida se codifica como números de base 3 de 9 dígitos.

235 bytes con E / S a través de una ventana emergente.

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 una función comprobable.

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

Salida siempre como cuadrícula 3x3. Con 4 símbolos de salida disponibles, la cuadrícula se codifica como un número de bit 3x3x2 (18). Y como la entrada tiene que ser siempre válida, la cadena se almacena truncada al mínimo.

Prueba en la consola 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)))

Salida

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

Explicación

# 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

Comentario

Este código seguramente no es el más pequeño, pero funciona bien. Estoy satisfecho. :)

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 la misma técnica para generar un identificador único pero buscando directamente la receta en una matriz. Es mucho más simple y un poco más compacto que mi primer código.

NeatMonster
fuente
Teniendo un caso especial para 'tablones' puede acortar la cadena aW.\n..
edc65