指数関数的にぬるぬるしたプログラミング:Minecraftのスライムを積み重ねる


108

スライムは、Minecraftのキューブ型ので、殺されると複数の小さなバージョンになります。この課題の目的のために、3色の8×8ピクセル画像としてそれらを描写します:

64x64スライム

8x8スライム ←真の8×8バージョン。

正確なRGBカラーは次のとおりです。

  • 0, 0, 0 目と口のために
  • 110, 170, 90 中央の濃い緑色用
  • 116, 196, 96 外側の明るい緑色

チャレンジ

正の整数Nを取り込んで、長方形にパックされたNサイズのスライムのイメージを出力するプログラムまたは関数を作成します。左から右に進むと、画像は次のパターンに従う必要があります。

  • 2 (N-1) 8×8スライムのスタック。
  • 2 (N-2) 16×16スライムのスタック。
  • 2 (N-3) 32×32スライムのスタック。
  • スタックにスライムが1つだけ含まれるようになるまで続きます。

8×8バージョン(8x8スライム)よりも大きいスライム画像は、最近傍のアップサンプリング(つまり、すべてのピクセルを2倍にする)によって生成されます。ここで与えられた正確なスライムのデザインと色を使用する必要があることに注意してください。

最終画像には2 N -1個のスライムが含まれ、幅は2 (N + 3) -8ピクセル、高さは2 (N + 2)ピクセルになります。

画像は、一般的な画像ファイル形式で出力したり、ファイルに保存したり、生データストリームとして印刷/返送したり、実行時に直接表示したりできます。

バイト単位の最短コードが優先されます。

プログラムはこれらの正確な結果を生成するはずです。

N = 1:

N = 1

N = 2:

N = 2

N = 3:

N = 3

N = 4:

N = 4

N = 5:

N = 5

N = 6:

N = 6

大きいNも同様に機能するはずです。


30
私は賛成票を投じますが、票は残っていません。このコメントを残しているので、明日は賛成票を投じることを忘れないでください。
NoOneIsHere

23
私も賛成票を使い果たしたので、私はあなたのコメントを賛成しています。
センモウヒラムシ

4
「8×8バージョン()よりも大きなスライム画像は、最近傍のアップサンプリング(つまり、すべてのピクセルを2倍にする)によって生成されます。」すべてのピクセルを4倍にし、各ピクセルを2x2の正方形にするということですか?
カリドール

1
@Caridorcは各方向に倍増していますか?
wizzwizz4

@ wizzwizz4はい、各ピクセルは4になりますか?
カリドール

回答:


21

MATL77 76 74バイト

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

コードはこのcommitで機能しますが、これはチャレンジよりも前です。

MATLオンラインで試すことができます。このインタープリターはまだ実験段階です。動作しない場合は、ページを更新して、もう一度「実行」を押してみてください。

オフラインインタープリターで実行する例を次に示します。

ここに画像の説明を入力してください

説明

:                     % 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

「より大きなNも同様に機能するはずです。」しかし、n = 9で既にメモリ不足/インデックスエラーが発生しているようです。これはオンラインインタプリタのみですか、オフラインバージョンでも同様ですか
デビッドモルダー

1
@DavidMulder入力までのオフライン(Matlab R2015b、Windows 7 64ビット、4 GB RAMで実行されているコンパイラー)をテストし11、動作します。以下のために11結果8192×16376の画像です。以下のために12それは私のラップトップが処理できる以上であるRAMの4 GB以上を必要とする、16384×32760(536万画素)になります。
ルイスメンドー

2
私は、このコードが彼を感じさせる激しい感情のために彼の涙を抑えている笑顔でコードが始まる方法が好きです: "))
トムDoodler

14

Dyalog APL、118 113 バイト

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

仮定する ⎕IO=0

右から左へ:

i←2*⍳⎕ べき乗1 2 4 ... 2 n-1

i{ }¨⌽iべき乗(with )および逆のべき乗()で反復

⊤¨⍨⊂32⍴3 左側の各数字を32桁の3進数としてデコードします

8 8⍴∊ 8×8に平坦化および再形成する

⍺⌿⍺/各行と列の時間を複製する

⍵⍴⊂取るのコピーを

⊃⍪/ そしてそれらを垂直に積み重ねます

⊃,/ すべての結果を水平に結合します

3↑(116 196 96)(110 170 90)色; 3↑でそれらを拡張します(0 0 0)

[ ]マトリックスの各要素で色にインデックスを付けます。結果はRGBの行列です

('P3',⌽∘⍴,255,∊)は、「トレイン」です。'P3'引数の逆の形状が続き255、引数が平坦化されて返される関数です。


⎕IO←0バイトカウント以外の条件としてプログラムを記述し、それを条件として記述することができると思います。多くのAPLシステムはそれをデフォルトとして使用します。(あなたのLOLを含む)
トビア

11

JavaScript(ES7)、326 327バイト

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バージョン

自分で試してみてください。

(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とES6バージョンの唯一の違いは、の**代わりにを使用していることですMath.pow()。この例では、関数を呼び出す方法も確認できますn=4

結果

ここに画像の説明を入力してください


編集

  • 1バイト保存-不要な末尾セミコロンが見つかりました;

これは非常に遅く、10より大きい数値の場合は時間がかかる場合があります。


2
ここの画像では色が少しずれているように見えます。おそらくf.luxをオンにしてスクリーンショットを撮りましたか?
ジェザモン

@Jezzamonそれを指摘してくれてありがとう–私もそれに気づいた。ありますわずかな可能性私は可能性がある「選択した作業スペースにドキュメントの色を変換する Photoshopにスクリーンショットをインポートする際は、」。画像は修正されました。
insertusernamehere

@Giles-コメントを感謝します。SOでは、それは完全に適切です。しかし、ここでは、他のプログラムを変更しません-コメントで伝えます。
チャールズ

7

C、220バイト

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));}

読みやすさのために役に立たない改行を追加しました。スコアにはこれらの改行がありません。

f(n)stdoutにプレーンPPMイメージを出力する関数を定義します。


1
何らかの理由で、Cの答えは私の頭の中ではかなりエレガントです。
downrep_nation

7

Mathematicaの、267の 255 254 225 212バイト

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のおかげで29 42バイト節約

特に8 x 8(by 3)の配列を構築するために、ゴルフの提案を歓迎しsます。残念ながら、にArrayResize類似した" " がないImageResizeため、Imageサイズを変更する前に配列を画像()に変換し、次にing ImageDataを実行するために配列()に戻す必要がありJoinます。

ゴルフをしていない:

(* 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。生成するsには、ピクセル値を基数3の数値としてエンコードする方が短いかもしれませんが、確認する必要があります。一方で、あなたは定義しないでバイトを保存することができbgfetあなたがそれらを必要とするまで、およびsすべての名前を必要とせず、んでもありませんc。以下のために2^(j-1)8あなたが使用することができます4*2^j。これらすべてを適用すると、最終的に
Martin Ender

@MartinEnder多くの感謝、これらはすべて非常に良い提案です!(自己への注意:可能な場合は名前を付けないようにします。そうでない場合は、最初に(以前ではなく)割り当てを行います。)
lastresort

私は今、それを完全に把握するための時間を持っているが、ここでは回避するためのアイデアですしていないImageImageResizeImageDataものを。このビットは、2倍に配列を爆破します。配列は#&@@{##&@@{#,#}&//@x}どこにxありますか。したがって、最初の8x8グリッドを変数xに保存し、x=#&@@{##&@@{#,#}&//@x}使用するたびに保存すると、連続するタイルを非常に簡単に生成できます。
マーティンエンダー

:おっと、それはそれは必要以上に長い4バイトだ#&[##&[#,#]&//@x]
マーティン・エンダー

フム、私はこれはまだ動作するようになっていないんだけど、あなたはでいくつかのより多くを保存することができます)を使用して、##~Join~2およびb)f={g,a=##&[G,G,G],a,g}と、その後のすべてのさらなる発生を置き換えるG,G,Ga同様。
マーティンエンダー

4

Python 2.7: 424 412 405 376 357バイト

ゴルフは初めてです。

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

自由で長さテスト済み..

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:余分なimportステートメントを保存するために削除されsys.argv[1]ましたraw_input()

edit2:PILインポートの短縮:削除のfrom Image追加PIL.

edit3:スライムテンプレートの16進エンコードを@ Sherlock9に感謝します。

edit4:関数defを必要とせず、input()代わりに使用raw_input()


どんな提案でも歓迎です:)特にテンプレート配列を縮小するには
アーロン

'0000100001111110111211100111111102211220022112200111111000001000'(配列を逆方向に)使用して、ベース3からベース16に変換するようなもの0x2df0777ca228b9c18447a6fb。その数で、このようなコードを使用[0x2df0777ca228b9c18447a6fb//3**i%3 for i in range(64)]して、正しい順序で整数を取得します。
Sherlock9

ああ、Python 2では[0x2df0777ca228b9c18447a6fb/3**i%3for i in range(64)]より良いかもしれません。
Sherlock9

ゴルフの初心者である@ Sherlock9に感謝します。ベースコードの変更(と思われます)がどのように機能するか説明していただけますか。
アーロン

1
2番目の部分は、その番号から配列を取得すること0x2df0777ca228b9c18447a6fbです。これは簡単です。より単純な例では、から3 0番目の桁を取得するに01221100は、3 0回除算し、最後の桁(mod 3を使用)を取得し0ます。2桁目を取得するには、3で除算し、3 2をmodで取得し1ます。リストの内包表記は、64配列を完全に戻すために3 回で割るだけです。さらに質問がある場合は、PPCGチャットでそれらについて話し合うことができます
シャーロック9

1

R、378の 356 346 334バイト

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()}

PNGファイルとして保存します。インデント、改行あり:

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
N = 4

いくつかの説明:

プロットされるマトリックスは次のとおりです(0は薄緑、1は濃緑、2は黒を表します。列はy軸であり、行はx軸であるため、マトリックスは傾斜しています)。

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

imageその行列をプロットする各呼び出し(各整数は色に対応)。N = 4の場合、L(レイアウトマトリックス、各一意の番号は1つのプロットを表します)、w(マトリックス列の幅)、h(マトリックス行の高さ)です。

> 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.