Bagaimana saya membuatnya?

21

Ada 21 item di Minecraft yang bisa Anda kerajinan hanya menggunakan kayu dan barang-barang yang dibuat dari kayu:

kapak
perahu
mangkuk
tombol
dada
kerajinan meja
pintu
pagar
gerbang
cangkul
tangga
beliung
papan
pressure plate
sekop
tanda
slab
tangga
menempel
pedang
pintu jebakan

Daftar ini mengasumsikan bahwa 6 jenis papan kayu / lempengan / pintu / dll. semua dihitung sebagai item yang sama. Cara lain untuk memikirkannya adalah dengan menganggap Anda hanya memiliki akses ke satu jenis kayu.

Masing-masing dari 21 item ini memiliki resep kerajinan yang berbeda . Kami akan mewakili masing-masing resep ini sebagai kotak karakter 2 × 2 atau 3 × 3 .WPS. Ini .adalah slot kerajinan yang kosong, Wuntuk kayu , Puntuk papan kayu , dan Suntuk tongkat . Tidak diperlukan karakter lain untuk item-item khusus ini.

Sebagai contoh, ini adalah resep untuk peti :

PPP
P.P
PPP

Tantangan

Tulis program yang menggunakan salah satu dari 21 item kami, persis seperti yang muncul di atas, dan cetak resep kerajinan yang valid untuk item itu.

Resep kerajinan adalah terjemahan yang tidak berubah-ubah, jadi jika inputnya fence, keduanya valid:

PSP
PSP
...
...
PSP
PSP

Jika sebuah resep cocok dengan kisi 2 × 2, Anda dapat mengeluarkannya dalam kisi 2 × 2 atau 3 × 3. misalnya stick:

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

Resep juga dapat dicerminkan secara horizontal (di sekitar garis simetri vertikal), meskipun ini hanya membuat perbedaan untuk kapak, cangkul, dan tangga. misalnya hoe:

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

Jadi, mengeluarkan resep apa saja yang sesuai dengan kisi dan memiliki bentuk yang benar (mengabaikan terjemahan dan mirroring) adalah apa yang perlu dilakukan oleh program Anda. Ini semua adalah resep yang akan dikenali oleh game resmi. (Perhatikan bahwa resep tidak dapat diputar atau dicerminkan secara vertikal.)

Detail

  • Ambil input dari stdin atau baris perintah. Anda dapat menganggap input selalu valid. Membutuhkan kutipan di sekitar input (mis. "chest") Baik-baik saja.
  • Output ke stdout (atau alternatif terdekat) dengan baris tambahan opsional.
  • Pengajuan terpendek dalam byte menang.

Contoh

Berikut daftar semua input dan output sampel:

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
...
Hobi Calvin
sumber
1
Diberikan sampel output Anda, saya tidak melihat pengecualian. Semua bisa dicerminkan, tetapi kebanyakan simetris.
edc65
Karena "dalam byte" terhubung ke penghitung UTF-8, apakah itu berarti kita harus menghitung byte dalam UTF-8?
Martin Ender
Program lengkap saja? Tidak ada fungsi?
Alex A.
@ Alex A. Benar.
Calvin Hobi
@ MartinBüttner Buat yang tidak. (Anda tahu mengapa, meskipun itu mungkin tidak masalah lagi.: P)
Calvin's Hobbies

Jawaban:

15

CJam, 100 96 94 91 byte

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

StackExchange mangles tidak dapat diperbaiki, jadi daripada menyalin dan menempel di sini adalah permalink . Selain itu, inilah program pengujiannya .

(Terima kasih kepada @Optimizer untuk memberi tahu saya tentang fdan @ MartinBüttner karena memberi tahu saya tentang pengindeksan modulo 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

Penjelasan

Untuk membuat resep, kami menggunakan 13 baris berbeda (juga tercantum penjelasan mengapa ini 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)

Kami menyandikan baris via Z"O>HVa=4a"98bZb+"P.SW"f=3/, yang memberi

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

Bit pertama "+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/mengkodekan resep, memberi

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

Perhatikan bagaimana entri pertama [3 3 8], yang merupakan resep untuk sign.

l72b970%=membaca di input, lalu menerapkan beberapa sihir untuk mengetahui resep yang akan diambil dari daftar. Meskipun kami hanya memiliki 21 resep, ada 24 dalam daftar - beberapa tempat tambahan sesuai dengan [1 0 0]s.

Setelah membaca input, memilih resep dan mengubah resep menjadi baris, kami memasukkan beberapa baris baru N*dan cetak otomatis.


CJam, 89 86 83 byte

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

... ternyata hardcoding semua output sedikit lebih baik di CJam. Saya cukup kecewa.

Sekali lagi kami memiliki beberapa unsintables jadi inilah permalink dan program pengujian .

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

Penjelasan

Keluaran dikodekan menggunakan basis 3, dengan satu-satunya Wditempelkan ke depan sebelum string dipecah menjadi 3s untuk memberikan baris, dan baris dibagi menjadi kelompok-kelompok 3s untuk memberikan resep.

Seperti di atas, sihir konversi dasar dan modulo digunakan untuk memilih resep. Ada 22 resep (satu tidak terpakai) tetapi kita perlu mengambil modulo 24, jadi kita sebenarnya perlu menentukan 24%waktu ini secara eksplisit daripada mengandalkan pengindeksan modulo.

Sp3000
sumber
Bisakah Anda memposting hexdump xxd? Permalinks tidak berfungsi di Firefox.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Sayangnya saya menggunakan Windows, jadi saya telah memasang hal terbaik berikutnya yang dapat saya kelola untuk saat ini.
Sp3000
6

JavaScript (ES6), 235 241 262

Edit Menyalahgunakan bahkan lebih dari aturan bahwa input selalu valid: hanya ada 1 item yang membutuhkan W, dan itu bisa menjadi casing khusus. Jadi grid output dikodekan sebagai 9 digit basis 3 angka.

235 byte dengan I / O 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 byte sebagai fungsi yang dapat diuji.

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

Output selalu berupa grid 3x3. Dengan 4 symobols keluaran yang tersedia, kisi tersebut dikodekan sebagai angka bit 3x3x2 (18). Dan sebagai input harus selalu valid, string disimpan terpotong ke minimum.

Uji di Firefox / konsol 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)))

Keluaran

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

Penjelasan

# 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

Komentar

Kode ini jelas bukan yang terkecil tetapi berfungsi dengan baik. Saya puas. :)

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

Menggunakan teknik yang sama untuk menghasilkan pengidentifikasi unik tetapi langsung mencari resep dalam array. Ini jauh lebih sederhana dan sedikit lebih kompak daripada kode pertama saya.

NeatMonster
sumber
Memiliki case khusus untuk 'papan' Anda dapat mempersingkat string keW.\n..
edc65