我该如何制作?


21

有21个项目在我的世界,你可以手艺只使用木材和木材制作的物品:

斧头



胸部
各具特色表

栅栏

锄头


木板
压盘

标志

楼梯
坚持

暗门

此列表假定使用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.

因此,输出需要适合网格且形状正确的任何配方(忽略平移和镜像)是程序需要做的。这些都是官方游戏将认可的所有食谱。(请注意,配方不能旋转或垂直镜像。)

细节

  • 从标准输入或命令行输入。您可以假定输入始终有效。要求在输入周围加上引号(例如"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中的字节进行计数?
马丁·恩德

仅完整程序?没有功能吗?
Alex A.

@Alex A.对。
加尔文的爱好2015年

@MartinBüttner做到这一点。(您知道为什么,尽管可能不再重要。:P)
卡尔文的爱好

Answers:


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的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在将字符串分成3s给出行之前,将孤行固定在前面,然后将行分成3s组成组以给出配方。

像上面一样,使用基本转换和模魔术来选择配方。有22个配方(一个未使用),但我们需要取24模,因此我们实际上需要明确指定24%该时间,而不是依靠模索引。


您可以发布一个hexdump xxd吗?永久链接在Firefox上不起作用。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 2015年

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳不幸的是,我在Windows上,所以我提出了我现在可以管理的第二件事。
Sp3000

6

JavaScript(ES6),235 241 262

编辑滥用更多规则,即输入始终有效:只有一项需要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网格。具有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)])

使用相同的技术生成唯一的标识符,但直接在数组中查找配方。它比我的第一个代码简单得多,而且紧凑得多。


对于“木板”有特殊情况,您可以将字符串缩短为W.\n..
edc65
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.