どうやって作りますか?


21

21個の項目がありMinecraftのあなたができることを作るだけ使用して木材木材から作られたとの項目は:


ボート
ボウル
ボタン
チェスト
テーブルクラフト
ドア
フェンス
ゲート

ラダー
つるはしの
厚板の
圧力プレートの
シャベル
記号の
スラブ
階段が
付く

トラップドアを

このリストでは、6種類の木製の厚板/スラブ/ドア/などを想定しています。すべて同じアイテムとしてカウントされます。それを考える別の方法は、1種類の木材にしかアクセスできないと仮定することです。

これら21のアイテムのそれぞれには異なるクラフトレシピがあります。これらのレシピはそれぞれ、キャラクターの2×2または3×3グリッドとして表されます.WPS.空クラフトスロットであるWためである木材Pのためのものである木の板、及びSためのものであるスティック。これらの特定のアイテムに他の文字は必要ありません。

たとえば、これはチェストのレシピです:

PPP
P.P
PPP

チャレンジ

21個のアイテムのうちの1つを上記のとおりに入力し、そのアイテムの有効な作成レシピを印刷するプログラムを作成します。

クラフティングレシピは翻訳不変であるため、入力がの場合、fenceこれらは両方とも有効です。

PSP
PSP
...
...
PSP
PSP

レシピが2×2グリッドに収まる場合、2×2または3×3グリッドに出力できます。例stick

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

レシピは水平に(対称の垂直線の周りに)ミラーリングすることもできますが、これはx、、および階段のみに違いがあります。例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でバイトをカウントする必要があるということですか?
マーティンエンダー

完全なプログラムのみ?機能なし?
アレックスA.

@Alex A.そう。
カルバンの趣味

@MartinBüttnerそれをノーにします。(おそらく、それはおそらく重要ではありませんが、理由はわかります)
カルビンの趣味

回答:


15

CJam、100 96 94 91バイト

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

StackExchangeは印刷できないものをマングルするため、ここにコピーして貼り付けるのではなく、パーマリンクを使用します。さらに、テストプログラムもあります。

fCJamのモジュロインデックスについて教えてくれた@Optimizerと@MartinBüttnerに感謝します。)

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、文字列が3に分割されて行が作成される前に、1つが前面に追加され、行が3のグループに分割されてレシピが作成されます。

上記のように、基本変換とモジュロマジックを使用してレシピを選択します。22のレシピ(1つは未使用)がありますが、モジュロ24を取る必要があるため24%、モジュロインデックスに依存するのではなく、実際にこの時間を明示的に指定する必要があります。


hexdumpを投稿できますxxdか?Firefoxではパーマリンクは機能しません。
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳残念ながら、私はWindowsを使用しているので、今のところ管理できる次善の策を立てました。
Sp3000

6

JavaScript(ES6)、235 241 262

編集さらに多くの入力が常に有効であることをルールの悪用:そこWを必要とするだけで1項目である、そしてそれは同棲特別なことができます。したがって、出力グリッドは9桁の基数3の数値としてエンコードされます。

ポップアップ経由のI / Oで235バイト。

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つの使用可能な出力symobolsで、グリッドは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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.