Warna di Bintang Kita

90

Tulis program yang menggunakan string atau file teks yang baris pertamanya memiliki formulir

width height

dan setiap baris berikutnya memiliki formulir

x y intensity red green blue

dimana:

  • widthdan heightmungkin bilangan bulat positif.
  • xdan ymungkin bilangan bulat apa saja.
  • intensity mungkin bilangan bulat non-negatif.
  • red,, greendan bluedapat berupa bilangan bulat dari 0 hingga 255 inklusif.

Anda Program keharusan output truecolor gambar dalam format file gambar lossless umum yang dimensi widtholeh height. Setiap x y intensity red green bluegaris mewakili bintang atau bola warna-warni yang harus digambar pada gambar. Mungkin ada sejumlah bintang untuk digambar, termasuk 0. Anda dapat menganggap string atau file memiliki baris tambahan.

Algoritma untuk menggambar gambar adalah sebagai berikut, meskipun Anda dapat mengimplementasikannya dengan cara apa pun yang Anda suka asalkan hasilnya identik:

Untuk setiap piksel ( X , Y ) dalam gambar (di mana X adalah 0 di tepi paling kiri dan lebar-1 di tepi paling kanan, dan Y adalah 0 di tepi atas dan tinggi-1 di tepi bawah), saluran warna C ϵ { merah , hijau , biru } (nilai yang disematkan antara 0 hingga 255) diberikan oleh persamaan:

persamaan saluran warna

Di mana fungsi dist adalah jarak Euclidean :

Persamaan jarak Euclidean

Atau jarak Manhattan :

Persamaan jarak Manhattan

Pilih fungsi jarak mana saja yang Anda inginkan, berdasarkan golf atau estetika.

Setiap baris dalam input selain yang pertama adalah elemen dari set Bintang . Jadi, misalnya, S x mewakili xnilai pada salah satu jalur input, dan S C mewakili baik red, greenatau blue, tergantung pada channel warna saat ini sedang dihitung.

Contohnya

Contoh A

Jika inputnya

400 150
-10 30 100 255 128 0

output seharusnya

Contoh A, Euclidean

jika Anda menggunakan jarak Euclidean, dan

Contoh A, Manhattan

jika Anda menggunakan jarak Manhattan.

Contoh B

Jika inputnya

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

output masing-masing untuk jarak Euclidean dan Manhattan seharusnya

Contoh B, Euclideandan Contoh B, Manhattan.

Contoh C

Jika inputnya

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

output seharusnya

Contoh C, Euclidean

jika Anda menggunakan jarak Euclidean, dan

Contoh C, Manhattan

jika Anda menggunakan jarak Manhattan.

Contoh D

Jika inputnya

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

output seharusnya

Contoh D, Euclidean

jika Anda menggunakan jarak Euclidean, dan

Contoh D, Manhattan

jika Anda menggunakan jarak Manhattan.

Contoh E

Jika inputnya

100 1

maka outputnya harus selebar 100 pixel dengan tinggi gambar 1 pixel yang benar-benar hitam.

Catatan

  • Ambil string input atau nama file teks yang berisi itu dari stdin atau baris perintah, atau Anda dapat menulis fungsi yang mengambil string.
  • "Menghasilkan" gambar berarti:
    • Menyimpannya ke file dengan nama pilihan Anda.
    • Mencetak data file gambar mentah ke stdout.
    • Menampilkan gambar, seperti dengan PIL 's image.show().
  • Saya tidak akan memeriksa bahwa gambar Anda pixel sempurna (Stack Exchange kehilangan kompresi gambar), tetapi saya akan sangat curiga jika saya secara visual dapat membedakannya.
  • Anda dapat menggunakan perpustakaan grafik / gambar.

Kemenangan

Pengajuan terpendek dalam byte menang. Dalam hal ikatan, pengajuan yang paling awal menang.

Bonus Menyenangkan: Berikan input untuk gambar output yang benar-benar spektakuler.

Hobi Calvin
sumber
38
+1 Wow. Ini sangat cantik. (Dan waktu yang tepat untuk memposting, saat kami mendengar kabar dari pesawat ruang angkasa New Horizons yang sehat!)
BrainSteel
Apakah input harus dalam format yang dipisahkan ruang, atau bisakah dipisahkan dengan koma? Bagaimanapun, +1.
Maltysen
1
@Maltysen Space dipisahkan. (Saya tahu itu pelit tapi lebih mudah daripada membiarkan selusin varian input.)
Calvin's Hobbies
4
Saya tidak bisa memutuskan apakah bola atau bintang lebih indah.
trichoplax
Untuk kesempurnaan pixel, Anda dapat membandingkan hash bitmap
Tobias Kienzler

Jawaban:

26

Pyth - 46 byte

Ini sangat menyenangkan! Saya akhirnya harus menggunakan fitur I / O gambar Pyth. Apakah jarak euclidean karena golfiness, meskipun manhattan hanyalah perubahan singkat.

Krz7.wcmmsm/*@[email protected],<b2_.DdhKrR7.zU3*FKhK

Ini hanya loop melalui semua piksel dengan rumus meskipun itu mengembunkan loop piksel menjadi satu loop dan digunakan divmodkarena Pyth hanya mendukung 3 peta bersarang dan perhitungan mengambil dua (satu untuk RGB dan satu untuk bintang-bintang).

Menyimpan gambar sebagai o.png. Cukup lambat, lakukan 2 tes pertama dalam <2 mnt, tapi 2 tes lainnya hanya memakan waktu setengah jam.

Ada bug di .wmana tidak ada yang memperhatikan karena tidak ada yang menggunakannya;) tetapi saya memasukkan permintaan tarik jadi gunakan garpu saya untuk menguji apakah tidak segera bergabung. Digabung!

Contoh Keluaran

Contoh A

Contoh A

Contoh B

Contoh B

Contoh C

Contoh C

Contoh D

Contoh D

Maltysen
sumber
7
Wow, tidak tahu Pyth bisa melakukan itu. Suatu hari kita mungkin akhirnya menulis perangkat lunak bisnis di Pyth. Ini lebih sedikit kode untuk ditulis, jadi harus lebih cepat dan lebih mudah untuk refactor. : D
Cristian Lupascu
7
@ w0lf "waktu programmer lebih penting daripada waktu eksekusi" dan kita semua tahu bahwa Pyth membantu mengurangi waktu programmer :) Gambar I / O ditambahkan baru-baru ini setelah Pyth ditinggalkan dari tantangan output grafis. Ini menggunakan Bantal secara internal.
Maltysen
11
@Tidak Tentu. Ini juga tidak ada hubungannya dengan seberapa cepat menulis. Komentar saya sebelumnya adalah lelucon.
Cristian Lupascu
2
Kalian lupa satu hal penting - lebih mudah untuk debug juga, karena kodenya kurang;)
Pengoptimal
14
Dengan mengurangi waktu programmer yang Anda maksud "Mereka bermain golf kode dengan pyth dan jadi memiliki lebih sedikit waktu untuk menulis kode 'nyata'"?
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);}

Sunting: banyak kode yang disingkat dengan menerapkan saran mengagumkan wolfhammer .

Uji

Catatan: Tunggu beberapa detik agar cuplikan di bawah ini ditampilkan (butuh ~ 4 detik pada mesin saya).

Anda juga dapat menjalankannya di JSFiddle .

Bonus: Gerhana Biru

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

Anda juga dapat menjalankannya di JSFiddle .

Deskripsi

Ini adalah implementasi kanvas JavaScript + HTML5 langsung: sebuah fungsi yang mengambil argumen string (tanpa spasi / baris baru) dan menampilkan output dalam DOM. Ini menggunakan jarak Euclidean.

Ini kode yang bisa dibaca:

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);
};
Cristian Lupascu
sumber
Saya suka bagaimana lingkaran cahaya direkatkan bersama dalam Eclipse Biru, dapatkah Anda menambahkan gaya manhatan?
PTwr
1
@ PTw Tentu, ini dia: jsfiddle.net/pjLnazw1
Cristian
Luar biasa! (7 lebih lanjut ... ugh)
PTwr
@ w0lf Anda dapat mencukur beberapa byte dari fungsi Anda dengan menggabungkan iterator x dan y. jsfiddle
wolfhammer
@ Wolfolf Wow, itu sekarang hanya "beberapa byte", ini banyak perbaikan. Saya akan melihat nanti, karena saya percaya ada sesuatu yang harus diperbaiki tentang pengindeksan (untuk contoh gambar 2, 3 dan 4 piksel di sebelah kiri tampak membungkus). Terima kasih!
Cristian Lupascu
26

Java - 627 byte

Java memang salah satu bahasa golf terbaik :)

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

Dengan menggunakan input di bawah ini, Anda dapat membuat model tata surya kita yang agak realistis (ukuran beberapa planet salah, tetapi jarak di antara mereka harus akurat). Saya mencoba memberikan cincin kepada saturnus, tetapi tidak berhasil ... Sumber

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

Tata surya dengan pluto

Gambar Full HD , yang tidak terlihat hebat ... Senang jika seseorang dapat memperbaikinya!

CommonGuy
sumber
15
+1 untuk Tata Surya. -1 untuk meninggalkan Pluto (sekarang kita bahkan tahu warna dan ukuran aslinya)
Pengoptimal
1
Juga, alangkah baiknya jika wallpaper 1080p penuh dihubungkan :)
Pengoptimal
@ Opptizer Saya menambahkan pluto;) Mari kita lihat apa yang bisa saya lakukan tentang wallpaper
CommonGuy
1
@ Sp3000 Ups, lupa intensitas ketika saya menambahkan pluto
CommonGuy
2
Perhatikan bahwa Saturnus bukan satu-satunya planet dengan cincin. Jika Anda membuat cincin berfungsi, Anda harus menambahkannya ke Uranus juga.
mbomb007
20

Bash, 147 145 byte

ImageMagick digunakan untuk memanipulasi gambar. Jarak Euclidean digunakan.

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
SteelRaven
sumber
Anda dapat menyimpan byte dengan $w\x$h.
deltab
... dan satu lagi dengan o=o.png.
deltab
16

Python 3, 189 byte

Saya tidak tahu siapa pun tentang pegolf ahli, tapi begini saja.

  • Input berasal dari stdindan masuk ke stdoutdalam format PPM .
  • Jalankan seperti ini: python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm

Pertama, jarak 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)))

Dan kedua, jarak Euclidean:

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

Saya bisa menghemat empat byte dengan menggunakan pembagian integer alih-alih int(), dan pada kenyataannya itulah yang tampaknya dilakukan gambar asli - Anda hanya dapat melihat beberapa pergoresan di pinggiran gelap cahaya bintang yang tidak ada di bagian yang benar-benar benar. kode. Namun, kode ini mengikuti deskripsi, bukan gambar.

Versi yang tidak serigala, dan golf asli saya sebelum banyak optimisasi yang ditunjukkan orang lain atau yang saya temui, ada di inti ini .

EDIT: Saya menyimpan 7 byte dengan memindahkan for xdan for ymasuk ke fungsi tunggal print(atau o), tetapi ini menghasilkan file PNM dengan garis yang sangat panjang, yang mungkin atau mungkin tidak menyebabkan beberapa masalah.

EDIT 2: Maltysen menyelamatkan saya 20 byte lagi. Terima kasih!

EDIT lagi: Sekarang hanya ada satu print, oalias adalah kewajiban, bukan tabungan. 4 byte lagi.

Sunting lagi: Sp3000 menyelamatkan saya 2 byte lebih. Sementara itu, aliasing mapuntuk mtidak menyimpan apa-apa, sehingga dalam kepentingan pembacaan (!) Saya sudah diperluas lagi. Sekarang putaran 2 8 byte yang bagus.

Sunting yang terakhir (?): Sekarang dengan dukungan jarak Euclidean - dan dengan menyalahgunakan bilangan kompleks, saya melakukannya dengan jumlah byte yang persis sama!

EDIT, reboot Hollywood: Saran Sp3000 berikutnya menjatuhkan 5 byte.

EDIT, yang bodoh bernama sekuel: 6 byte dipangkas off, berkat saran Maltysen dibuat bahwa saya tidak memahami sampai Sp3000 mengulanginya ... kemudian lagi 8 byte dari %penyalahgunaan. Dan berbicara dalam obrolan membuat fenomenal2126 byte. Saya rendah hati.

Tim Pederick
sumber
@Maltysen: Benar sekali. 20 byte disimpan!
Tim Pederick
beberapa lebih: alih-alih hal rumit sys.stdin dengan EOFs yang dapat Anda gunakan iter()dengan nilai sentinel: docs.python.org/2/library/functions.html#iter sebagai iter(raw_input,''), juga letakkan w,h,Sdi baris yang sama dengan perpanjangan membongkar.
Maltysen
@Maltysen: Saya tidak yakin itu akan berhasil. Saya sudah melakukan hampir persis itu, tetapi itu hits EOFError(dan jadi saya perlu tryblok), karena tidak ada baris kosong di file input dan saya tidak yakin tantangannya memungkinkan saya untuk menambahkan satu. Atau apakah saya melewatkan sesuatu?
Tim Pederick
Saya pikir jika Anda hal nilai sentinel, Anda bisa mengakhiri dengan baris kosong dibandingkan memberi makan file, meskipun, ya, hal file tidak akan berfungsi.
Maltysen
@ Sp3000: Anehnya, ya! Saya mengharapkan untuk mengeluh bahwa stdinitu bukan iterator.
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");}

Membutuhkan kompiler C ++ 11 yang lunak (GCC 4.9.2 hanya sedikit tidak disukai), dan png ++ library, yang dibutuhkan sendiri libpng. Jarak Manhattan digunakan. Mengambil input aktif stdin, output ke file bernama "a" di direktori saat ini dalam format PNG.

Contoh D:

masukkan deskripsi gambar di sini


masukkan deskripsi gambar di sini


masukkan deskripsi gambar di sini

Tikar
sumber
1
Saya suka PCGgambar :) (Meskipun PPCGadalah singkatan pilihan saya;))
Calvin Hobbies
8

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

Menggunakan jarak Manhattan. Ini mungkin akan lebih pendek di Python 3, tapi saya mengacaukan paket Python saya baru-baru ini dan saya mengalami kesulitan menginstal ulang Pillow. PPM mungkin akan lebih pendek, tapi saya suka PIL.

Untuk bersenang-senang, saya mencoba menerapkan algoritme seperti pada ruang warna L * a * b * , berpikir itu akan memberikan campuran warna yang lebih baik (terutama dalam contoh B). Sayangnya, algoritme Calvin memungkinkan saluran melewati nilai maksimalnya, yang membuat gambar tampak sedikit kurang dahsyat daripada yang saya harapkan ...

masukkan deskripsi gambar di sini

Sp3000
sumber
6

Mathematica, 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"&

Fungsi murni mengambil string. Untuk menjalankannya dalam jumlah waktu yang wajar, ganti 1in 1+#~ManhattanDistance...dengan 1.; ini memaksa perhitungan numerik alih-alih simbol.

Tidak Disatukan:

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"]&
jcai
sumber
6

Python 2, 287 251 byte

Versi golf dari kode asli yang saya gunakan untuk menghasilkan gambar. Mungkin bisa bermain golf sedikit lebih banyak (oleh pegolf yang lebih baik daripada saya). Ini adalah fungsi yang mengambil string input penuh. Pengolahan citra dilakukan dengan PIL 's image Modul . Menggunakan jarak 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()

Menggunakan jarak Euclidean adalah 5 byte lebih panjang (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()

Berikut ini adalah rangkaian uji lengkap yang menjalankan contoh A hingga E dari pertanyaan, untuk kedua metrik jarak:

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

Mereka semua terlihat tidak bisa dibedakan. Yang lebih besar mungkin membutuhkan beberapa detik untuk dijalankan.

Hobi Calvin
sumber
Saya percaya Anda dapat menyimpan banyak byte dengan mengubahnya for x in r(I[0]):...for y in r(I[1]):dengan mengubahnya for x in r(I[0]*I[1]):. Anda kemudian dapat mengambil setiap level indentasi turun menjadi 1, dan ganti xdengan x/I[1]dan ydengan y%I[1].
Kade
Anda bisa menghemat 5 byte dengan mengganti from PIL import Imagekefrom PIL import*
sagiksp
6

C, 247 byte

Tidak akan menang, tapi saya suka golf di C. Tidak ada perpustakaan gambar eksternal yang digunakan, output ke stdout dalam format PPM. Mengambil input pada stdin. Menggunakan jarak Manhattan untuk bermain 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++]));}

Berikut varian jarak Euclidean (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++]));}
Andrea Biondo
sumber
6

CJam, 86 byte

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

Meskipun ini mungkin terlihat agak panjang untuk bahasa golf, saya percaya bahwa dari solusi yang diposting sejauh ini, ini adalah yang terpendek yang tidak menggunakan fungsi output gambar. Ini menghasilkan file PPM dalam bentuk ASCII. Gambar di bawah ini dikonversi dari PPM ke PNG menggunakan GIMP.

Saya tidak merekomendasikan untuk menjalankan kode dalam juru bahasa CJam online. Setidaknya tidak untuk gambar ukuran penuh. Peramban saya terkunci, kemungkinan besar karena penggunaan memori. Ini melengkapi gambar 400x400 di kisaran kedua dengan versi offline.

Contoh C

Penjelasan:

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.
Reto Koradi
sumber
5

C # 718 byte

Saya menyadari bahwa c # sangat buruk untuk bermain golf, tapi ini usaha saya 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;}}}

Jika ada yang punya saran untuk mempersingkatnya, silakan beri tahu saya.

Allan Harper
sumber
Anda telah melewatkan kelebihan Color.FromArgb (int, int, int). Akan menghemat 4 byte ...
Melvyn
Selain itu, Anda mungkin harus menggunakan .Length alih-alih .Count (). satu byte lebih sedikit, dan lebih efisien. Ngomong-ngomong, Anda bisa menghemat lebih banyak byte dengan menggunakan anggota C # 6 yang bertubuh ekspresi baru, jika mau.
Melvyn
Poin bagus untuk panjang dan kelebihan, menyesuaikan sekarang. Dan melihat ke dalam anggota bertubuh ekspresi. Belum pernah melihatnya sebelumnya. Terima kasih
Allan Harper
4

Python, 259 byte

Akhirnya selesai! Golf kode pertama yang saya coba, memutuskan untuk menggunakan Python dan pergi dengan jarak Manhattan. Shoutout to Maltysen karena membantu saya dengan iterator, mengurangi ukuran total menjadi hampir setengah!

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
sumber
Saya tahu pasti ada cara untuk membuat satu perhitungan untuk mereka semua, tapi saya jujur ​​tidak tahu Python dengan baik.
Nicolás Siplis
Anda masih tidak berfungsi dengan baik, harus mengganti k[0]dan k[1]dalam perhitungan.
Maltysen
Butuh waktu 10 menit bagi saya untuk menyadari mengapa ini bekerja pada mesin saya, ternyata saya memang membalikkannya tetapi lupa mengubahnya di sini.
Nicolás Siplis
2

CJam, 70 byte

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

Jarak Euclidean, keluaran ASCII PPM. Cobalah online

Seharusnya dimungkinkan untuk memeras beberapa byte lagi, tetapi saya tidak ingin menghabiskan terlalu banyak waktu.

aditsu
sumber