Üstel Sümüksü Programlama: Minecraft Zayıflama İstifleme


108

Çamurlar küp şeklinde olan düşmanlar içinde Minecraft öldürürken kendilerini birden fazla küçük sürümleri girmeye. Bu zorluğun amaçları doğrultusunda, onları 3 renk ile 8 × 8 piksel görüntü olarak göstereceğiz:

64x64 balçık

8x8 balçık ← Gerçek 8 × 8 versiyon.

Kesin RGB renkler:

  • 0, 0, 0 gözler ve ağız için
  • 110, 170, 90 Merkez için, koyu yeşil
  • 116, 196, 96 dış için, hafif yeşil

Meydan okuma

Olumlu bir tamsayı alan ve bir dikdörtgene paketlenmiş N boyutlarındaki inceliklerin görüntüsünü veren bir program veya işlev yazın. Soldan sağa doğru giderken, görüntüde aşağıdaki şekillere sahip olmalıdır:

  • 2 (N-1) 8 × 8 inceltilmiş bir yığın .
  • 2 (N-2) 16 × 16 inceltilmiş bir yığın .
  • 2 (N-3) 32 × 32 inceltilmiş bir yığın .
  • Ve yığın sadece bir sümük içerene kadar devam eder.

8 × 8 versiyonundan ( 8x8 balçık) daha büyük slime görüntüleri en yakın komşu örnekleme ile üretilir (yani tüm pikselleri iki katına çıkarır). Burada verilen tam sümük tasarım ve renklerini kullanmanız gerektiğini unutmayın.

Son görüntü 2 N -1 inceltecek ve 2 (N + 3) -8 piksel genişliğinde ve 2 (N + 2) piksel yüksekliğinde olacak.

Görüntü, herhangi bir ortak görüntü dosyası biçiminde çıkarılabilir, bir dosyaya kaydedilir veya ham veri akışı olarak yazdırılabilir / döndürülebilir veya çalışma süresi boyunca doğrudan görüntülenebilir.

Bayt cinsinden en kısa kod kazanır.

Örnekler

Programınız bu kesin sonuçları vermeli.

N = 1:

N = 1

N = 2:

N = 2

N = 3:

N = 3

N = 4:

N = 4

N = 5:

N = 5

N = 6:

N = 6

Büyük N de aynı şekilde çalışmalıdır.


30
Oy kullanmam için oy kullanmam gerekirdi. Bu yorumdan ayrılıyorum, o yüzden yarın oy vermeyi hatırlayacağım.
NoOneIsHere

23
Ben de yorumunuzu değiştiriyorum çünkü ben de fazla oy alamadım.
trichoplax

4
"8 × 8 versiyonundan () daha büyük sümük görüntüler, en yakın komşu örnekleme tarafından üretilir (yani tüm pikselleri iki katına çıkarır)." Tüm pikselleri dört katına çıkarmak, her pikseli 2x2 kareye dönüştürmek mi demek istediniz?
Caridorc

1
@Caridorc Her yöne iki kat?
wizzwizz4

@ wizzwizz4 Evet, her piksel 4 olur, doğru mu?
Caridorc

Yanıtlar:


21

MATL , 77 76 74 bayt

:"')^.,9&Xze`}+.E=p'F3ZaQ8e@qWt3$Y"G@-W1X"]&h[OOO;11 17E]5*29 7U24hhE&vEYG

Kod bu zorlamada işe yarıyor, bu zorluktan daha önce.

MATL'de çevrimiçi olarak deneyebilirsiniz . Bu tercüman hala deneysel. Çalışmazsa, sayfayı yenilemeyi ve tekrar "Çalıştır" düğmesine basmayı deneyin.

İşte çevrimdışı tercümandan bir örnek:

görüntü tanımını buraya girin

açıklama

:                     % Input N implicitly. Generate range [1 2 ... N]
"                     % For each k in [1 2 ... N]
  ')^.,9&Xze`}+.E=p'  %   Compressed string
  F3Za                %   Decompress with target alphabet [0 1 2]
  Q                   %   Add 1
  8e                  %   Reshape into 8×8 array containing values 1, 2, 3
  @qW                 %   Push 2 raised to k-1
  t                   %   Duplicate
  3$Y"                %   Repelem: interpolate image by factor 2 raised to k-1
  G@-W                %   Push 2 raised to N-k
  1X"                 %   Repmat: repeat the array vertically. Gives a vertical strip
                      %   of repeated subimages
]                     % End for each
&h                    % Concatenate all vertical strips horizontally. This gives a big
                      % 2D array containing 1, 2, 3, which represent the three colors
[OOO;11 17E]5*        % Push array [0 0 0; 11 17 9] and multiply by 5
29 7U24hhE            % Push array [29 49 24] and multiply by 2
&vE                   % Concatenate the two arrays vertically and multiply by 2.
                      % This gives the colormap [0 0 0; 110 170 90; 116 196 96]
YG                    % Take the array and the colormap and display as an image

"Büyük N de aynı şekilde çalışmalı."
David Mulder

1
@DavidMulder Girişleri çevrimdışı olarak test ettim (Matlab R2015b, Windows 7 64 bit, 4 GB RAM'de çalışan derleyici) 11ve çalışır. İçin 11sonuç, bir 8192 x 16376 görüntüdür. İçin 12laptop'umun işleyebilir daha fazla RAM 4 GB üzerinde gerektiren, 16384 x 32760 (536 MP) olur.
Luis Mendo

2
Kodun yoğun duyguları nedeniyle gözyaşlarını tutan bir suratla nasıl başladığını ve bu kodun kendisini hissettirdiğini seviyorum: "')
Tom Doodler,

14

Dyalog APL, 118 113 bayt

('P3',⌽∘⍴,255,∊)(3↑(116 196 96)(110 170 90))[⊃,/i{⊃⍪/⍵⍴⊂⍺⌿⍺/8 8⍴∊22923813097005 926134669613412⊤¨⍨⊂32⍴3}¨⌽i←2*⍳⎕]

varsayarak ⎕IO=0

Sağdan sola doğru:

i←2*⍳⎕ güçler 1 2 4 ... 2 n-1

i{ }¨⌽igüçler üzerinde yineleme (birlikte ) ve tersine çevrilmiş güçler ( )

⊤¨⍨⊂32⍴3 Soldaki sayıların her birinin kodunu 32 ternary rakam

8 8⍴∊ düzleştirin ve 8 × 8 şeklinde yeniden şekillendirin

⍺⌿⍺/her satır ve sütun zamanını çoğalt

⍵⍴⊂kopyalarını almak

⊃⍪/ ve dikey olarak istifleyin

⊃,/ tüm sonuçları yatay olarak birleştir

3↑(116 196 96)(110 170 90)renkler; 3↑onları ile genişletir(0 0 0)

[ ]renkleri matrisin her bir öğesiyle indeksleyin; sonuç bir RGB matrisidir

('P3',⌽∘⍴,255,∊)bir "tren" - 'P3'argümanın ters çevrilmiş şeklini izleyen bir işlev 255ve argüman düzleşti.


Sanırım programınızı ⎕IO←0bayt sayısının dışında bir koşul olarak varsayarak yazabilir ve belirtebilirsiniz . Birçok APL sistemi bunu varsayılan olarak kullanır. (Sizinki LOL dahil)
Tobia,

11

JavaScript (ES7), 326 327 bayt

n=>{x=(d=document).body.appendChild(c=d.createElement`canvas`).getContext`2d`;c.width=2*(c.height=4*(p=2**n)));for(i=0;i<n;i++){c=-1;for(j of[...'0001000001111110022112200221122011111110011121110111111000010000'])for(x.fillStyle=['#74c460','#6eaa5a','#000'][j],c++,k=0;k<p;)x.fillRect(c%8*(_=2**i)+_*8,~~(c/8)*_+_*8*k++,_,_)}}

Ungolfed ES6 Sürümü

Kendin dene.

(n=>{
    x=(d=document).body.appendChild(c=d.createElement`canvas`).getContext`2d`;
    c.width=2*(c.height=4*(p=Math.pow(2,n)));
    for(i=0;i<n;i++){
        c=-1;
        for(j of[...'0001000001111110022112200221122011111110011121110111111000010000'])
            for(x.fillStyle=['#74c460','#6eaa5a','#000'][j],c++,k=0;k<p;)
                x.fillRect(c%8*(_=Math.pow(2,i))+_*8,~~(c/8)*_+_*8*k++,_,_)
    }
})(4);

ES7 ve ES6 sürümleri arasındaki tek fark **yerine kullanmaktır Math.pow(). Ayrıca, işlevi nasıl çalıştırabileceğinizi de görebilirsiniz - bu örnekte n=4.

Sonuç

görüntü tanımını buraya girin


Düzenlemeler

  • 1 bayt kaydedildi - gereksiz bir takip noktalı virgül buldu;

Bu oldukça yavaş ve 10'dan büyük sayılar için biraz zaman alabilir.


2
Buradaki resimlerdeki renkler biraz kapalı görünüyor. Belki f.lux ile ekran görüntüsü?
Jezzamon

@Jezzamon Gösterdiğiniz için teşekkürler - Ben de bunu farkettim. Bir var hafif olasılık ı olabilir "seçmiş çalışma alanına belgenin renklerini dönüştürme Photoshop içine ekran görüntüsü ithal ediyor". Görüntü şimdi sabittir.
insertusernamehere

@Giles - Yorumunuzu takdir edin ve SO'da bu tamamen uygun olur, ancak burada başkalarının programlarını değiştirmiyoruz - yorumlarda onlara söylüyoruz.
Charles,

7

C, 220 bayt

x,y,r;f(n){
printf("P3 %d %d 255 ",(8<<n)-8,4<<n);
for(y=0;y<4<<n;++y)for(r=0;r<n;++r)for(x=0;x<8<<r;++x)
puts("110 170 90\0 116 196 96\0 0 0 0"+12*
(117-"` t5L\rL\ru5tst5` "[x>>r+2|(y>>r)%8*2]>>(x>>r)%4*2&3));}

Okunabilirlik için işe yaramaz newlines ekledim, puan bu newlines olmadan.

Stdout'ta f(n)düz PPM görüntüsü veren bir işlev tanımlar .


1
Nedense C cevapları aklımda oldukça zarif.
downrep_nation

7

Mathematica, 267 255 254 225 212 bayt

G=10{11,17,9};Image@Join[##,2]&@@Table[Join@@Table[ImageData@ImageResize[Image[{t={g=G+{6,26,6},g,g,G,g,g,g,g},f={g,a=##&[G,G,G],a,g},e={g,b=0g,b,G,G,b,b,g},e,{a,a,G,g},{g,a,b,a},f,t}/255],4*2^j],2^(#-j)],{j,#}]&

Martin Ender sayesinde 29 42 bayt kaydedildi

Golf önerileri özellikle 8'e 8 (3'e kadar) diziyi oluşturmak için uygundur s. Maalesef, " ArrayResize" analogu yok ImageResize, bu yüzden dizinin Imageyeniden boyutlandırmadan önce bir resme ( ) ve sonra tekrar yapmak için diziye ( ImageData) dönmesi gerekiyor Join.

Ungolfed:

(* dark green, light green, black *)
G = 10 {11, 17, 9};
g = G + {6, 26, 6};
b = 0 g;

(* abbreviation for triple G sequence, top row, forehead, eye level *)
a = ##&[G, G, G];
t = {g, g, g, G, g, g, g, g};
f = {g, a, a, g};
e = {g, b, b, G, G, b, b, g};

(* slime *)
s =
  {
    t,
    f,
    e,
    e,
    {a, a, G, g},
    {g, a, b, a},
    f,
    t
  }/255;

(* jth column *)
c[n_, j_] := Join @@ Table[ImageData@ImageResize[Image[s], 4*2^j], 2^(n - j)]

(* final program *)
Image@Join[##, 2] & @@ Table[c[#, j], {j, #}] &

1
b=0g. Oluşturmak için sbir baz-3 sayı olarak piksel değerlerini kodlamak için daha kısa olabilir ama emin olmak için denemek zorundayız. Bu arada, tanımlama etmeyerek bayt kaydedebilir b, g, f, e, tsiz ihtiyaç duyana kadar ve shiç bir isim ihtiyacı yoktur ve yapar ne c. İçin 2^(j-1)8kullanabilirsiniz 4*2^j. Hepsini uygulayarak, 225 baytta bitiyorum
Martin Ender

@MartinEnder Çok şükret, bunlar çok iyi öneriler! (
Kendime

Ben tamamen Hemen şimdi anlamaya zaman var, ama burada önlemek için bir fikir yok Image, ImageResize, ImageDatamalzeme. Bu bit bir diziyi 2 katına kadar yükseltir: dizinin #&@@{##&@@{#,#}&//@x}nerede xolduğu. Bu nedenle, ilk 8x8 ızgarasını değişkende saklarsanız xve ardından x=#&@@{##&@@{#,#}&//@x}her kullanımdan sonra yaparsanız , ardışık döşemeleri kolayca oluşturabilirsiniz.
Martin Ender

Hata! Olması gerekenden daha uzun olan 4 bayt:#&[##&[#,#]&//@x]
Martin Ender

Hm, bunu henüz işe alamıyorum, ancak a) ##~Join~2ve b) 'yi kullanarak daha fazla tasarruf edersiniz f={g,a=##&[G,G,G],a,g}ve daha sonra her bir tekrarı ile G,G,Gbirlikte değiştirebilirsiniz a.
Martin Ender

4

Python 2.7: 424 412 405 376 357 Bayt

Golf oynamak için biraz yeniyim .... işte başlıyoruz

from numpy import*
import PIL
def c(n,col):e=log2((col+8)/8)//1;r=2**e;t=2**(n-e-1);return tile(repeat(array([0x2df0777ca228b9c18447a6fb/3**i%3for i in range(64)],dtype=int8).reshape([8,8])[:,(col-(8*r-8))//r],r),t)
n=input();i=PIL.Image.fromarray(column_stack([c(n,col) for col in range(2**(n+3)-8)]),mode='P');i.putpalette('t\xc4`n\xaaZ'+' '*762);i.show()

yıpranmış ve uzunluk test edilmiştir.

from numpy import*
import PIL

def c(n,col): #creates array for a given column
    s = array([0x2df0777ca228b9c18447a6fb/3**i%3for i in range(64)],dtype=int8).reshape([8,8]) #slime template (golfed inline)
    e=log2((col+8)/8)//1 #exponent for tiles and repititions
    r=2**e #number of repitions (scale factor)
    t=2**(n-e-1) #number of tiles (vertically)
    return tile(
            repeat(
             s[:,(col-(8*r-8))//r] #select appropriate column from template
              ,r) #repeat it r times
               ,t) #tile it t times

n = input()
arr = column_stack([c(n,col) for col in range(2**(n+3)-8)]) #create image array by stacking column function
i=PIL.Image.fromarray(arr,mode='P'); #colormap mode
i.putpalette('t\xc4`n\xaaZ'+' '*762); #set colormap
i.show()

s = r'''from numpy import*
import PIL
def c(n,col):e=log2((col+8)/8)//1;r=2**e;t=2**(n-e-1);return tile(repeat(array([0x2df0777ca228b9c18447a6fb/3**i%3for i in range(64)],dtype=int8).reshape([8,8])[:,(col-(8*r-8))//r],r),t)
n=input();i=PIL.Image.fromarray(column_stack([c(n,col) for col in range(2**(n+3)-8)]),mode='P');i.putpalette('t\xc4`n\xaaZ'+' '*762);i.show()'''

print len(s)

edit1: Ekstra içe aktarma deyimini kaydetme sys.argv[1]lehine kaldırıldıraw_input()

edit2: kısaltılmış PIL içe aktarma: from Imageeklenen eklendiPIL.

edit3: slime şablonunun hex kodlaması için teşekkürler @ Sherlock9

edit4: fonksiyon def'e ihtiyaç duymaz ve input()yerine kullanılır .raw_input()


Herhangi bir öneri hoş geldiniz :) :) özellikle şablon dizisini küçültmek için
Aaron

Kullanmak '0000100001111110111211100111111102211220022112200111111000001000'(geriye doğru dizilişinizi) taban 3'ten taban 16'ya dönüştürmek gibi bir şey 0x2df0777ca228b9c18447a6fb. Bu sayı ile [0x2df0777ca228b9c18447a6fb//3**i%3 for i in range(64)]tamsayılarınızı doğru sıraya sokmak için bunun gibi bir kod kullanın .
Sherlock9

Ah, Python 2'de [0x2df0777ca228b9c18447a6fb/3**i%3for i in range(64)]daha iyi olabilir.
Sherlock9

Thanks @ Sherlock9 golf oynamakta yeni bir rol oynuyor, temel kod değişikliğinin nasıl çalıştığını (varsaydığımı) açıklayabilir misiniz?
Aaron,

1
İkinci bölüm dizinizi bu numaradan geri almak 0x2df0777ca228b9c18447a6fb. Bu basit. Daha basit bir örnek için, 0inci basamağı almak için 01221100, sadece 3 0kez bölün ve ardından almak için son basamağı (mod 3 kullanarak) alın 0. 2. haneyi almak için, 3 2kez bölün , ardından mod 3 olsun 1. Listenin kavranması 64, dizinizin tamamını geri almak için sadece 3 kez bölünür . Başka sorunuz varsa, bunları PPCG sohbetinde tartışabiliriz .
Sherlock9

1

R, 378 356 346 334 bayt

f=function(n){r=rep;k=r(0,4);m=r(1,6);L=c();for(i in 1:n)L=cbind(L,r(max(L,0)+2^(n-i):1,e=2^(i-1)));png(w=sum(w<-4*2^(1:n)),h=sum(h<-r(8,2^(n-1))));layout(L,w,h);for(i in 1:max(L)){par(mar=k);image(matrix(c(0,0,0,1,k,0,m,0,0,1,1,1,2,r(1,10),0,0,r(r(c(2,1,2,0),e=2),2),m,k,1,k),nr=8),col=c("#74C460","#6EAA5A",1),ax=F,an=F)};dev.off()}

Bir png dosyası olarak kaydeder. Satır beslemeli, girintili:

f=function(n){
    r=rep
    k=r(0,4)
    m=r(1,6)
    L=c()
    for(i in 1:n)L=cbind(L,r(max(L,0)+2^(n-i):1,e=2^(i-1)))
    png(w=sum(w<-4*2^(1:n)),h=sum(h<-r(8,2^(n-1))))
    layout(L,w,h)
    for(i in 1:max(L)){
        par(mar=k)
        image(matrix(c(0,0,0,1,k,0,m,0,
                       0,1,1,1,2,r(1,10),0,
                       0,r(r(c(2,1,2,0),e=2),2),
                       m,k,1,k),
                     nr=8),
              col=c("#74C460","#6EAA5A",1),ax=F,an=F)
    }
    dev.off()
}

N = 2: N = 3: N = 4:N = 2
N = 3
K = 4

Bazı açıklamalar:

İşte çizilen matris (0 açık yeşil, 1 koyu yeşil ve 2 siyahı temsil eder; matris eğilir çünkü sütunlar y eksenidir ve x eksenini sıralar):

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    0    0    1    0    0    0    0
[2,]    0    1    1    1    2    2    1    0
[3,]    0    1    1    1    2    2    1    0
[4,]    1    1    1    1    1    1    1    1
[5,]    0    1    2    1    1    1    1    0
[6,]    0    1    1    1    2    2    1    0
[7,]    0    1    1    1    2    2    1    0
[8,]    0    0    1    0    0    0    0    0

Her biri imagebu matrisi çizer (her tamsayı bir renge karşılık gelirken). N = 4 için, burada L (düzen matrisi, her benzersiz sayı bir tek grafiği temsil eder), w (matris sütunlarının genişlikleri) ve h (matris satırlarının yükseklikleri):

> L
     [,1] [,2] [,3] [,4]
[1,]    8   12   14   15
[2,]    7   12   14   15
[3,]    6   11   14   15
[4,]    5   11   14   15
[5,]    4   10   13   15
[6,]    3   10   13   15
[7,]    2    9   13   15
[8,]    1    9   13   15
> w
[1]  8 16 32 64
> h
[1] 8 8 8 8 8 8 8 8
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.