우리 별의 색


90

첫 줄의 형식이 문자열 또는 텍스트 파일 인 프로그램 작성

width height

각각의 다음 줄은

x y intensity red green blue

어디:

  • width그리고 height어떤 양의 정수가 될 수 있습니다.
  • x그리고 y어떤 정수 할 수있다.
  • intensity 음수가 아닌 정수일 수 있습니다.
  • red, greenblue0에서 255까지의 정수일 수 있습니다.

프로그램은 크기가 by 인 일반적인 무손실 이미지 파일 형식으로 트루 컬러 이미지를 출력해야합니다 . 마다widthheightx y intensity red green blue 선은 이미지에 그려야하는 화려한 별 또는 구를 나타냅니다. 0을 포함하여 여러 개의 별을 그릴 수 있습니다. 문자열이나 파일에 줄 바꿈 문자가 있다고 가정 할 수 있습니다.

이미지를 그리는 알고리즘은 다음과 같지만 결과가 동일하다면 원하는 방식으로 이미지를 구현할 수 있습니다.

이미지의 모든 픽셀 ( X , Y )에 대해 (여기서 X 는 가장 왼쪽 가장자리에 0 , 가장 오른쪽 가장자리에 폭 -1 , Y 는 위쪽 가장자리에 0 , 아래쪽 가장자리에 높이 -1 ) C ϵ { red , green , blue } (0에서 255 사이에 고정 된 값)는 다음 방정식으로 제공됩니다.

컬러 채널 방정식

어디 DIST의 기능 중 하나입니다 유클리드 거리 :

유클리드 거리 방정식

또는 맨해튼 거리 :

맨해튼 거리 방정식

골프 또는 미학에 따라 원하는 거리 기능을 선택하십시오.

첫 번째 입력 외에 입력의 각 행은 별표 세트 의 요소입니다 . 따라서, 예를 들면 S의 X는 나타내는 x입력 라인들 중 하나에 대한 값을, S 및 C는 하나 나타내고 red, green또는 blue,에 따라 색상 채널은 계산되고있다.

예 A

입력이

400 150
-10 30 100 255 128 0

출력은

예 A, 유클리드

유클리드 거리를 사용하는 경우

예 A, 맨해튼

맨해튼 거리를 사용하는 경우

실시 예 B

입력이

200 200
100 100 10 255 255 255
20 20 40 255 0 0
180 20 40 255 255 0
180 180 40 0 255 0
20 180 40 0 0 255

유클리드와 맨해튼 거리에 대한 각 출력은

예 B, 유클리드그리고 예 B, 맨해튼.

실시 예 C

입력이

400 400
123 231 10 206 119 85
358 316 27 170 47 99
95 317 3 202 42 78
251 269 17 142 150 153
43 120 3 145 75 61
109 376 6 230 231 52
331 78 21 31 81 126
150 330 21 8 142 23
69 155 11 142 251 199
218 335 7 183 248 241
204 237 13 112 253 34
342 89 18 140 11 123

출력은

예 C, 유클리드

유클리드 거리를 사용하는 경우

예 C, 맨해튼

맨해튼 거리를 사용하는 경우

실시 예 D

입력이

400 400
123 231 5 206 119 85
358 316 5 170 47 99
95 317 5 202 42 78
251 269 5 142 150 153
43 120 5 145 75 61
109 376 5 230 231 52
331 78 5 31 81 126
150 330 5 8 142 23
69 155 5 142 251 199
218 335 5 183 248 241
204 237 5 112 253 34
342 89 5 140 11 123

출력은

예 D, 유클리드

유클리드 거리를 사용하는 경우

예 D, 맨해튼

맨해튼 거리를 사용하는 경우

실시 예 E

입력이

100 1

그런 다음 출력은 100 픽셀 x 1 픽셀의 이미지로 완전히 검은 색이어야합니다.

노트

  • stdin 또는 명령 행에서 입력 문자열 또는이를 포함하는 텍스트 파일의 이름을 가져 오거나 문자열을받는 함수를 작성할 수 있습니다.
  • "출력"이미지는 다음 중 하나를 의미합니다.
    • 선택한 이름으로 파일에 저장합니다.
    • 원시 이미지 파일 데이터를 stdout에 인쇄
    • 예와 같이, 화상 표시, PIL '들 image.show().
  • 귀하의 이미지가 완벽한 픽셀인지 확인하지는 않지만 (스택 교환은 이미지를 손실없이 압축합니다) 시각적으로 차이점을 알 수 있다면 의심됩니다.
  • 그래픽 / 이미지 라이브러리를 사용할 수 있습니다.

승리

바이트 단위의 최단 제출이 이깁니다. 관계가있는 경우 가장 빠른 제출이 이깁니다.

재미있는 보너스 : 정말 멋진 출력 이미지를 위해 입력하십시오.


38
와우 +1 이것은 화려하다. (그리고 건강한 뉴 호라이즌 우주선의 말을 들으면서 적절한 시간을 게시하십시오!)
BrainSteel

입력이 공백으로 분리 된 형식이어야합니까, 아니면 쉼표로 구분할 수 있습니까? 어쨌든 +1.
Maltysen

1
@Maltysen 공간이 분리되었습니다. (나는 그것이 인색하지만 다스 입력 변형을 허용하는 것보다 쉽다는 것을 안다.)
Calvin 's Hobbies

4
보 주나 별이 더 아름다운지 결정할 수 없습니다.
trichoplax

픽셀 효과를 위해 비트 맵의 ​​해시를 비교할 수 있습니다
Tobias Kienzler

답변:


26

Pyth-46 바이트

이것은 재미 있었다! 마침내 Pyth의 이미지 I / O 기능을 사용해야했습니다. 맨해튼은 짧은 변화이지만 골프로 인해 유클리드 거리를합니까?

Krz7.wcmmsm/*@b+3k@b2h.a,<b2_.DdhKrR7.zU3*FKhK

이것은 픽셀 루프를 하나의 루프로 압축하지만 divmodPyth는 3 개의 중첩 된 맵 만 지원하고 계산에는 2 개 (RGB 용 및 1 개) 가 있기 때문에 수식을 사용하여 모든 픽셀을 반복 합니다.

이미지를로 저장합니다 o.png. 꽤 느리고 처음 2 번의 테스트는 2 분 안에 이루어 지지만 나머지 2 개의 테스트는 30 분 정도 걸립니다.

.w아무도 그것을 사용하지 않기 때문에 아무도 눈치 채지 못했던 버그 가 있습니다.;) 그러나 풀 요청을 넣었으므로 곧 병합되지 않으면 테스트를 위해 포크를 사용하십시오. 합병!

출력 예

예 A

예 A

실시 예 B

실시 예 B

실시 예 C

실시 예 C

실시 예 D

실시 예 D


7
와이, 피쓰가 그렇게 할 수 있는지 몰랐어요. 언젠가 Pyth에서 비즈니스 소프트웨어를 작성할 수 있습니다. 작성하는 코드가 적기 때문에 리팩토링이 더 빠르고 쉬워야합니다. : D
Cristian Lupascu

7
@ w0lf "프로그래머 시간은 실행 시간보다 중요합니다."우리는 모두 Pyth가 프로그래머 시간을 줄이는 데 도움이된다는 것을 알고 있습니다. :) 이미지 I / O는 최근 Pyth가 그래픽 출력 문제에서 제외 된 후에 추가되었습니다. 내부적으로 베개를 사용합니다.
Maltysen

11
@Nit 절대적으로. 또한 쓰기 속도와 관련이 없습니다. 나의 이전 의견은 농담이었습니다.
Cristian Lupascu

2
여러분은 한 가지 중요한 것을 잊었습니다. 코드가 적기 때문에 디버그하기도 쉽습니다.)
Optimizer

14
프로그래머 시간을 줄인다는 것은 "파이스와 함께 코드 골프를하고 있으므로 '실제'코드를 작성하는 데 시간이 덜 걸리는 것"을 의미합니까?

42

자바 스크립트 394 344

function X(a){for(l=a.match(/\d+/g),h=document,v=h.body.appendChild(h.createElement("canvas")),v.width=W=l[0],v.height=H=l[1],w=v.getContext("2d"),e=w.createImageData(W,H),d=e.data,N=W*H;N--;)for(i=2,c=N*4,d[c+3]=255;i<l.length;)for(x=N%W-l[i++],y=~~(N/W)-l[i++],k=l[i++],q=0;q<3;)d[c+q++]+=k*l[i++]/-~Math.sqrt(x*x+y*y);w.putImageData(e,0,0);}

편집 : wolfhammer 의 멋진 제안 을 적용하여 코드를 많이 단축했습니다 .

테스트

참고 : 아래 스 니펫이 렌더링 될 때까지 몇 초 정도 기다립니다 (시스템에서 ~ 4 초 소요).

JSFiddle 에서 실행할 수도 있습니다 .

보너스 : 블루 이클립스

function X(a){for(l=a.match(/\d+/g),h=document,v=h.body.appendChild(h.createElement("canvas")),v.width=W=l[0],v.height=H=l[1],w=v.getContext("2d"),e=w.createImageData(W,H),d=e.data,N=W*H;N--;)for(i=2,c=N*4,d[c+3]=255;i<l.length;)for(x=N%W-l[i++],y=~~(N/W)-l[i++],k=l[i++],q=0;q<3;)d[c+q++]+=k*l[i++]/-~Math.sqrt(x*x+y*y);w.putImageData(e,0,0);}

var j = 0;
var renderFrame = function () {
  if(window.h && window.v){h.body.removeChild(v);} // clear prev frame
  X("225 150\n" +
    (70 + j) + " " + (120 - j) + " 170 135 56 0\n" + 
    j * 5 + " " + j * 3 + " 64 0 50 205");       
  if(++j < 50) { setTimeout(renderFrame, 1); } else { console.log('done!'); }
};
setTimeout(renderFrame, 10);

JSFiddle 에서 실행할 수도 있습니다 .

기술

이것은 간단한 JavaScript + HTML5 캔버스 구현입니다. 문자열 인수 (후행 공백 / 줄 바꾸기없이)를 가져 와서 DOM에 출력을 표시하는 함수입니다. 유클리드 거리를 사용합니다.

다음은 읽을 수있는 코드입니다.

X = function (str) {
  var lines = str.split("\n");  
  var canvas = document.createElement('canvas');
  var z = lines[0].split(u=' ');
  var width = z[0], height = z[1];

  canvas.width = width;
  canvas.height = height;
  document.body.appendChild(canvas);

  var ctx = canvas.getContext("2d");
  var imageData = ctx.createImageData(width, height);

  for(var y = 0; y < height; y++){
    for(var x=0; x < width; x++){
      var coord = (y * width + x) * 4;

      for(i=1; i < lines.length;i++){
        var t = lines[i].split(u);

        var 
          dx = x - t[0], 
          dy = y - t[1];

        var distance = Math.sqrt(dx * dx + dy * dy);

        for(var channel = 0; channel < 3; channel++) {
          var channelIndex = coord + channel;
          imageData.data[channelIndex] += t[2] * t[3 + channel] / (distance + 1);
        }
      }

      var alphaIndex = coord + 3;
      imageData.data[alphaIndex] = 255;
    }
  }

  ctx.putImageData(imageData, 0, 0);
};

Blue Eclipse에서 후광이 서로 붙어있는 방식이 마음에 듭니다. manhatan 스타일을 추가 할 수 있습니까?
PTwr

1
@PTwr 물론입니다. jsfiddle.net/pjLnazw1
Cristian Lupascu

대박! (7 더 가기 ... ugh)
PTwr

@ w0lf x와 y 반복자를 결합하여 함수에서 일부 바이트를 줄일 수 있습니다. jsfiddle
울프 해머

@wolfhammer 와우, 이제는 "일부 바이트"에 불과합니다. 색인에 대해 수정해야 할 것이 있다고 생각하기 때문에 나중에 살펴 보겠습니다 (샘플 이미지 2, 3 및 4의 경우 왼쪽의 픽셀이 줄 바꿈되는 것처럼 보입니다). 감사!
Cristian Lupascu

26

자바-627 바이트

Java는 실제로 최고의 골프 ​​언어 중 하나입니다. :)

import java.awt.image.*;class M{void f(String n)throws Exception{String[]p=n.split("\n");int[]b=s(p[0]);BufferedImage o=new BufferedImage(b[0],b[1],2);for(int i=0;i<b[0];i++)for(int j=0;j<b[1];j++){int[]c=new int[3];for(int l=1;l<p.length;l++){int[]r=s(p[l]);for(int k=0;k<3;k++){c[k]+=r[2]*r[3+k]/(Math.sqrt(Math.pow(i-r[0],2)+Math.pow(j-r[1],2))+1);if(c[k]>255)c[k]=255;}}o.setRGB(i,j,new java.awt.Color(c[0],c[1],c[2]).getRGB());}javax.imageio.ImageIO.write(o,"png",new java.io.File("o.png"));}int[]s(String s){String[]a=s.split(" ");int[]r=new int[a.length];for(int i=0;i<a.length;i++)r[i]=Integer.valueOf(a[i]);return r;}}

아래 입력을 사용하여 태양계의 다소 현실적인 모델을 만들 수 있습니다 (일부 행성의 크기는 틀리지 만 거리는 정확해야합니다). 토성에 반지를 주려고했지만 작동하지 않았습니다 ... 소스

1950 50
-15 25 25255255 0
39 25 1 2500 0
55 25 3255140 0
68 25 40191255
92 25 2 2500 0
269 ​​25 102452227979
475 25 7245245220
942 25 6 0250150
1464 25 6 0 255
1920 25 1 255245238

명왕성을 가진 태양계

멋지게 보이지 않는 Full HD 사진 ... 누군가 그것을 향상시킬 수 있다면 기쁠 것입니다!


15
태양계 +1 명왕성을 떠난 -1 (현재 우리는 실제 색상과 크기를 알고 있음)
Optimizer

1
또한 풀 1080p 벽지가 연결되어 있으면 정말 좋을 것입니다 :)
Optimizer

@Optimizer 내가 명왕성을 추가;) 내가 벽지에 대해 무엇을 할 수 있는지
보자

1
@ Sp3000 Ups, 명왕성을 추가했을 때의 강도를 잊어 버렸습니다
CommonGuy

2
토성이 고리를 가진 유일한 행성은 아닙니다. 고리가 작동하면 천왕성에도 고리를 추가해야합니다.
mbomb007

20

배쉬, 147145 바이트

ImageMagick은 이미지를 조작하는 데 사용됩니다. 유클리드 거리가 사용됩니다.

read w h
o=o.png
convert -size $w\x$h canvas:black $o
while read x y i r g b
do
convert $o -fx "u+$i*rgb($r,$g,$b)/(hypot(i-$x,j-$y)+1)" $o
done

로 바이트를 저장할 수 있습니다 $w\x$h.
deltab

...와 다른 하나 o=o.png.
deltab

16

파이썬 3, 189 바이트

나는 프로 골퍼에 대한 아무도 모른다. 그러나 여기에 간다.

  • 입력은 PPM 형식 에서 왔다 stdin갔다 합니다 .stdout
  • 다음과 같이 실행하십시오. python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm

먼저 맨하탄 거리 :

import sys
(w,h),*S=[list(map(int,l.split()))for l in sys.stdin]
print('P3',w,h,255,*(min(int(sum((I*C[z%3]/(abs(X-z//3%h)+abs(Y-z//3//h)+1))for
X,Y,I,*C in S)),255)for z in range(h*w*3)))

둘째, 유클리드 거리 :

import sys
(w,h),*S=[list(map(int,l.split()))for l in sys.stdin]
print('P3',w,h,255,*(min(int(sum((I*C[z%3]/(abs(X-z//3%h+(Y-z//3//h)*1j)+1))for
X,Y,I,*C in S)),255)for z in range(h*w*3)))

대신 정수 나누기를 사용하여 4 바이트를 절약 할 수 int()있으며 실제로 원래 이미지가하는 것처럼 보입니다. 엄격히 정확하지 않은 별빛의 어두운 가장자리에서 약간의 줄무늬를 간신히 만들 수 있습니다. 암호. 그러나이 코드는 이미지가 아니라 설명을 따릅니다.

ungolfed 버전과 다른 사람들이 지적했거나 나 자신을 우연히 발견 한 많은 최적화 이전의 내 원래 골프는 이 요지에 있습니다.

편집 : 나는 하나의 (또는 ) 기능 으로 이동 for x하여 7 바이트를 절약 했지만 매우 긴 줄을 가진 PNM 파일을 생성하므로 문제가 발생하거나 발생하지 않을 수 있습니다.for yprinto

편집 2 : Maltysen은 20 바이트를 더 절약했습니다. 감사!

다시 편집 : 이제 하나만 print있으므로 o별칭은 책임이 아니라 저축입니다. 4 바이트 더 떨어져 있습니다.

좀 더 편집하십시오 : Sp3000은 2 바이트를 더 절약했습니다. 한편, 앨리어싱 mapm읽기 쉽 (!)의 이익 때문에, 아무것도 저장하지 않은 나는 다시 확장했습니다. 이제 2 8 바이트 의 멋진 라운드 입니다.

마지막 (?) 편집 : 이제 유클리드 거리 지원을 통해 복잡한 숫자를 제거함으로써 정확히 같은 바이트 수로 수행했습니다!

편집, 할리우드 재부팅 : Sp3000의 다음 제안은 5 바이트를 중단했습니다.

편집의 바보라는 이름의 속편 : 6 바이트가 떨어져 손질, Maltysen이 SP3000은 ... 다음 반복 때까지 내가 이해하지 않았다고했다 제안 덕분에 다른 8 바이트 %학대. 그리고 채팅에서 이야기하는 것은 놀라운 일을 시작했습니다.2126 바이트 나는 겸손합니다.


@ Maltysen : 아주 그렇습니다. 20 바이트가 절약되었습니다!
Tim Pederick

좀 더 : EOFs로 복잡한 sys.stdin 물건 대신 사용할 수 있습니다iter() 센티넬 값과 함께 : docs.python.org/2/library/functions.html#iter as 확장 을 풀고 같은 줄에 iter(raw_input,'')넣으십시오 w,h,S.
Maltysen

@ Maltysen : 그게 효과가 있는지 확실하지 않습니다. 나는 이미 거의 정확히 그 일을하고 있었지만 입력 파일에 빈 줄이 없으며 도전으로 인해 하나를 추가 할 수 있는지 확실하지 않기 때문에 블록이 EOFError필요합니다 try. 아니면 뭔가 빠졌습니까?
Tim Pederick

나는 당신이 센티넬 가치있는 것이라면 빈 줄로 끝나고 파일을 공급하는 것만으로 끝날 수 있다고 생각합니다. 그렇습니다. 파일은 작동하지 않습니다.
Maltysen

@ Sp3000 : 놀랍게도 그래! 나는 그것이 stdin반복자가 아니라고 불평 할 것으로 기대했다 .
Tim Pederick

10

C ++, 272 바이트

#include<png.hpp>
#define G(a)i>>C;for(x=0;x<w*h;++x){auto&p=img[x%h][x/h];c=p.a+I*C/(abs(x/h-X)+abs(x%h-Y)+1);p.a=c>255?255:c;}
auto&i=std::cin;main(){int w,h,x,X,Y,I,c,C;i>>w>>h;png::image<png::rgb_pixel>img(w,h);while(i>>X>>Y>>I){G(red)G(green)G(blue)}img.write("a");}

관대 한 C ++ 11 컴파일러 (GCC 4.9.2는 약간 불쾌합니다)와 png ++ 라이브러리가 필요합니다 libpng. 맨하탄 거리가 사용되었습니다. 를 입력 stdin하고 PNG 형식으로 현재 디렉토리에서 "a"라는 파일로 출력합니다.

예 D :

여기에 이미지 설명을 입력하십시오


여기에 이미지 설명을 입력하십시오


여기에 이미지 설명을 입력하십시오


1
나는 PCG이미지를 좋아한다 :) (그러나 PPCG내가 선호하는 약어이다.))
Calvin 's Hobbies

8

파이썬 2, 240 232 228 바이트

from PIL.Image import*
def f(S):
 L=map(int,S.split());t=a,b=L[:2];I=new("RGB",t)
 for k in range(a*b):I.load()[k/a,k%a]=tuple(sum(x[2]*x[c]/(abs(x[0]-k/a)-~abs(x[1]-k%a))for x in zip(*[iter(L[2:])]*6))for c in(3,4,5))
 I.show()

맨해튼 거리를 사용합니다. 이것은 아마도 Python 3에서 더 짧을 지 모르지만 최근에 Python 패키지를 엉망으로 만들었고 Pillow를 다시 설치하는 데 문제가 있습니다. PPM은 더 짧을 수도 있지만 PIL을 좋아합니다.

재미있게, 나는 L * a * b * 색 공간 에서와 같이 알고리즘을 적용하려고 시도했는데 , 더 나은 색 혼합 (특히 예제 B)을 줄 것이라고 생각했습니다. 불행히도 Calvin의 알고리즘을 사용하면 채널이 최대 값을 넘어갈 수 있으므로 이미지가 내가 바라는 것보다 조금 덜 멋지게 보입니다 ...

여기에 이미지 설명을 입력하십시오


6

Mathematica, 146 바이트

Image@Table[Total[#3{##4}/255&@@@{##2}/(1+#~ManhattanDistance~{x,y}&/@({#1,#2}&@@@{##2}))],{y,0,Last@#-1},{x,0,#&@@#-1}]&@@#~ImportString~"Table"&

문자열을 취하는 순수한 함수. 적당한 시간 내에 실행하려면 1in 1+#~ManhattanDistance...1.; 이것은 기호 대신 숫자 계산을 강제합니다.

언 골프 드 :

Image[
    Table[
        Total[
        (#3 * {##4} / 255 & @@@ {##2})
            / (1 + ManhattanDistance[#, {x, y}]& /@ ({#1, #2}& @@@ {##2}) )
        ], {y, 0, Last[#]-1}, {x, 0, First[#]-1}
    ] (* Header is #, data is {##2} *)
]& @@ ImportString[#, "Table"]&

6

파이썬 2, 287 251 바이트

이미지를 생성하는 데 사용한 원래 코드의 골프 버전입니다. 아마 나보다 더 나은 골퍼가 더 골프를 쳤을 수도 있습니다. 전체 입력 문자열을받는 함수입니다. PIL이미지 모듈로 이미지 처리가 완료되었습니다 . 맨해튼 거리를 사용합니다.

from PIL import Image
def S(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1.+abs(I[i]-z%w)+abs(I[i+1]-z/w))for i in r(2,len(I),6)))for j in r(3))
 M.show()

유클리드 거리를 사용하면 5 바이트 (256 바이트) 더 길어집니다.

from PIL import Image
def O(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1+((I[i]-z%w)**2+(I[i+1]-z/w)**2)**.5)for i in r(2,len(I),6)))for j in r(3))
 M.show()

다음은 거리 측정법 모두에 대해 질문 A에서 E까지의 예제를 실행하는 완전한 테스트 스위트입니다.

from PIL import Image
def S(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1.+abs(I[i]-z%w)+abs(I[i+1]-z/w))for i in r(2,len(I),6)))for j in r(3))
 M.show()

def O(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1+((I[i]-z%w)**2+(I[i+1]-z/w)**2)**.5)for i in r(2,len(I),6)))for j in r(3))
 M.show()

A = """400 150
-10 30 100 255 128 0"""
B = """200 200
100 100 10 255 255 255
20 20 40 255 0 0
180 20 40 255 255 0
180 180 40 0 255 0
20 180 40 0 0 255"""
C = """400 400
123 231 10 206 119 85
358 316 27 170 47 99
95 317 3 202 42 78
251 269 17 142 150 153
43 120 3 145 75 61
109 376 6 230 231 52
331 78 21 31 81 126
150 330 21 8 142 23
69 155 11 142 251 199
218 335 7 183 248 241
204 237 13 112 253 34
342 89 18 140 11 123"""
D = """400 400
123 231 5 206 119 85
358 316 5 170 47 99
95 317 5 202 42 78
251 269 5 142 150 153
43 120 5 145 75 61
109 376 5 230 231 52
331 78 5 31 81 126
150 330 5 8 142 23
69 155 5 142 251 199
218 335 5 183 248 241
204 237 5 112 253 34
342 89 5 140 11 123"""
E = """100 1"""
for i in (A, B, C, D, E):
    S(i) #S for Star
    O(i) #O for Orb

그들은 모두 구별 할 수없는 것처럼 보입니다. 큰 것이 실행 되려면 몇 초가 걸릴 수 있습니다.


난 당신이 변경하여 바이트의 무리를 절약 할 수 있다고 믿는 for x in r(I[0]):...for y in r(I[1]):로 변경하여 for x in r(I[0]*I[1]):. 그런 다음 1에 의해 아래로 내의 모든 들여 쓰기 수준을, 그리고 대체 할 수 xx/I[1]y함께 y%I[1].
Kade

from PIL import Imagefrom PIL import*
sagiksp

6

C, 247 바이트

이길 수는 없지만 C에서 골프를 좋아합니다. 외부 이미지 라이브러리를 사용하지 않고 PPM 형식의 표준 출력으로 출력합니다. stdin에 입력을받습니다. 골퍼를 위해 맨해튼 거리를 사용합니다.

j,w,h,k,*b,t[6];main(){scanf("%d %d",&w,&h);b=calloc(w*h,24);for(;~scanf("%d",t+j++%6);)for(k=0;j%6?0:k<3*w*h;k++)b[k]=fmin(b[k]+t[2]*t[3+k%3]/(abs(k/3%w-*t)+abs(k/3/w-t[1])+1),255);printf("P6\n%d %d\n255\n",w,h);for(k=0;k<3*w*h;putchar(b[k++]));}

유클리드 거리 변형 (257 바이트)은 다음과 같습니다.

j,w,h,k,*b,t[6];main(){scanf("%d %d",&w,&h);b=calloc(w*h,24);for(;~scanf("%d",t+j++%6);)for(k=0;j%6?0:k<3*w*h;k++)b[k]=fmin(b[k]+t[2]*t[3+k%3]/(sqrt(pow(k/3%w-*t,2)+pow(k/3/w-t[1],2))+1),255);printf("P6\n%d %d\n255\n",w,h);for(k=0;k<3*w*h;putchar(b[k++]));}

6

CJam, 86 바이트

q~]"P3 "\_2>:T;2<_S*" 255 "@:,~\m*{(+0a3*T6/{_2<3$.-:z~+)d\2>(f*\f/.+}/:i255fe<\;S*S}/

이것은 골프 언어에는 다소 길어 보일 수 있지만 지금까지 게시 된 솔루션 중 이미지 출력 기능을 사용하지 않는 것이 가장 짧습니다. ASCII 형식의 PPM 파일이 생성됩니다. 아래 이미지는 김프를 사용하여 PPM에서 PNG로 변환되었습니다.

온라인 CJam 인터프리터에서 코드를 실행하지 않는 것이 좋습니다. 전체 크기 이미지에는 적합하지 않습니다. 메모리 사용으로 인해 브라우저가 잠겼습니다. 오프라인 버전으로 두 번째 범위에서 400x400 이미지를 완성합니다.

실시 예 C

설명:

q~      Read and parse input.
]       Wrap it in an array.
"P3 "   Output start of PPM header.
\       Swap input to top.
_2>     Slice off first two values, leaving the star descriptors.
:T;     Store star descriptors in variable T.
2<      Get first two values in input, which is the image size.
_S*     Leave a copy of the size in the output for the PPM header.
" 255 " Rest of PPM header, range of color values.
@       Pop sizes to top.
:,      Expand sizes to ranges.
~       Unwrap size ranges into separate stack elements.
\       Swap ranges, since we need x-range second for Cartesian product.
m*      Generate all coordinate pairs with Cartesian product.
{       Loop over pixel coordinate pairs.
  (+      Swap values in coordinate pair to get x-coordinate first again.
  0a3*    Generate [0 0 0] array. Will be used to sum up colors from stars.
  T       Get list of stars.
  6/      Split into sub-lists with 6 values for each star.
  {       Loop over the stars.
    _2<     Get the first two values (position) of the star.
    3$      Pull current pixel coordinates to top of stack.
    .-      Subtract pixel coordinates from star position.
    :z      Absolute value of difference.
    ~+      Unpack differences and add them to get Manhattan distance.
    )d      Add 1 and convert to double to get denominator of formula.
    \       Swap star values to top.
    2>      Slice off first two values, leaving intensity and color.
    (       Pop off intensity.
    f*      Multiply it with color values.
    \       Swap denominator to top.
    f/      Perform division of color components by denominator.
    .+      Add it to sum of colors.
  }/      End loop over stars.
  :i      Convert double values for colors to integer.
  255fe<  Cap color components at 255.
  \;      Swap pixel coordinate to top and pop it.
  S*S     Join color components with space, and add another space.
}/      End loop over coordinate pairs.

5

C # 718 바이트

나는 C #이 골프에 끔찍하다는 것을 알고 있지만 718 바이트에서의 시도는 다음과 같습니다.

namespace System{using Collections.Generic;using Drawing;using Linq;using O=Convert;class P{int j,i;List<S> s=new List<S>();Image G(string t){var l=t.Replace("\r","").Split('\n');var w=O.ToInt32(l[0].Split(' ')[0]);var h=O.ToInt32(l[0].Split(' ')[1]);for(i=1;i < l.Length;i++){var p=l[i].Split(' ');s.Add(new S{X=O.ToInt32(p[0]),Y=O.ToInt32(p[1]),I=O.ToSingle(p[2]),R=O.ToByte(p[3]),G=O.ToByte(p[4]),B=O.ToByte(p[5])});}var b=new Bitmap(w,h);for(j=0;j<h;j++)for(i=0;i<w;i++)b.SetPixel(i,j,C());return b;}Color C(){return Color.FromArgb(X(x=>x.R),X(x=>x.G),X(x=>x.B));}int X(Func<S,float>f){return(int)Math.Min(s.Sum(x=>x.I*f(x)/(Math.Sqrt((x.X-i)*(x.X-i)+(x.Y-j)*(x.Y-j))+1)),255);}class S{public float X,Y,R,G,B,I;}}}

누구든지 단축 제안이 있으면 언제든지 알려주십시오.


Color.FromArgb (int, int, int) 과부하를 놓쳤습니다. 4 바이트를 절약 할 수 있습니다.
Melvyn

또한 .Count () 대신 .Length를 사용해야합니다. 1 바이트가 적고 더 효율적입니다. 그리고 원하는 경우 C # 6의 새로운 식 본문 멤버를 사용하여 더 많은 바이트를 절약 할 수 있습니다.
Melvyn

길이와 과부하 모두에 대한 좋은 점이 이제 조정되었습니다. 그리고 표현 몸의 구성원을 조사합니다. 전에는 본 적이 없습니다. 감사합니다
Allan Harper

4

파이썬, 259 바이트

마지막으로 완료! 내가 시도한 첫 번째 코드 골프는 Python을 사용하기로 결정하고 맨해튼 거리와 함께 갔다. 반복자를 도와 주신 Maltysen에게 소리를 지르면 전체 크기가 거의 절반으로 줄었습니다!

from PIL.Image import new
N,*s=[list(map(int,i.split()))for i in iter(input,'')]
q,m=new("RGB",(N[0],N[1])),[]
[m.append(tuple(sum(k[2]*k[i]//(abs(k[1]-x)+abs(k[0]-y)+1)for k in s)for i in(3,4,5)))for x in range(N[1])for y in range(N[0])]
q.show(q.putdata(m))

나는 그들 모두를 위해 하나의 계산을하는 방법이 있어야한다는 것을 알고 있지만, 나는 정직하게 파이썬을 잘 모른다.
Nicolás Siplis


귀하의 여전히 제대로 작동을 전환 할 필요가 없습니다 k[0]k[1]계산에.
Maltysen

왜 내 기계에서 작동하는지 이해하기 위해 10 분 정도 걸렸습니다. 반전 시키지만 여기서 변경하는 것을 잊었습니다.
니콜라스시 플리스

2

CJam, 70 바이트

"P3"l_~\:W*255\,[q~]6Te]6/f{\[Wmd\]f{.-Z/~\)\~mh)/f*}:.+{i255e<}/}~]S*

유클리드 거리, ASCII PPM 출력. 온라인으로 사용해보십시오

몇 바이트를 더 짜낼 수는 있지만 너무 많은 시간을 보내고 싶지 않습니다.

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