Як мені це зробити?


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.

Тож ваша програма повинна зробити будь-який рецепт, який вписується у сітку та має правильну форму (ігноруючи переклад та дзеркальне відображення). Це все рецепти, які визнає офіційна гра. (Зверніть увагу, що рецепти не можна обертати або дзеркально вертикально.)

Деталі

  • Візьміть дані зі 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?
Мартін Ендер

Лише повні програми? Без функцій?
Алекс А.

@Alex A. Правильно.
Захоплення Кальвіна

@ 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.)

Цигвін 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. Я досить розчарований.

Знову ми маємо декілька недрукованих матеріалів, тому ось програма постійної посилання та тестування .

Цигвін 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%цей час, а не покладатися на модульну індексацію.


Чи можете ви опублікувати шестнадцятковий з 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 сітка. За допомогою 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

Пітон, 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

Прокоментуйте

Цей код, безумовно, не найменший, але він працює чудово. Я задоволений. :)

Пітон, 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.