Как мне это сделать?

21

В Minecraft есть 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") хорошо.
  • Вывести на стандартный вывод (или ближайшую альтернативу) с необязательным завершающим переводом строки.
  • Самая короткая подача в байтах побеждает.

пример

Вот список всех входов и примеров выходов:

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?
Мартин Эндер
Только полные программы? Нет функций?
Алекс А.
@ Алекс А. Верно.
Увлечения Кэлвина
@ MartinBüttner Сделать это нет. (Вы знаете почему, хотя это, вероятно, уже не имеет значения.: P)
Увлечения Кэлвина

Ответы:

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's 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 с, чтобы получить строки, а строки разбиваются на группы по 3 с, чтобы получить рецепты.

Как и выше, для выбора рецепта используется базовое преобразование и волшебство по модулю. Существует 22 рецепта (один неиспользованный), но нам нужно взять по модулю 24, поэтому нам нужно явно указать 24%это время, а не полагаться на индексирование по модулю.

Sp3000
источник
Можете ли вы опубликовать 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 байт с вводом / выводом через всплывающее окно.

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

Вывод всегда в виде сетки 3х3. С 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
...
edc65
источник
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)])

Используя ту же технику для генерации уникального идентификатора, но напрямую ищем рецепт в массиве. Это намного проще и немного компактнее, чем мой первый код.

NeatMonster
источник
Имея специальный кейс для «досок», вы можете сократить строку доW.\n..
edc65