ฉันจะสร้างสิ่งนั้นได้อย่างไร


21

Minecraftมี 21 รายการที่คุณสามารถสร้างได้ด้วยไม้และของที่ทำจากไม้:

ขวาน
เรือ
ชาม
ปุ่ม
หน้าอก
ตารางงานหัตถกรรม
ประตู
รั้ว
ประตู
จอบ
บันได
pickaxe
ไม้กระดาน
แผ่นดัน
จอบ
สัญญาณ
พื้น
บันได
ติด
ดาบ
ประตูกล

รายการนี้สันนิษฐานว่าเป็น 6 ประเภทที่แตกต่างกันของไม้แผ่น / แผ่น / ประตู / ฯลฯ ทั้งหมดนับเป็นรายการเดียวกัน วิธีคิดอีกอย่างคือการสมมติว่าคุณสามารถเข้าถึงไม้ประเภทเดียวเท่านั้น

แต่ละเหล่านี้ 21 รายการที่มีความแตกต่างกันสูตรหัตถกรรม เราจะเป็นตัวแทนของแต่ละสูตรเหล่านี้เป็น 2 × 2 หรือ 3 × 3 .WPSตารางของตัวละคร .เป็นสล็อตหัตถกรรมว่างWสำหรับไม้ , Pสำหรับแผ่นไม้และSเป็นแท่ง ไม่จำเป็นต้องใช้อักขระอื่นสำหรับรายการพิเศษเหล่านี้

ตัวอย่างเช่นนี่คือสูตรสำหรับหน้าอก :

PPP
P.P
PPP

ท้าทาย

เขียนโปรแกรมที่ใช้ชื่อหนึ่งใน 21 รายการของเราตรงตามที่ปรากฏด้านบนและพิมพ์สูตรการประดิษฐ์ที่ถูกต้องสำหรับรายการนั้น

สูตรการประดิษฐ์เป็นค่าคงที่การแปลดังนั้นหากมีการป้อนข้อมูลสูตรfenceทั้งสองจะใช้ได้:

PSP
PSP
...
...
PSP
PSP

หากสูตรพอดีในตาราง 2 × 2 คุณสามารถส่งออกในตาราง 2 × 2 หรือ 3 × 3 เช่นstick:

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

ตำรับอาหารสามารถสะท้อนในแนวนอน (รอบแนวตั้งสมมาตร) แต่สิ่งนี้สร้างความแตกต่างให้กับขวานจอบและบันได เช่นhoe:

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

ดังนั้นการแสดงสูตรที่เหมาะสมในกริดและมีรูปร่างที่ถูกต้อง (ไม่สนใจการแปลและการมิเรอร์) จึงเป็นสิ่งที่โปรแกรมของคุณต้องทำ เหล่านี้เป็นสูตรทั้งหมดที่เกมอย่างเป็นทางการจะรับรู้ (โปรดทราบว่าสูตรอาหารไม่สามารถหมุนหรือสะท้อนในแนวตั้งได้)

รายละเอียด

  • รับอินพุตจาก stdin หรือบรรทัดรับคำสั่ง คุณสามารถสันนิษฐานได้ว่าอินพุตนั้นถูกต้องเสมอ ต้องการอัญประกาศรอบอินพุต (เช่น"chest") ถือว่าใช้ได้
  • ส่งออกไปยัง stdout (หรือทางเลือกที่ใกล้เคียงที่สุด) ด้วยการขึ้นบรรทัดใหม่ที่เป็นตัวเลือก
  • การส่งที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่าง

นี่คือรายการอินพุตและเอาต์พุตตัวอย่างทั้งหมด:

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
จากตัวอย่างผลลัพธ์ของคุณฉันไม่เห็นข้อยกเว้นใด ๆ ทุกคนสามารถสะท้อนได้ แต่ส่วนใหญ่สมมาตร
edc65

ตั้งแต่ลิงก์ "เป็นไบต์" ไปยังตัวนับ UTF-8 นั่นหมายความว่าเราต้องนับจำนวนไบต์เป็น UTF-8 หรือไม่
Martin Ender

โปรแกรมเต็มรูปแบบเท่านั้น? ไม่มีฟังก์ชั่น?
Alex A.

@Alex A. ถูกต้อง
งานอดิเรกของ Calvin

@ MartinBüttnerทำให้ไม่ (คุณรู้ว่าทำไมแม้ว่ามันอาจไม่สำคัญอีกต่อไป: P)
งานอดิเรกของ Calvin

คำตอบ:


15

CJam, 100 96 94 91 ไบต์

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

StackExchange ทำให้ไม่สามารถพิมพ์ได้ดังนั้นการคัดลอกและวางที่นี่เป็นลิงก์ถาวรที่นี่เป็นคความคิดเห็นนอกจากนี้ที่นี่เป็นโปรแกรมการทดสอบ

(ขอบคุณ @Optimizer ที่บอกฉันเกี่ยวกับ fและ @ MartinBüttnerที่บอกฉันเกี่ยวกับการสร้างดัชนีโมดูโลของ 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

คำอธิบาย

ในการสร้างสูตรอาหารเราใช้ 13 แถวที่แตกต่างกัน

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)

เราเข้ารหัสแถวผ่านZ"O>HVa=4a"98bZb+"P.SW"f=3/, ซึ่งจะช่วยให้

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

บิตแรก"+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/เข้ารหัสสูตรให้

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

หมายเหตุว่ารายการแรกซึ่งเป็นสูตรสำหรับ[3 3 8]sign

l72b970%=อ่านในอินพุตจากนั้นใช้เวทย์มนตร์เพื่อกำหนดว่าจะเอาสูตรไหนจากรายการ แม้ว่าเราจะมี 21 สูตรเท่านั้นมี 24 รายการใน - จุดพิเศษไม่กี่ตรงกับ[1 0 0] s

หลังจากอ่านอินพุตแล้วให้เลือกสูตรและแปลงสูตรเป็นแถวเราใส่บรรทัดใหม่N*และพิมพ์อัตโนมัติ


CJam, 89 86 83 ไบต์

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

... ปรากฎว่าการเข้ารหัสแบบเอาท์พุตทั้งหมดทำได้ดีกว่าใน CJam ฉันค่อนข้างผิดหวัง

เรามีสิ่งที่ไม่สามารถพิมพ์ได้อีกดังนั้นนี่คือ ความคิดเห็นและการทดสอบโปรแกรม

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

คำอธิบาย

ผลลัพธ์จะถูกเข้ารหัสโดยใช้ฐาน 3 โดยมีWการยึดติดอยู่กับด้านหน้าก่อนที่สตริงจะถูกแบ่งออกเป็น 3 วินาทีเพื่อให้แถวและแถวจะแบ่งออกเป็นกลุ่ม 3s เพื่อให้สูตร

เช่นเดียวกับการแปลงเบสและโมดูโลเวทย์เพื่อใช้เลือกสูตร มี 22 สูตร (หนึ่งที่ไม่ได้ใช้) แต่เราต้องใช้โมดูโล 24 ดังนั้นเราต้องระบุ24%เวลานี้อย่างชัดเจนมากกว่าการพึ่งพาการทำดัชนีโมดูโล่


คุณสามารถโพสต์ hexdump ด้วยxxd? ลิงก์ถาวรไม่ทำงานบน Firefox
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ น่าเสียดายที่ฉันใช้ Windows ดังนั้นฉันจึงได้เตรียมสิ่งที่ดีที่สุดที่ฉันสามารถทำได้ในตอนนี้
Sp3000

6

JavaScript (ES6), 235 241 262

แก้ไขการใช้กฎที่ละเมิดมากยิ่งขึ้นซึ่งอินพุตนั้นถูกต้องเสมอ: มีเพียง 1 ไอเท็มที่ต้องใช้ W และนั่นอาจเป็นกรณีพิเศษ ดังนั้นกริดเอาท์พุทจึงถูกเข้ารหัสเป็นเลขฐาน 9 หลัก 3

235 ไบต์พร้อม I / O ผ่านป๊อปอัป

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 ไบต์เป็นฟังก์ชันที่ทดสอบได้

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

เอาต์พุตเสมอเป็น 3x3 กริด ด้วย symobols เอาต์พุต 4 ตัวที่มีอยู่กริดจะถูกเข้ารหัสเป็นจำนวนบิต 3x3x2 (18) และเนื่องจากอินพุตต้องถูกต้องเสมอสตริงจะถูกตัดปลายให้น้อยที่สุด

ทดสอบในคอนโซล 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)))

เอาท์พุต

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 ไบต์

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

คำอธิบาย

# 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

คิดเห็น

รหัสนี้ไม่ใช่รหัสที่เล็กที่สุด แต่ใช้ได้ดี ผมพอใจ. :)

Python ขนาด 282 ไบต์

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

ใช้เทคนิคเดียวกันเพื่อสร้างตัวระบุที่ไม่ซ้ำกัน แต่ค้นหาสูตรในอาร์เรย์โดยตรง มันง่ายและกะทัดรัดกว่าโค้ดแรกของฉันเล็กน้อย


มีกรณีพิเศษสำหรับ 'planks' คุณสามารถทำให้สตริงสั้นลงW.\n..
edc65
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.