Làm thế nào để tôi làm điều đó?


21

Có 21 vật phẩm trong Minecraft mà bạn có thể chế tạo chỉ bằng gỗ và các vật phẩm được chế tác từ gỗ:

rìu
thuyền
bát
nút
ngực
crafting bảng
cửa
hàng rào
cổng
cuốc
thang
cuốc
ván
tấm áp
xẻng
dấu
phiến
cầu thang
dính
gươm
cửa sập

Danh sách này giả định rằng 6 loại khác nhau của ván / tấm gỗ / cửa / vv. Tất cả được tính là cùng một mục. Một cách khác để nghĩ về nó là giả sử bạn chỉ có quyền truy cập vào một loại gỗ.

Mỗi trong số 21 mặt hàng này có một công thức chế tạo khác nhau . Chúng tôi sẽ đại diện cho mỗi công thức này dưới dạng lưới 2 × 2 hoặc 3 × 3 của các ký tự .WPS. Đây .là một khe chế tạo trống, Wdành cho gỗ , Pdành cho ván gỗSdành cho gậy . Không có nhân vật khác là cần thiết cho các mặt hàng cụ thể.

Ví dụ, đây là công thức cho một cái rương :

PPP
P.P
PPP

Thử thách

Viết chương trình lấy tên của một trong 21 mặt hàng của chúng tôi, chính xác như nó xuất hiện ở trên và in một công thức chế tạo hợp lệ cho mặt hàng đó.

Công thức chế tạo là bất biến dịch, vì vậy nếu đầu vào là fence, cả hai đều hợp lệ:

PSP
PSP
...
...
PSP
PSP

Nếu một công thức phù hợp với lưới 2 × 2, bạn có thể xuất nó trong lưới 2 × 2 hoặc 3 × 3. ví dụ stick:

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

Bí quyết cũng có thể được nhân đôi theo chiều ngang (xung quanh một đường đối xứng dọc), mặc dù điều này chỉ tạo ra sự khác biệt cho rìu, cuốc và cầu thang. ví dụ hoe:

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

Vì vậy, xuất ra bất kỳ công thức phù hợp với lưới và có hình dạng chính xác (bỏ qua dịch và phản chiếu) là những gì chương trình của bạn cần phải làm. Đây là tất cả các công thức nấu ăn mà trò chơi chính thức sẽ nhận ra. (Lưu ý rằng công thức nấu ăn không thể được xoay hoặc nhân đôi theo chiều dọc.)

Chi tiết

  • Lấy đầu vào từ stdin hoặc dòng lệnh. Bạn có thể giả sử đầu vào luôn hợp lệ. Yêu cầu báo giá xung quanh đầu vào (ví dụ "chest") là tốt.
  • Xuất ra thiết bị xuất chuẩn (hoặc thay thế gần nhất) với một dòng mới tùy chọn.
  • Đệ trình ngắn nhất tính bằng byte thắng.

Thí dụ

Dưới đây là danh sách tất cả các đầu vào và đầu ra mẫu:

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
Cho mẫu đầu ra của bạn, tôi không thấy bất kỳ ngoại lệ. Tất cả có thể được nhân đôi, nhưng hầu hết là đối xứng.
edc65

Vì "theo byte" liên kết đến bộ đếm UTF-8, điều đó có nghĩa là chúng ta phải đếm byte trong UTF-8?
Martin Ender

Chỉ toàn chương trình? Không có chức năng?
Alex A.

@Alex A. Phải.
Sở thích của Calvin

@ MartinBüttner Làm cho không. (Bạn biết tại sao, mặc dù điều đó có thể không còn quan trọng nữa. P)
Sở thích của Calvin

Câu trả lời:


15

CJam, 100 96 94 91 byte

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

StackExchange không thể in dấu, vì vậy thay vì sao chép và dán ở đây là permalink . Ngoài ra, đây là chương trình thử nghiệm .

(Cảm ơn @Optimizer đã cho tôi biết fvà @ MartinBüttner đã cho tôi biết về lập chỉ mục modulo của CJam.)

Của 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

Giải trình

Để xây dựng các công thức nấu ăn, chúng tôi sử dụng 13 hàng khác nhau (cũng được liệt kê là giải thích tại sao điều này là tối thiểu):

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)

Chúng tôi mã hóa các hàng thông qua Z"O>HVa=4a"98bZb+"P.SW"f=3/, cung cấp cho

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

Bit đầu tiên "+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/mã hóa các công thức nấu ăn, cho

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

Lưu ý cách nhập đầu tiên [3 3 8], đó là công thức cho sign.

l72b970%=đọc trong đầu vào, sau đó áp dụng một số phép thuật để tìm ra công thức nào sẽ lấy từ danh sách. Mặc dù chúng tôi chỉ có 21 công thức nấu ăn, có 24 công thức trong danh sách - một vài điểm bổ sung tương ứng với [1 0 0]s.

Sau khi đọc đầu vào, chọn công thức và chuyển đổi công thức thành các hàng, chúng tôi đưa vào một số dòng mới N*và tự động in.


CJam, 89 86 83 byte

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

... hóa ra việc mã hóa tất cả các kết quả đầu ra làm tốt hơn một chút trong CJam. Tôi khá thất vọng.

Một lần nữa, chúng tôi có một số không thể in được, vì vậy đây là chương trình thử nghiệmpermalink .

Của 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

Giải trình

Các đầu ra được mã hóa bằng cơ sở 3, với đơn độc Wđược xử lý ở phía trước trước khi chuỗi được chia thành 3 giây để đưa ra các hàng và các hàng được chia thành các nhóm 3 để đưa ra công thức nấu ăn.

Giống như ở trên, phép biến đổi cơ sở và phép thuật modulo được sử dụng để chọn công thức. Có 22 công thức nấu ăn (không sử dụng) nhưng chúng ta cần dùng modulo 24, vì vậy chúng ta thực sự cần xác định rõ ràng 24%thời gian này thay vì dựa vào lập chỉ mục modulo.


Bạn có thể đăng một hexdump với xxd? Các permalinks không hoạt động trên Firefox.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Thật không may, tôi đang dùng Windows, vì vậy tôi đã đưa ra thứ tốt nhất tiếp theo mà tôi có thể quản lý bây giờ.
Sp3000

6

JavaScript (ES6), 235 241 262

Chỉnh sửa Lạm dụng thậm chí nhiều hơn quy tắc rằng đầu vào luôn hợp lệ: chỉ có 1 mục yêu cầu W và có thể được áp dụng đặc biệt. Vì vậy, lưới đầu ra được mã hóa dưới dạng 9 chữ số cơ sở 3 số.

235 byte với I / O thông qua cửa sổ bật lên.

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 là một hàm kiểm tra được.

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

Đầu ra luôn như lưới 3x3. Với 4 symobols đầu ra có sẵn, lưới được mã hóa dưới dạng số bit 3x3x2 (18). Và vì đầu vào phải luôn hợp lệ, chuỗi được lưu trữ bị cắt ngắn đến mức tối thiểu.

Kiểm tra trong bảng điều khiển 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)))

Đầu ra

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

Giải trình

# 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

Bình luận

Mã này chắc chắn không phải là nhỏ nhất nhưng nó hoạt động tốt. Tôi thấy thỏa mãn. :)

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

Sử dụng cùng một kỹ thuật để tạo ra một định danh duy nhất nhưng trực tiếp tìm kiếm công thức trong một mảng. Nó đơn giản hơn rất nhiều và nhỏ gọn hơn mã đầu tiên của tôi.


Có trường hợp đặc biệt cho 'ván', bạn có thể rút ngắn chuỗi thànhW.\n..
edc65
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.