지수 적으로 칙칙한 프로그래밍 : Minecraft Slimes 쌓기


108

슬라임Minecraft 에서 큐브 모양의 적으로 죽으면 여러 개의 작은 버전으로 나뉩니다 . 이 문제를 해결하기 위해 이미지를 3 가지 색상의 8 × 8 픽셀 이미지로 묘사합니다.

64x64 점액

8x8 점액 ← True 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 버전 ()보다 큰 점액 이미지는 가장 가까운 이웃 업 샘플링 (즉, 모든 픽셀을 두 배로 늘림)에 의해 생성됩니다." 모든 픽셀을 4 배로 늘리고 각 픽셀을 2x2 정사각형으로 만드시겠습니까?
Caridorc

1
@Caridorc 각 방향으로 이중화?
wizzwizz4

@ wizzwizz4 예, 각 픽셀은 4가됩니다. 맞습니까?
Caridorc

답변:


21

MATL , 77 76 74 바이트

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

코드는 이 커밋 에서 작동합니다 .

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 비트, 4GB RAM)을 입력하여 테스트 11했으며 작동합니다. 대한 11결과 8192 × 16376 이미지입니다. 들어 12그것은 내 컴퓨터가 처리 할 수있는 것보다 더 4GB의 RAM, 이상 요구, 16384 × 32760 (536 메가 픽셀)이 될 것입니다.
Luis Mendo

2
강렬한 감정 때문에 눈물을 흘리는 스마일로 코드가 시작되는 방식이 마음에
듭니다

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 개의 3 진수로 해독

8 8⍴∊ 평평하게하고 8 × 8로 모양 변경

⍺⌿⍺/각 행과 열 시간을 복제

⍵⍴⊂가지고 사본을

⊃⍪/ 수직으로 쌓아

⊃,/ 모든 결과를 가로로 결합

3↑(116 196 96)(110 170 90)그림 물감; 3↑그들을 확장(0 0 0)

[ ]행렬의 각 요소로 색상을 색인화합니다. 결과는 RGB의 행렬입니다

('P3',⌽∘⍴,255,∊)"train"- 'P3'인수의 역 모양 을 반환 255하고 인수가 평탄화되는 함수입니다.


나는 당신이 가정한다고 가정 ⎕IO←0하고 바이트 수를 제외하고 조건으로 명시 할 수 있다고 생각합니다 . 많은 APL 시스템이이를 기본값으로 사용합니다. (당신의 LOL 포함)
Tobia

11

자바 스크립트 (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 그것을 지적 해 주셔서 감사합니다 – 나도 그것을 알아 차렸다. 있어 약간의 가능성 나가 '선택한 작업 공간에 문서의 색상을 변환 포토샵으로 스크린 샷을 가져 오는 동안이 ". 이미지가 수정되었습니다.
insertusername 여기

@Giles-여러분의 의견에 감사드립니다. 그래서 그것은 완전히 적절할 것입니다. 그러나 여기서 우리는 다른 사람들의 프로그램을 바꾸지 않습니다 – 우리는 그것들을 의견으로 말합니다.
찰스가

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)표준 출력에서 ​​일반 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 x 8 (3 x 3) 배열을 구성하는 데 적합 s합니다. 불행히도에 대한 " ArrayResize"아날로그 는 없으므로 크기를 조정하기 전에 ImageResize배열을 이미지 ( Image) 로 변환 한 다음 배열 ( ImageData)로 돌아가서 Joining 을 수행해야 합니다.

언 골프 드 :

(* 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 숫자로 인코딩하는 것이 더 짧을 수도 있지만 확실하게 시도해야합니다. 한편, 당신은 정의하지 않음으로써 바이트를 저장할 수 있습니다 b, g, f, e, t필요할 때까지 s모든에서 이름이 필요하지 않으며하지 않는다 둘 c. 들어 2^(j-1)8당신은 사용할 수 있습니다 4*2^j. 그 모든 적용, 나는 225 바이트에서 결국 : pastebin.com/YnkUwvwV
마틴 청산

@MartinEnder 감사합니다. 모두 좋은 제안입니다! (자기 참고 사항 : 가능하면 이름을 지정하지 말고, 그렇지 않으면 첫 번째 항목이 아닌 이전에 할당을 수행하십시오.)
lastresort

나는 완전히 지금 그것을 알아낼 시간이 있지만, 여기 피하기 위해 생각하지 않는 Image, ImageResize, ImageData물건을. 이 비트는 2의 팩터에 의해 배열 불면 배열이다. 따라서 초기 8x8 그리드를 variable에 저장 한 다음 각 사용 후에 수행 하면 연속 타일을 매우 쉽게 생성 할 수 있습니다. #&@@{##&@@{#,#}&//@x}xxx=#&@@{##&@@{#,#}&//@x}
Martin Ender

이것보다 4 바이트가 더 깁니다.#&[##&[#,#]&//@x]
Martin Ender

흠,이 아직 일을받지 못했습니다,하지만 당신은에 의해 좀 더 절약 할 수 있습니다)를 사용하여 ##~Join~2와 b) f={g,a=##&[G,G,G],a,g}다음의 모든 추가 항목을 바꾸 G,G,G으로 a뿐만 아니라.
Martin Ender

4

파이썬 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()

ungolfed 및 길이 테스트 ..

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


어떤 제안이라도 환영합니다 :) 특히 템플릿 배열 축소
Aaron

'0000100001111110111211100111111102211220022112200111111000001000'(배열을 역방향으로) 사용하는 것과 같은 것이 기저 3에서 기저 16으로 변환되었습니다 0x2df0777ca228b9c18447a6fb. 해당 숫자로 다음과 같은 코드를 사용 [0x2df0777ca228b9c18447a6fb//3**i%3 for i in range(64)]하여 정수를 올바른 순서로 가져옵니다.
Sherlock9

아, 파이썬 2에서는 [0x2df0777ca228b9c18447a6fb/3**i%3for i in range(64)]더 나을 수 있습니다.
Sherlock9

@ Sherlock9이 골프를 처음 사용하는 덕분에 기본 코드 변경이 어떻게 작동하는지 설명 할 수 있습니까?
Aaron

1
두 번째 부분은 해당 번호에서 배열을 다시 얻는 것 0x2df0777ca228b9c18447a6fb입니다. 이것은 간단합니다. 더 간단한 예를 들어에서 0숫자 를 얻으려면 012211003을 나누고 0마지막 숫자 (mod 3 사용)를 가져옵니다 0. 두 번째 숫자 2를 얻으려면 3을 나누고 mod 3을 얻습니다 1. 목록 이해력은 64전체 배열을 다시 얻기 위해 3 배로 나눕니다 . 더 궁금한 점이 있으면 PPCG 채팅 에서 질문 할 수 있습니다 .
Sherlock9

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.