Jak to zrobić?

21

Istnieje 21 przedmiotów w Minecraft , że można craft używając tylko drewno i elementy spreparowany z drewna:

ax
łódź
miska
przycisk
skrzynia
Crafting table
drzwi
płot
brama
motyka
drabina
kilof
deski
płyta dociskowa
łopata
znak
płaskie
schody
trzymać
miecz
klapę

Ta lista zakłada, że 6 różnych rodzajów desek / płyt / drzwi / itp. wszystkie są liczone jako ten sam element. Innym sposobem na to jest założenie, że masz dostęp tylko do jednego rodzaju drewna.

Każdy z tych 21 przedmiotów ma inny przepis rzemieślniczy . Będziemy reprezentować każdy z tych przepisów jako siatkę postaci 2 × 2 lub 3 × 3 .WPS. To .puste miejsce rzemieślnicze, Wprzeznaczone do drewna , Pdo desek drewnianych i Sdo patyków . Dla tych konkretnych przedmiotów nie są potrzebne żadne inne postacie.

Na przykład jest to przepis na skrzynię :

PPP
P.P
PPP

Wyzwanie

Napisz program, który przyjmuje nazwę jednego z naszych 21 przedmiotów, dokładnie tak, jak pokazano powyżej, i drukuje prawidłowy przepis rzemieślniczy na ten przedmiot.

Receptury rzemieślnicze są niezmienne w tłumaczeniu, więc jeśli dane wejściowe są fence, oba są poprawne:

PSP
PSP
...
...
PSP
PSP

Jeśli przepis mieści się w siatce 2 × 2, możesz wyprowadzić go w siatce 2 × 2 lub 3 × 3. np . stick:

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

Przepisy można również odzwierciedlać poziomo (wokół pionowej linii symetrii), choć ma to znaczenie tylko dla siekiery, motyki i schodów. np . hoe:

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

Tak więc program musi wypisać dowolny przepis, który mieści się w siatce i ma prawidłowy kształt (ignorując tłumaczenie i tworzenie kopii lustrzanych). Są to wszystkie przepisy, które rozpozna oficjalna gra. (Pamiętaj, że przepisów nie można obracać ani kopiować w pionie).

Detale

  • Weź dane wejściowe ze standardowego wejścia lub wiersza poleceń. Możesz założyć, że dane wejściowe są zawsze prawidłowe. Wymaganie cudzysłowu wokół danych wejściowych (np. "chest") Jest w porządku.
  • Wyjście na standardowe wyjście (lub najbliższą alternatywę) z opcjonalnym końcowym znakiem nowej linii.
  • Najkrótsze przesłanie w bajtach wygrywa.

Przykład

Oto lista wszystkich danych wejściowych i przykładowych danych wyjściowych:

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
...
Hobby Calvina
źródło
1
Biorąc pod uwagę twoje próbki wyjściowe, nie widzę żadnego wyjątku. Wszystkie mogą być dublowane, ale większość jest symetryczna.
edc65
Skoro „w bajtach” prowadzi do licznika UTF-8, czy to oznacza, że musimy liczyć bajty w UTF-8?
Martin Ender
Tylko pełne programy? Brak funkcji
Alex A.
@Alex A. Racja.
Calvin's Hobbies
@ MartinBüttner Zrób to nie. (Wiesz dlaczego, choć prawdopodobnie to już nie ma znaczenia.: P)
Hobby Calvina

Odpowiedzi:

15

CJam, 100 96 94 91 bajtów

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

StackExchange porządkuje materiały niedrukowalne, więc zamiast kopiowania i wklejania tutaj jest link bezpośredni . Dodatkowo oto program testowy .

(Dzięki @Optimizer za informację fi @ MartinBüttner za informację o indeksowaniu modulo w 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

Wyjaśnienie

Aby zbudować przepisy, używamy 13 różnych wierszy (wymienione są również wyjaśnienia, dlaczego jest to minimalne):

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)

Wiersze kodujemy za pomocą Z"O>HVa=4a"98bZb+"P.SW"f=3/, co daje

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

Pierwszy bit "+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/koduje przepisy, dając

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

Zwróć uwagę na pierwszy wpis [3 3 8], na który jest przepis sign.

l72b970%=wczytuje dane wejściowe, a następnie stosuje magię, aby ustalić, który przepis wziąć z listy. Chociaż mamy tylko 21 przepisów, na liście jest 24 - dodatkowe kilka miejsc odpowiada literom [1 0 0]s.

Po przeczytaniu danych wejściowych, wybraniu przepisu i przekonwertowaniu przepisu na wiersze, wprowadzamy nowe znaki N*i automatycznie drukujemy.


CJam, 89 86 83 bajtów

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

... okazuje się, że twarde kodowanie wszystkich wyjść działa nieco lepiej w CJam. Jestem bardzo rozczarowany.

Po raz kolejny mamy kilka niedrukowalnych, więc oto bezpośredni link i program testowy .

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

Wyjaśnienie

Wyjścia są kodowane przy użyciu podstawy 3, z samotnym Wsczepionym z przodu, zanim struna zostanie podzielona na 3 s, aby dać rzędy, a rzędy zostaną podzielone na grupy 3 s, aby dać przepisy.

Podobnie jak powyżej, do wyboru przepisu używana jest magia konwersji bazowej i modulo. Istnieją 22 przepisy (jeden nieużywany), ale musimy wziąć modulo 24, więc faktycznie musimy wyraźnie określić 24%ten czas, zamiast polegać na indeksowaniu modulo.

Sp3000
źródło
Czy możesz opublikować zrzut heksowy xxd? Łącza bezpośrednie nie działają w przeglądarce Firefox.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨dd
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨'d̷̰̀ĥ̷̳ Niestety korzystam z systemu Windows, więc postawiłem kolejną najlepszą rzecz, na którą mógłbym sobie teraz poradzić.
Sp3000,
6

JavaScript (ES6), 235 241 262

Edytuj Nadużywaj jeszcze więcej zasady, że dane wejściowe są zawsze poprawne: jest tylko 1 element, który wymaga W, i może być w specjalnej obudowie. Siatka wyjściowa jest więc zakodowana jako 9-cyfrowa podstawowa liczba 3.

235 bajtów z I / O poprzez wyskakujące okienko.

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 bajtów jako funkcja do przetestowania.

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

Wyjście zawsze w postaci siatki 3x3. Przy 4 dostępnych symbolach wyjściowych siatka jest kodowana jako liczba bitów 3x3x2 (18). Ponieważ dane wejściowe muszą być zawsze poprawne, ciąg znaków jest przechowywany obcięty do absolutnego minimum.

Przetestuj w konsoli 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)))

Wydajność

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
źródło
2

Python, 305 bajtów

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

Wyjaśnienie

# 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

Komentarz

Ten kod z pewnością nie jest najmniejszy, ale działa dobrze. Jestem zadowolony. :)

Python, 282 bajty

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

Korzystanie z tej samej techniki w celu wygenerowania unikalnego identyfikatora, ale bezpośrednie wyszukiwanie przepisu w tablicy. Jest o wiele prostszy i trochę bardziej kompaktowy niż mój pierwszy kod.

NeatMonster
źródło
Mając specjalny przypadek dla „desek”, możesz skrócić ciąg doW.\n..
edc65