Màu sắc trong những vì sao của chúng ta


90

Viết chương trình lấy chuỗi hoặc tệp văn bản có dòng đầu tiên có dạng

width height

và mỗi dòng tiếp theo có dạng

x y intensity red green blue

Ở đâu:

  • widthheightcó thể là bất kỳ số nguyên dương nào.
  • xycó thể là bất kỳ số nguyên nào.
  • intensity có thể là bất kỳ số nguyên không âm.
  • red, greenbluecó thể là bất kỳ số nguyên nào từ 0 đến 255.

Chương trình của bạn phải xuất hình ảnh truecolor theo bất kỳ định dạng tệp hình ảnh lossless phổ biến nào có kích thước widthbằng height. Mỗi x y intensity red green bluedòng đại diện cho một ngôi sao hoặc quả cầu đầy màu sắc phải được vẽ trên hình ảnh. Có thể có bất kỳ số sao nào để vẽ, bao gồm 0. Bạn có thể giả sử chuỗi hoặc tệp có dòng mới.

Thuật toán để vẽ hình ảnh như sau, mặc dù bạn có thể thực hiện nó theo bất kỳ cách nào bạn muốn miễn là kết quả giống hệt nhau:

Với mỗi pixel ( X , Y ) trong ảnh (trong đó X là 0 ở cạnh ngoài cùng bên trái và chiều rộng-1 ở cạnh ngoài cùng bên phải và Y là 0 ở cạnh trên và chiều cao-1 ở cạnh dưới), kênh màu C ϵ { đỏ , lục , lam } (một giá trị được ghim từ 0 đến 255) được đưa ra theo phương trình:

phương trình kênh màu

Trong đó hàm distkhoảng cách Euclide :

Phương trình khoảng cách Euclide

Hoặc khoảng cách Manhattan :

Phương trình khoảng cách Manhattan

Chọn bất kỳ chức năng khoảng cách nào bạn thích, dựa trên khả năng chơi gôn hoặc thẩm mỹ.

Mỗi dòng trong đầu vào bên cạnh đầu tiên là một phần tử của tập hợp Stars . Vì vậy, ví dụ, S x đại diện cho xgiá trị trên một trong những dòng đầu vào, và S C đại diện cho một trong hai red, greenhoặc blue, tùy thuộc vào kênh màu hiện đang được tính toán.

Ví dụ

Ví dụ A

Nếu đầu vào là

400 150
-10 30 100 255 128 0

đầu ra phải là

Ví dụ A, Euclide

nếu bạn đang sử dụng khoảng cách Euclide và

Ví dụ A, Manhattan

nếu bạn đang sử dụng khoảng cách Manhattan.

Ví dụ B

Nếu đầu vào là

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ác đầu ra tương ứng cho khoảng cách Euclide và Manhattan phải là

Ví dụ B, EuclideVí dụ B, Manhattan.

Ví dụ C

Nếu đầu vào là

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

đầu ra phải là

Ví dụ C, Euclide

nếu bạn đang sử dụng khoảng cách Euclide và

Ví dụ C, Manhattan

nếu bạn đang sử dụng khoảng cách Manhattan.

Ví dụ D

Nếu đầu vào là

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

đầu ra phải là

Ví dụ D, Euclide

nếu bạn đang sử dụng khoảng cách Euclide và

Ví dụ D, Manhattan

nếu bạn đang sử dụng khoảng cách Manhattan.

Ví dụ E

Nếu đầu vào là

100 1

thì đầu ra phải là một hình ảnh rộng 100 pixel, cao 1 pixel, hoàn toàn màu đen.

Ghi chú

  • Lấy chuỗi đầu vào hoặc tên của tệp văn bản chứa nó từ stdin hoặc dòng lệnh hoặc bạn có thể viết một hàm có trong một chuỗi.
  • "Xuất" hình ảnh có nghĩa là:
    • Lưu nó vào một tập tin với tên của sự lựa chọn của bạn.
    • In dữ liệu tệp hình ảnh thô sang thiết bị xuất chuẩn.
    • Hiển thị hình ảnh, chẳng hạn như với PIL 's image.show().
  • Tôi sẽ không kiểm tra xem hình ảnh của bạn có hoàn hảo về pixel hay không (Stack Exchange sẽ nén hình ảnh một cách dễ dàng) nhưng tôi sẽ rất nghi ngờ nếu tôi có thể thấy bất kỳ sự khác biệt nào.
  • Bạn có thể sử dụng các thư viện đồ họa / hình ảnh.

Chiến thắng

Đệ trình ngắn nhất tính bằng byte thắng. Trong trường hợp quan hệ, trình sớm nhất sẽ thắng.

Phần thưởng thú vị: Cung cấp đầu vào cho hình ảnh đầu ra thực sự ngoạn mục.


38
+1 Wow. Điều này là tuyệt đẹp. (Và một thời điểm thích hợp để đăng bài, khi chúng ta nghe tin từ một tàu vũ trụ New Horizons khỏe mạnh!)
BrainSteel

Là đầu vào phải ở định dạng được phân tách không gian đó, hoặc nó có thể được phân tách bằng dấu phẩy? Dù sao, +1.
Maltysen

1
@Maltysen Không gian tách biệt. (Tôi biết điều đó keo kiệt nhưng dễ hơn là cho phép hàng tá biến thể đầu vào.)
Sở thích của Calvin

4
Tôi không thể quyết định xem quả cầu hay ngôi sao đẹp hơn.
trichoplax

Để hoàn thiện pixel, bạn có thể so sánh hàm băm của bitmap
Tobias Kienzler 16/07/2015

Câu trả lời:


26

Pyth - 46 byte

Điều này thật thú vị! Cuối cùng tôi đã sử dụng các tính năng I / O hình ảnh của Pyth. Có phải khoảng cách euclid vì tính golf, mặc dù manhattan chỉ là một thay đổi ngắn.

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

Điều này chỉ lặp qua tất cả các pixel với công thức mặc dù nó ngưng tụ vòng pixel thành một vòng và sử dụng divmodvì Pyth chỉ hỗ trợ 3 bản đồ lồng nhau và các phép tính mất hai (một cho RGB và một cho các ngôi sao).

Lưu hình ảnh như o.png. Khá chậm, thực hiện 2 bài kiểm tra đầu tiên trong <2 phút, nhưng 2 bài kiểm tra khác thực hiện theo thứ tự nửa giờ.

Có một lỗi trong .wđó không ai nhận thấy vì không ai sử dụng nó;) nhưng tôi đã đưa ra yêu cầu kéo vì vậy hãy sử dụng nĩa của mình để kiểm tra nếu không sớm được hợp nhất. Sáp nhập!

Ví dụ đầu ra

Ví dụ A

Ví dụ A

Ví dụ B

Ví dụ B

Ví dụ C

Ví dụ C

Ví dụ D

Ví dụ D


7
Wow, không biết Pyth có thể làm điều đó. Một ngày nào đó chúng tôi có thể kết thúc việc viết phần mềm kinh doanh tại Pyth. Nó ít mã hơn để viết, vì vậy nó sẽ nhanh hơn và dễ dàng hơn để cấu trúc lại. : D
Cristian Lupascu

7
@ w0lf "thời gian lập trình viên quan trọng hơn thời gian thực hiện" và tất cả chúng ta đều biết rằng Pyth giúp giảm thời gian lập trình viên :) Hình ảnh I / O được thêm vào gần đây sau khi Pyth bị loại khỏi thử thách đầu ra đồ họa. Nó sử dụng Gối trong nội bộ.
Maltysen

11
@Nit Hoàn toàn. Nó cũng không liên quan gì đến việc viết nhanh như thế nào. Nhận xét trước đây của tôi là một trò đùa.
Cristian Lupascu

2
Các bạn đã quên một điều quan trọng - việc gỡ lỗi cũng dễ dàng hơn, vì mã ít hơn;)
Trình tối ưu hóa

14
Bằng cách giảm thời gian lập trình viên, bạn có nghĩa là "Họ đang chơi golf mã với pyth và vì vậy có ít thời gian hơn để viết mã" thực "?

42

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

Chỉnh sửa: rút ngắn mã rất nhiều bằng cách áp dụng các đề xuất tuyệt vời của wolfhammer .

Kiểm tra

Lưu ý: Đợi vài giây để đoạn trích bên dưới hiển thị (mất ~ 4 giây trên máy của tôi).

Bạn cũng có thể chạy nó trong JSFiddle .

Phần thưởng: Blue Eclipse

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

Bạn cũng có thể chạy nó trong JSFiddle .

Sự miêu tả

Đây là một triển khai canvas JavaScript + HTML5 đơn giản: một hàm lấy đối số chuỗi (không có dấu cách / dòng mới) và hiển thị đầu ra trong DOM. Nó sử dụng khoảng cách Euclide.

Đây là mã có thể đọc được:

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

Tôi thích cách halos dán lại với nhau trong Blue Eclipse, bạn có thể thêm phong cách manhatan không?
PTwr

1
@PTwr Chắc chắn, đây là: jsfiddle.net/pjLnazw1
Cristian Lupascu

Tuyệt vời! (7 ngày nữa để đi ... ugh)
PTwr

@ w0lf Bạn có thể loại bỏ một số byte khỏi chức năng của mình bằng cách kết hợp các trình lặp x và y. jsfiddle
wolfhammer 20/07/2015

@wolfhammer Wow, giờ chỉ là "vài byte", nó đã được cải thiện rất nhiều. Tôi sẽ xem xét điều đó sau, vì tôi tin rằng có điều gì đó cần được khắc phục về việc lập chỉ mục (đối với hình ảnh mẫu 2, 3 và 4 pixel ở bên trái dường như bao quanh). Cảm ơn!
Cristian Lupascu

26

Java - 627 byte

Java thực sự là một trong những ngôn ngữ chơi golf tốt nhất :)

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

Sử dụng đầu vào bên dưới, bạn có thể tạo một mô hình hơi thực tế của hệ mặt trời của chúng tôi (kích thước của một số hành tinh là sai, nhưng khoảng cách giữa chúng phải chính xác). Tôi đã cố gắng trao nhẫn cho saturn, nhưng nó không hoạt động ... Nguồn

1950 50
-15 25 25 255 255 0
39 25 1 255 0 0
55 25 3 255 140 0
68 25 4 0 191 255
92 25 2 255 0 0
269 ​​25 10 245 222 179
475 25 7 245 245 220
942 25 6 0 250 150
1464 25 6 0 0 255
1920 25 1 255 245 238

Hệ mặt trời với sao Diêm Vương

Hình ảnh Full HD , trông không đẹp lắm ... Sẽ rất vui nếu ai đó có thể cải thiện nó!


15
+1 cho Hệ mặt trời. -1 vì đã rời khỏi Sao Diêm Vương (bây giờ chúng ta thậm chí còn biết màu sắc và kích thước thật của nó)
Trình tối ưu hóa

1
Ngoài ra, sẽ rất tuyệt nếu hình nền 1080p đầy đủ được liên kết :)
Trình tối ưu hóa

@Optimizer Tôi đã thêm sao Diêm Vương;) Hãy xem những gì tôi có thể làm về hình nền
CommonGuy

1
@ Sp3000 Ups, quên cường độ khi tôi thêm pluto
CommonGuy

2
Lưu ý rằng Sao Thổ không phải là hành tinh duy nhất có nhẫn. Nếu bạn nhận được nhẫn để làm việc, bạn cũng nên thêm chúng vào Uranus.
mbomb007

20

Bash, 147 145 byte

ImageMagick được sử dụng để thao tác với hình ảnh. Khoảng cách Euclide được sử dụng.

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

Bạn có thể lưu một byte với $w\x$h.
deltab 18/07/2015

... và một cái khác với o=o.png.
deltab 18/07/2015

16

Python 3, 189 byte

Tôi không phải là ý tưởng của một tay golf chuyên gia, nhưng rồi đây.

  • Đầu vào đến từ stdinvà đi đến stdoutđịnh dạng PPM .
  • Chạy nó như vậy: python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm

Đầu tiên, khoảng cách Manhattan:

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

Và thứ hai, khoảng cách Euclide:

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

Tôi có thể tiết kiệm bốn byte bằng cách sử dụng phép chia số nguyên thay vì int()và trên thực tế, đó dường như là những gì hình ảnh gốc làm - bạn chỉ có thể tạo ra một số cảnh trong rìa tối của ánh sáng sao không có mặt chính xác mã. Mặc dù vậy, mã này tuân theo mô tả, không phải hình ảnh.

Phiên bản không có bản quyền, và chơi golf ban đầu của tôi trước nhiều sự tối ưu mà người khác chỉ ra hoặc tôi tự vấp ngã, nằm trong ý chính này .

EDIT: Tôi đã lưu 7 byte bằng cách di chuyển for xfor yvào một hàm print(hoặc o), nhưng điều này tạo ra một tệp PNM với một dòng rất dài, có thể hoặc không gây ra một số vấn đề.

EDIT 2: Maltysen đã tiết kiệm cho tôi thêm 20 byte. Cảm ơn!

EDIT một lần nữa: Bây giờ chỉ có một print, obí danh là trách nhiệm, không phải là tiết kiệm. Tắt thêm 4 byte.

EDIT thêm một số: Sp3000 tiết kiệm cho tôi thêm 2 byte. Trong khi đó, bí danh mapđể mkhông tiết kiệm bất cứ thứ gì, vì vậy vì lợi ích của khả năng đọc (!) Tôi đã mở rộng nó một lần nữa. Bây giờ là một vòng 2 8 byte đẹp.

EDIT lần cuối (?): Bây giờ với hỗ trợ khoảng cách Euclide - và bằng cách lạm dụng các số phức, tôi đã thực hiện nó với cùng một số byte!

EDIT, khởi động lại Hollywood: Đề xuất tiếp theo của Sp3000 đã loại bỏ 5 byte.

EDIT thì ngớ ngẩn tên phần tiếp theo: 6 byte tỉa xén, nhờ vào một gợi ý Maltysen làm mà tôi không nắm bắt cho đến khi Sp3000 lặp đi lặp lại nó ... sau đó một 8 byte từ %lạm dụng. Và nói chuyện trong trò chuyện đã đánh gục một hiện tượng2126 byte. Tôi khiêm tốn.


@Maltysen: Hoàn toàn đúng. Đã lưu 20 byte!
Tim Pederick

một số chi tiết: thay vì những thứ sys.stdin phức tạp với EOFs bạn có thể sử dụng iter()với các giá trị trọng điểm: docs.python.org/2/library/functions.html#iter như iter(raw_input,''), cũng đặt w,h,Strên cùng một dòng với giải nén mở rộng.
Maltysen

@Maltysen: Tôi không chắc nó sẽ hoạt động. Tôi đã làm gần như chính xác điều đó rồi, nhưng nó đã đạt EOFError(và vì vậy tôi cần một trykhối), vì không có dòng trống nào trong tệp đầu vào và tôi không chắc thử thách cho phép tôi thêm một khối. Hay tôi đang thiếu một cái gì đó?
Tim Pederick

Tôi nghĩ rằng nếu bạn là thứ có giá trị sentinel, bạn có thể chấm dứt bằng một dòng trống so với việc cho tập tin vào, mặc dù, vâng, điều tập tin sẽ không hoạt động.
Maltysen

@ Sp3000: Đáng ngạc nhiên, vâng! Tôi đã mong nó phàn nàn rằng đó stdinkhông phải là một trình vòng lặp.
Tim Pederick

10

C ++, 272 byte

#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ần một trình biên dịch C ++ 11 nhẹ nhàng (GCC 4.9.2 chỉ hơi khó chịu) và thư viện png ++ , bản thân nó yêu cầu libpng. Manhattan khoảng cách sử dụng. Đưa đầu vào vào stdin, xuất ra một tệp có tên "a" trong thư mục hiện tại ở định dạng PNG.

Ví dụ D:

nhập mô tả hình ảnh ở đây


nhập mô tả hình ảnh ở đây


nhập mô tả hình ảnh ở đây


1
Tôi thích PCGhình ảnh :) (Mặc dù PPCGlà tên viết tắt ưa thích của tôi;))
Sở thích của Calvin

8

Con trăn 2, 240 232 228 byte

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

Sử dụng khoảng cách Manhattan. Điều này có thể thậm chí còn ngắn hơn trong Python 3, nhưng tôi đã làm hỏng các gói Python của mình gần đây và tôi gặp sự cố khi cài đặt lại Gối. PPM có thể thậm chí còn ngắn hơn, nhưng tôi thích PIL.

Để giải trí, tôi đã thử áp dụng thuật toán như trong không gian màu L * a * b * , nghĩ rằng nó sẽ cho phép phối màu tốt hơn (đặc biệt là trong ví dụ B). Thật không may, thuật toán của Calvin cho phép các kênh vượt qua các giá trị tối đa của chúng, điều này làm cho hình ảnh trông kém tuyệt vời hơn tôi mong đợi ...

nhập mô tả hình ảnh ở đây


6

Toán học, 146 byte

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

Một hàm thuần túy lấy một chuỗi. Để chạy nó trong một khoảng thời gian hợp lý, thay thế 1trong1+#~ManhattanDistance... một1. ; điều này buộc tính toán số thay vì tượng trưng.

Ung dung:

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

Con trăn 2, 287 251 byte

Một phiên bản golf của mã gốc tôi đã sử dụng để tạo ra các hình ảnh. Có lẽ có thể chơi golf nhiều hơn một chút (bởi một người chơi golf giỏi hơn tôi). Đây là một hàm có trong chuỗi đầu vào đầy đủ. Xử lý hình ảnh được thực hiện với Mô-đun hình ảnh của PIL . Sử dụng khoảng cách Manhattan.

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

Sử dụng khoảng cách Euclide dài hơn 5 byte (256 byte):

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

Đây là bộ kiểm tra hoàn chỉnh chạy các ví dụ từ A đến E từ câu hỏi, cho cả hai số liệu khoảng cách:

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

Tất cả đều trông không thể phân biệt được. Những cái lớn hơn có thể mất vài giây để chạy.


Tôi tin rằng bạn có thể lưu một loạt byte bằng for x in r(I[0]):...for y in r(I[1]):cách thay đổi nó thành for x in r(I[0]*I[1]):. Sau đó, bạn có thể lấy mọi mức thụt lề trong vòng 1, và thay thế xbằng x/I[1]ybằng y%I[1].
Kade

Bạn có thể lưu 5 byte bằng cách thay thế from PIL import Imagethànhfrom PIL import*
sagiksp

6

C, 247 byte

Sẽ không giành chiến thắng, nhưng tôi thích chơi gôn ở C. Không có thư viện hình ảnh bên ngoài nào được sử dụng, xuất ra thiết bị xuất chuẩn ở định dạng PPM. Đưa đầu vào vào stdin. Sử dụng khoảng cách Manhattan cho golf.

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

Đây là biến thể khoảng cách Euclide (257 byte):

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 byte

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

Mặc dù điều này có vẻ hơi dài đối với ngôn ngữ chơi gôn, tôi tin rằng các giải pháp được đăng cho đến nay, đó là cách ngắn nhất không sử dụng chức năng xuất hình ảnh. Điều này tạo ra một tệp PPM ở dạng ASCII. Hình ảnh bên dưới được chuyển đổi từ PPM sang PNG bằng GIMP.

Tôi không khuyên bạn nên chạy mã trong trình thông dịch CJam trực tuyến. Ít nhất là không cho các hình ảnh kích thước đầy đủ. Trình duyệt của tôi bị khóa, rất có thể là do sử dụng bộ nhớ. Nó hoàn thành hình ảnh 400x400 trong phạm vi thứ hai với phiên bản ngoại tuyến.

Ví dụ C

Giải trình:

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 byte

Tôi nhận ra rằng c # rất tệ cho việc chơi gôn, nhưng đây là nỗ lực của tôi với 718 byte

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

Nếu bất cứ ai có bất kỳ đề nghị để rút ngắn nó, hãy cho tôi biết.


Bạn đã bỏ lỡ quá tải Color.FromArgb (int, int, int). Sẽ tiết kiệm được 4 byte ...
Melvyn

Ngoài ra, có lẽ bạn nên sử dụng .Lpm thay vì .Count (). ít hơn một byte và hiệu quả hơn Và nhân tiện, bạn có thể tiết kiệm được nhiều byte hơn bằng cách sử dụng các thành viên thân biểu thức mới của C # 6, nếu bạn sẵn sàng.
Melvyn

Điểm tốt về cả chiều dài và quá tải, điều chỉnh ngay bây giờ. Và nhìn vào các thành viên thể hiện. Không thấy những cái đó trước đây. Cảm ơn
Allan Harper

4

Python, 259 byte

Cuối cùng cũng xong! Mã golf đầu tiên tôi đã thử, quyết định sử dụng Python và đi với khoảng cách Manhattan. Hét lên Maltysen vì đã giúp tôi với các vòng lặp, giảm tổng kích thước xuống gần một nửa!

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

Tôi biết rằng phải có một cách để thực hiện một phép tính cho tất cả chúng, nhưng thật lòng tôi không biết rõ về Python.
Nicolás Siplis


Bạn vẫn không hoạt động bình thường, phải chuyển đổi k[0]k[1]tính toán.
Maltysen 16/07/2015

Mất 10 phút để nhận ra lý do tại sao nó hoạt động trên máy của tôi, hóa ra tôi đã đảo ngược chúng nhưng quên thay đổi nó ở đây.
Nicolás Siplis

2

CJam, 70 byte

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

Khoảng cách Euclide, đầu ra PPM ASCII. Dùng thử trực tuyến

Có thể siết thêm một vài byte, nhưng tôi không muốn mất quá nhiều thời gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.