Come lo faccio?


21

Ci sono 21 oggetti in Minecraft che puoi creare usando solo legno e oggetti realizzati in legno:

ax
barca
ciotola
pulsante
petto
tabella di crafting
porta
recinzione
cancello
zappa
scala
piccone
tavole
piastra di pressione
pala
segno
lastra
scale
bastone
spada
botola

Questo elenco presuppone che i 6 diversi tipi di assi di legno / lastre / porte / ecc. contano tutti come lo stesso oggetto. Un altro modo di pensarci è quello di supporre di avere accesso a un solo tipo di legno.

Ognuno di questi 21 articoli ha una ricetta artigianale diversa . Rappresenteremo ciascuna di queste ricette come una griglia 2 × 2 o 3 × 3 dei personaggi .WPS. Il .è uno slot vuoto lavorazione, Wè per il legno , Pè per tavole di legno , e Sè per bastoncini . Non sono necessari altri personaggi per questi oggetti particolari.

Ad esempio, questa è la ricetta per un forziere :

PPP
P.P
PPP

Sfida

Scrivi un programma che prende il nome di uno dei nostri 21 oggetti, esattamente come appare sopra, e stampa una ricetta di fabbricazione valida per quell'oggetto.

Le ricette di creazione sono invarianti per la traduzione, quindi se l'input è fencevalido, entrambe sono valide:

PSP
PSP
...
...
PSP
PSP

Se una ricetta si adatta a una griglia 2 × 2, è possibile emetterla in una griglia 2 × 2 o 3 × 3. es stick:

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

Le ricette possono anche essere specchiate orizzontalmente (attorno a una linea verticale di simmetria), anche se questo fa solo la differenza per l'ascia, la zappa e le scale. es hoe:

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

Quindi produrre qualsiasi ricetta che si adatti alla griglia e abbia la forma corretta (ignorando la traduzione e il mirroring) è ciò che il programma deve fare. Queste sono tutte le ricette che il gioco ufficiale riconoscerà. (Nota che le ricette non possono essere ruotate o specchiate verticalmente.)

Dettagli

  • Prendi input da stdin o dalla riga di comando. Puoi presumere che l'input sia sempre valido. Richiedere virgolette sull'input (es. "chest") Va bene.
  • Uscita su stdout (o alternativa più vicina) con una nuova riga finale facoltativa.
  • Vince l' invio più breve in byte .

Esempio

Ecco un elenco di tutti gli input e output di esempio:

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

1
Dati i tuoi esempi di output, non vedo alcuna eccezione. Tutti possono essere specchiati, ma la maggior parte sono simmetrici.
edc65,

Dal momento che "in byte" collegamenti al contatore UTF-8, vuol dire che ci dobbiamo contare byte in UTF-8?
Martin Ender,

Solo programmi completi? Nessuna funzione?
Alex A.

@Alex A. Giusto.
Hobby di Calvin,

@ MartinBüttner Fai che no. (Sai perché, anche se probabilmente non ha più importanza.: P)
Calvin's Hobbies

Risposte:


15

CJam, 100 96 94 91 byte

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

StackExchange mangle non stampabili, quindi piuttosto che copiare e incollare qui è il permalink . Inoltre, ecco il programma di test .

(Grazie a @Optimizer per avermi raccontato fe @ MartinBüttner per avermi parlato dell'indicizzazione del modulo di 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

Spiegazione

Per costruire le ricette, usiamo 13 righe diverse (anche elencate sono spiegazioni sul perché questo è minimo):

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)

Codifichiamo le righe tramite Z"O>HVa=4a"98bZb+"P.SW"f=3/, il che dà

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

Il primo bit "+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/codifica le ricette, 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]]

Nota come è la prima voce [3 3 8], qual è la ricetta per sign.

l72b970%=legge nell'input, quindi applica un po 'di magia per capire quale ricetta prendere dall'elenco. Anche se abbiamo solo 21 ricette ce ne sono 24 nell'elenco - i pochi punti in più corrispondono alle [1 0 0]s.

Dopo aver letto l'input, selezionato la ricetta e convertita la ricetta in righe, inseriamo alcune nuove righe N*e la stampa automatica.


CJam, 89 86 83 byte

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

... si scopre che hardcoding di tutte le uscite fa un po 'meglio in CJam. Sono piuttosto deluso.

Ancora una volta abbiamo alcuni non stampabili, quindi ecco il programma permalink e 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

Spiegazione

Le uscite sono codificate usando la base 3, con il solitario che Wviene incollato sul davanti prima che la stringa sia divisa in 3 secondi per dare righe, e le righe sono divise in gruppi di 3 secondi per dare ricette.

Come sopra, la conversione di base e il modulo magico vengono utilizzati per selezionare la ricetta. Esistono 22 ricette (una inutilizzata) ma dobbiamo prendere il modulo 24, quindi in realtà dobbiamo specificare esplicitamente 24%questa volta piuttosto che fare affidamento sull'indicizzazione del modulo.


Puoi pubblicare un hexdump con xxd? I permalink non funzionano su Firefox.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Sfortunatamente sono su Windows, quindi ho messo la cosa migliore che potrei fare per ora.
Sp3000,

6

JavaScript (ES6), 235241 262

Modifica Abusando ancora di più della regola secondo cui l'input è sempre valido: esiste solo 1 elemento che richiede W e che può essere inserito in un caso speciale. Quindi la griglia di output è codificata come numeri base 3 a 9 cifre.

235 byte con I / O tramite 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 byte come funzione testabile.

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

Uscita sempre come griglia 3x3. Con 4 simboli di uscita disponibili, la griglia è codificata come un numero di bit 3x3x2 (18). E poiché l'input deve essere sempre valido, la stringa viene archiviata troncata al minimo indispensabile.

Test nella console di 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)))

Produzione

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

2

Python, 305 byte

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

Spiegazione

# 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

Commento

Questo codice sicuramente non è il più piccolo ma funziona bene. Sono soddisfatto. :)

Python, 282 byte

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

Utilizzando la stessa tecnica per generare un identificatore univoco, ma cercando direttamente la ricetta in un array. È molto più semplice e un po 'più compatto del mio primo codice.


Avendo un caso speciale per le "assi" puoi accorciare la corda aW.\n..
edc65
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.