指数史莱姆编程:堆叠Minecraft史莱姆


108

是立方体形的敌人我的世界被杀时分解成多个更小版本的自己。出于这一挑战的目的,我们将它们描述为具有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的粘液。
  • 依此类推,直到堆栈仅包含一个粘液。

大于8×8版本(8x8煤泥)的粘液图像是通过最近邻居的上采样(即,将所有像素加倍)生成的。请注意,您必须使用此处给出的确切的粘液设计和颜色。

最终图像将包含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
我赞成您的评论,因为我也没有足够的赞成意见。
trichoplax

4
“比8×8版本()大的史莱姆图像是通过最近邻居的上采样(即,将所有像素加倍)生成的。” 您是说将所有像素都翻两番,使每个像素变成2x2正方形吗?
Caridorc '16

1
@Caridorc在每个方向都加倍?
wizzwizz4 '16

@ wizzwizz4是的,每个像素变为4,对吗?
Caridorc '16

Answers:


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时给出了内存不足/索引错误。这是仅在线解释器,还是在离线版本中发生?
David Mulder

1
@DavidMulder我已经测试了脱机(在Matlab R2015b,Windows 7 64位,4 GB RAM上运行的编译器)的输入,11并且可以正常工作。为11结果是一个8192×16376的图像。因为12它将是16384×32760(536兆像素),需要超过4 GB的RAM,这超出了我的笔记本电脑的处理能力。
路易斯·门多

2
我喜欢这段代码如何以一个笑脸开始,因为它使他感到强烈的情绪,所以它会阻止他的眼泪:“')
Tom 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迭代()和反向功率(

⊤¨⍨⊂32⍴3 将左侧的每个数字解码为32位三进制数字

8 8⍴∊ 展平并重塑为8×8

⍺⌿⍺/复制每一行和每一列的时间

⍵⍴⊂副本

⊃⍪/ 并垂直堆叠

⊃,/ 水平合并所有结果

3↑(116 196 96)(110 170 90)颜色; 3↑(0 0 0)

[ ]用矩阵的每个元素索引颜色;结果是RGB矩阵

('P3',⌽∘⍴,255,∊)是“火车”-返回的函数,'P3'其后跟参数的形状相反255,并且参数变平。


我认为您可以在假设⎕IO←0字节数的情况下编写程序,并仅将其作为条件声明。许多APL系统将此作为默认设置。(包括您的大声笑)
Tobia

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,

@Jezzamon感谢您指出-我也注意到了这一点。有一个很小的可能性,我可能会选择“ 转换文档颜色到工作空间 ”,而进口的截图到Photoshop。该图像现已修复。
插入用户名

@Giles-感谢您的评论,在SO中,这是完全适当的,但是在这里,我们不更改其他人的程序-我们在评论中告诉他们。
不是查尔斯(Charles)

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

数学,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×8(3)阵列时s。不幸的是,没有的ArrayResize模拟物ImageResize,因此需要Image在调整大小之前将数组转换为图像(),然后再返回数组(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。应用所有这些,我最终得到225个字节:pastebin.com/YnkUwvwV
Martin Ender

@MartinEnder非常感谢,这些都是很好的建议!(自我说明:尽可能避免命名,否则在第一次出现时(而不是在之前)进行分配。)
lastresort 2016年

我没有时间来弄明白完全的权利,但这里是一个想法,以避免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:去除sys.argv[1]有利于raw_input()节省额外的import语句

edit2:缩短PIL导入:删除from Image添加PIL.

edit3:感谢@ Sherlock9的史莱姆模板的十六进制编码

edit4:不需要函数def并input()代替raw_input()


任何建议都值得欢迎:)特别是缩小模板数组
Aaron

像使用'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
第二部分是从该编号取回数组0x2df0777ca228b9c18447a6fb。这很简单。举一个简单的例子,0要从中获得第一个数字01221100,只需除以3 0倍,然后取最后一个数字(使用mod 3)即可得到0。要取第二个数字,请除以3 2倍,然后将mod 3取为1。列表理解只是除以3 64倍就可以得到完整的数组。如果您还有其他问题,我们可以在PPCG聊天中讨论。
Sherlock16年

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(布局矩阵,每个唯一的数字代表一个图),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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.