Bunu nasıl yapabilirim?


21

21 ürün bulunmaktadır Minecraft sen ki zanaat sadece kullanılarak ahşap ahşap hazırlanmış ve öğeleri:

balta
tekne
kase
düğmesi
göğüs
işçiliği tablo
kapı
çit
kapısı
çapa
merdiven
kazma
plakalar
basınç plakası
kürek
işareti
levha
merdiven
sopa
kılıç
açılan kapı

Bu liste, 6 farklı tipte ahşap kalas / döşeme / kapı vb. Olduğunu varsaymaktadır . hepsi aynı madde olarak sayılır. Bunu düşünmenin bir başka yolu, yalnızca bir ahşap türüne erişiminizin olduğunu varsaymaktır.

Bu 21 öğenin her birinin farklı bir işçiliği tarifi var . Bu tariflerin her birini karakterlerin 2 × 2 veya 3 × 3 ızgarası olarak temsil edeceğiz .WPS. .Boş bir işçiliği yuvasıdır Wiçin ahşap , Piçindir ahşap plakalar ve Siçindir sopa . Bu belirli öğeler için başka hiçbir karakter gerekmez.

Örneğin, bu bir sandık tarifi :

PPP
P.P
PPP

Meydan okuma

Tam olarak yukarıda göründüğü gibi, 21 maddemizden birinin adını alan bir program yazın ve bu ürün için geçerli bir işçiliği tarifini yazdırın.

Hazırlama tarifleri çeviri değişmezdir, bu nedenle giriş ise fence, ikisi de geçerlidir:

PSP
PSP
...
...
PSP
PSP

Bir tarif 2 × 2 ızgaraya sığarsa, 2 × 2 veya 3 × 3 ızgaraya yazdırabilirsiniz. örneğin stick:

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

Tarifler yatay olarak da yansıtılabilir (dikey bir simetri çizgisi etrafında), ancak bu sadece balta, çapa ve merdivenler için bir fark yaratıyor. örneğin hoe:

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

Bu nedenle, şebekeye uyan ve doğru şekle sahip herhangi bir reçete (çeviri ve yansıtmayı yok sayarak) çıkarmak, programınızın yapması gereken şeydir. Bunlar resmi oyunun tanıyacağı tüm tarifler. (Tariflerin dikey olarak döndürülemediğini veya yansıtılamadığını unutmayın.)

ayrıntılar

  • Stdin'den veya komut satırından girdi alın. Girişin her zaman geçerli olduğunu varsayabilirsiniz. Giriş (örneğin "chest") etrafında tırnak istemek iyi.
  • İsteğe bağlı bir izleyen yeni satır ile stdout çıkışına (veya en yakın alternatife) çıkın.
  • Bayt cinsinden en kısa gönderme kazanır.

Örnek

İşte tüm girdilerin ve örnek çıktıların bir listesi:

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
Çıktı örnekleriniz göz önüne alındığında, hiçbir istisna görmüyorum. Hepsi yansıtılabilir, ancak çoğu simetriktir.
edc65 21.03.2015

UTF-8 sayaca "bayt" bağlantılarının yana, ortalama bunu yapmaz sahip UTF-8 bayt saymak?
Martin Ender

Sadece tam programlar? İşlev yok mu?
Alex A.

@Alex A. Doğru.
Calvin'in Hobileri

@ MartinBüttner Bunu hayır yap. (Nedenini biliyorsun, muhtemelen artık önemli değil.)
Calvin'in Hobileri

Yanıtlar:


15

CJam, 100 96 94 91 bayt

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

StackExchange yazdırılamayanları yönetir, bu yüzden buraya kopyalayıp yapıştırmak yerine kalıcı bağlantıdır . Ek olarak, işte test programı .

(@Optimizer'e bana anlattığın için teşekkürler f anlattıklarından dolayı @Optimizer'a ve CJam'ın modulo indekslemesini anlattığı için @ MartinBüttner'e teşekkürler.)

Cygwin'in 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

açıklama

Yemek tariflerini oluşturmak için 13 farklı satır kullanıyoruz (ayrıca bunun neden bu kadar düşük olduğunun açıklamaları da listelenmiştir):

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)

Aracılığıyla Biz satırları kodlamak Z"O>HVa=4a"98bZb+"P.SW"f=3/, veren

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

Birinci bit "+WcbKF AQH;_{GM8Lyf=_tmTn"141bDb3/, tarifleri kodlayan vererek

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

İlk girişin ne [3 3 8]olduğuna dikkat edin.sign .

l72b970%=girdiyi okur, ardından listeden hangi tarifi alacağınıza karar vermek için biraz sihir uygular. Listede sadece 21 tane tarif olmasına rağmen 24 tane var - ekstra birkaç nokta[1 0 0] s'ye .

Girdiyi okuduktan, tarifi seçtikten ve tarifi satırlara dönüştürdükten sonra bazı yeni satırlar koyduk N* otomatik olarak yazdırıyoruz.


CJam, 89 86 83 bayt

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

... tüm çıktıların kodlamasının CJam'da biraz daha iyi olduğu ortaya çıktı. Ben oldukça hayal kırıklığına uğradım.

Bir kez daha bazı yazdırılamazlarımız var, işte kalıcı bağlantı ve test programı. .

Cygwin'in 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

açıklama

Çıkışlar yalnız 3 ile, taban 3 kullanılarak kodlanır W , ipler sıralar vermek için ip 3'lere ayrılmadan önce öne doğru tutturulur ve sıralar tarifleri vermek için sıralar 3'lü gruplar halinde bölünür.

Yukarıdaki gibi, baz dönüştürme ve modulo sihir tarifi seçmek için kullanılır. 22 tane tarif (kullanılmayan) var, ancak modulo 24'ü almamız gerekiyor, bu yüzden 24%modulo indekslemesine dayanmak yerine bu zamanı açıkça belirtmemiz gerekiyor .


Bir hexdump gönderebilir misiniz xxd? Permalinkler Firefox'ta çalışmıyor.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Maalesef Windows'dayım, bu yüzden şu an yönetebileceğim en iyi şeyi yaptım.
Sp3000

6

JavaScript (ES6), 235 241 262

Düzenleme Kötüye Kullanımı her zaman geçerli olan kuralın daha da kötüye kullanılması: W gerektiren ve özel kasalı olabilen sadece 1 öğe var. Böylece çıkış ızgarası 9 basamaklı 3 basamakla kodlanır.

Açılır pencereden I / O ile 235 bayt.

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

Test edilebilir bir fonksiyon olarak 221 bayt.

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

Her zaman 3x3 ızgara olarak çıktı. Kullanılabilir 4 çıkış sistemi ile ızgara 3x3x2 (18) bit numarası olarak kodlanır. Girdi her zaman geçerli olması gerektiğinden, dize çıplak minimumda kesilerek saklanır.

Firefox / FireBug konsolunda test edin

;["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)))

Çıktı

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 bayt

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

açıklama

# 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

Yorum Yap

Bu kod kesinlikle en ufak değil ama gayet iyi çalışıyor. Tatmin oldum. :)

Python, 282 bayt

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

Eşsiz bir tanımlayıcı oluşturmak için aynı tekniği kullanmak, ancak direkt olarak dizideki tarifi aramak. İlk kodumdan çok daha basit ve biraz daha kompakt.


Eğer dize kısaltabilirsiniz 'tahtalar' için özel bir durum olmasıW.\n..
edc65
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.