Yıldızlarımızdaki Renkler


90

İlk satırı forma sahip bir dize ya da metin dosyasına giren bir program yazın.

width height

ve takip eden her satır forma sahiptir.

x y intensity red green blue

nerede:

  • widthve heightherhangi bir pozitif tam sayı olabilir.
  • xve yherhangi bir tam sayı olabilir.
  • intensity Negatif olmayan bir tamsayı olabilir.
  • red, greenve blue0 ila 255 arasında bir tam sayı olabilir.

Programınız zorunluluk çıkışı gerçek renkli boyutları herhangi bir ortak kayıpsız görüntü dosyası biçiminde görüntü widthile height. Her x y intensity red green blueçizgi, resmin üzerine çizilmesi gereken renkli bir yıldızı veya küreyi temsil eder. 0 da dahil olmak üzere çekilecek herhangi bir sayıda yıldız olabilir.

Resmin çizilmesi için kullanılan algoritma aşağıdaki gibidir, ancak sonuç aynı olduğu sürece istediğiniz gibi uygulayabilirsiniz:

Görüntüdeki her piksel için ( X , Y ) (buradaki X , en sol kenarda 0, en geniş kenarda genişlik-1 ve en üst kenarda Y , üst kenarda 0 ve alt kenarda yükseklik-1'dir ) C ϵ { kırmızı , yeşil , mavi } (0 ile 255 arasında sabitlenmiş bir değer) denklemde verilir:

renk kanalı denklemi

Burada dist fonksiyonu ya bir Öklid mesafe :

Öklid uzaklık denklemi

Veya Manhattan mesafesi :

Manhattan uzaklık denklemi

Golf kabiliyeti veya estetiğe göre istediğiniz mesafe fonksiyonunu seçin.

Girişteki ilk satırın yanı sıra her satır Yıldız kümesinin bir öğesidir . Bu nedenle, örneğin, S x temsil xgiriş hatları birinde değeri ve S herhangi birini temsil eder red, greenya da blue, bağlı olarak hangi renk kanalı anda hesaplanır.

Örnekler

Örnek A

Giriş ise

400 150
-10 30 100 255 128 0

çıktı olmalıdır

Örnek A, Öklid

Öklid mesafesini kullanıyorsanız ve

Örnek A, Manhattan

Manhattan mesafesini kullanıyorsanız.

Örnek B

Giriş ise

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

Öklid ve Manhattan mesafesi için ilgili çıktılar;

Örnek B, Öklidve Örnek B, Manhattan.

Örnek C

Giriş ise

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

çıktı olmalıdır

Örnek C, Öklid

Öklid mesafesini kullanıyorsanız ve

Örnek C, Manhattan

Manhattan mesafesini kullanıyorsanız.

Örnek D

Giriş ise

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

çıktı olmalıdır

Örnek D, Öklid

Öklid mesafesini kullanıyorsanız ve

Örnek D, Manhattan

Manhattan mesafesini kullanıyorsanız.

Örnek E

Giriş ise

100 1

bu durumda çıktı, tamamen siyah olan 1 piksel yüksekliğinde 100 piksel genişliğinde bir görüntü olmalıdır.

notlar

  • Giriş dizesini ya da onu stdin'den veya komut satırından içeren bir metin dosyasının adını alın, aksi takdirde dizgiyi alan bir işlev yazabilirsiniz.
  • Resmin "çıktısı" ya şu anlama gelir:
    • İstediğiniz adla bir dosyaya kaydetme.
    • Ham görüntü dosyası verisinin stdout'a yazdırılması.
    • Bu gibi görüntü görüntüleme PIL Var image.show().
  • Resimlerinizin pikselin mükemmel olduğunu kontrol etmeyeceğim (Yığın Değişimi yine de görüntüleri sık sık sıkıştırır), ancak görsel olarak herhangi bir farklılık söyleyebilirsem çok şüpheli olacağım.
  • Grafik / görüntü kütüphanelerini kullanabilirsiniz.

Kazanan

Bayt cinsinden en kısa gönderme kazanır. Bağlar halinde, en erken başvuru kazanır.

Eğlenceli Bonus: Gerçekten muhteşem bir çıktı görüntüsü için girdi verin.


38
+1 Vay. Bu muhteşem. (Sağlıklı bir Yeni Ufuklar uzay aracından
haberleri

Giriş, boşlukla ayrılmış biçimde mi olmalı, yoksa virgülle ayrılmış olabilir mi? Neyse, +1.
Maltysen

1
@Maltysen Uzay ayrılmış. (Bunun cimri olduğunu biliyorum, ancak bir düzine giriş değişkenine izin vermekten daha kolay.)
Calvin Hobbies

4
Kürelerin mi yoksa yıldızların mı daha güzel olduğuna karar veremiyorum.
trichoplax

Piksel mükemmelliği için, bitmap'in karma değerlerini karşılaştırabilirsiniz
Tobias Kienzler,

Yanıtlar:


26

Pyth - 46 bayt

Bu komikti! Sonunda Pyth'in görüntü G / Ç özelliklerini kullanmaya başladım. Manhattan sadece kısa bir değişiklik olsa da, golfyeden dolayı öklid uzaklığı yapar.

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

Piksel döngüsünü tek bir döngüde yoğunlaştırmasına rağmen divmodPyth yalnızca 3 yuvalanmış haritayı desteklediğinden ve hesaplamalar iki tane aldığından (RGB için ve biri yıldızlardan biri için) , formülün tüm pikselleri arasında dolaşır.

Resmi olarak kaydeder o.png. Oldukça yavaş, ilk 2 testi <2 dakikada yapar, ancak diğer 2 yarım saatlik bir emri alır.

.wHiç kimsenin farketmediği bir hata var; çünkü kimse onu kullanmıyor;) ama bir çekme talebinde bulundum, bu yüzden yakında birleştirilmezse test etmek için çatalımı kullanın. Birleştirilmiş!

Örnekler Çıktılar

Örnek A

Örnek A

Örnek B

Örnek B

Örnek C

Örnek C

Örnek D

Örnek D


7
Vay, Pyth'un bunu yapabileceğini bilmiyordu. Bir gün Pyth'ta iş yazılımı yazabiliriz. Yazması daha az kod olduğundan, refactor için daha hızlı ve kolay olması gerekir. : D
Cristian Lupascu

7
@ w0lf "programlayıcı zamanı yürütme zamanından daha önemlidir" ve hepimiz Pyth'in programlayıcı zamanını azaltmaya yardımcı olduğunu biliyoruz :) Pyth grafiksel bir sorundan çıktıktan sonra görüntü giriş / çıkış eklendi. Yastık dahili olarak kullanır.
Maltysen

11
@ Kesinlikle Kesinlikle. Ayrıca yazmanın ne kadar hızlı olduğu ile ilgisi yok. Önceki yorumum bir şakaydı.
Cristian Lupascu

2
Siz önemli bir şeyi unuttunuz - kod daha az olduğu için hata ayıklaması da daha kolay;)
Doktor

14
Programcı süresini kısaltarak "Pyth ile kod golf oynuyorlar ve bu yüzden 'gerçek' kod yazmak için daha az zamanları var?

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

Düzenleme: wolfhammer'ın harika önerilerini uygulayarak kodu çok kısalttı .

Ölçek

Not: Aşağıdaki pasajın işlenmesi için birkaç saniye bekleyin (makinemde ~ 4 saniye sürer).

JSFiddle'da da çalıştırabilirsiniz .

Bonus: Mavi Tutulma

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'da da çalıştırabilirsiniz .

Açıklama

Bu basit bir JavaScript + HTML5 tuval uygulamasıdır: string argümanını alan (boşluklar / newlines olmadan) ve çıktıyı DOM'da görüntüleyen bir işlev. Öklid mesafesini kullanır.

İşte okunabilir kod:

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

Halâ Blue Eclipse'de birbirine yapıştırılmasının nasıl yapıldığını seviyorum, manhatan tarzı ekleyebilir misiniz?
PTwr

1
@PTwr Tabii ki, işte burada: jsfiddle.net/pjLnazw1
Cristian Lupascu

Korku veren! (Gitmek için 7 daha fazla ... ugh)
PTwr

@ w0lf x ve y yineleyicileri birleştirerek işlevinizden bazı baytları tıraş edebilirsiniz. jsfiddle
wolfhammer

@wolfhammer Vay, bu şimdi sadece "bazı bayt", bir çok gelişme var. İndeksleme ile ilgili sabitlenecek bir şey olduğuna inanıyorum (örnek 2, 3 ve 4 numaralı resimler için soldaki pikseller etrafa sarılmış gibi gözüküyor). Teşekkürler!
Cristian Lupascu

26

Java - 627 bayt

Java gerçekten en iyi golf dillerinden biri :)

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

Aşağıdaki girişi kullanarak, güneş sistemimizin gerçekçi bir modelini oluşturabilirsiniz (bazı gezegenlerin boyutu yanlıştır, ancak aralarındaki mesafe doğru olmalıdır). Satürneye yüzük vermeye çalıştım, ama işe yaramadı ... Kaynak

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

Plutolu güneş enerjisi sistemi

Mükemmel görünmeyen Full HD resim ... Biri geliştirebilirse mutlu olur!


15
Güneş Sistemi için +1. Pluto'dan ayrıldığın için -1 (şimdi gerçek rengini ve boyutunu bile biliyoruz)
Doktor

1
Ayrıca, tam 1080p bir duvar kağıdının bağlanması gerçekten çok güzel olurdu :)
Doktor

@Optimizer Plütonu ekledim;) Duvar kağıdı hakkında neler yapabileceğime bir bakalım
CommonGuy

1
@ Sp3000 Ups, pluto eklediğimde yoğunluğunu unuttu
CommonGuy

2
Satürn'ün halkaları olan tek gezegen olmadığını unutmayın. Çalışmak için yüzük atarsanız, onları Uranüs'e de eklemelisiniz.
mbomb007

20

Bash, 147 145 bayt

ImageMagick görüntüleri değiştirmek için kullanılır. Öklid mesafesi kullanılır.

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

İle bir bayt kaydedebilirsiniz $w\x$h.
deltab

... ve başka biriyle o=o.png.
deltab

16

Python 3, 189 bayt

Kimsenin uzman bir golfçü fikri olmadığını düşünüyorum, ama işte başlıyor.

  • Girdi gelir stdinve gider stdoutde PPM formatında .
  • Öyle koş: python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm

İlk olarak, Manhattan mesafesi:

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

İkincisi, Öklid mesafesi:

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

Tam sayı bölme yerine dört bayt kurtarabilirim int() ve aslında orijinal görüntülerin yaptığı gibi görünüyor - tam olarak doğru olmayan yıldız ışıltısının karanlık saçaklarında bazı çizgiler oluşturabiliyorsunuz. kodu. Buna rağmen, bu kod, görüntüleri değil açıklamaları takip ediyor.

Ungolfed sürümü ve diğerleri işaret ya da kendim tökezledi birçok optimizasyonlar önce benim orijinal golf, içindedir bu özünden .

EDIT: 7 bayt'ı tek bir (ya da ) fonksiyona hareket ettirerek for xve kaydeterek kaydettim , ancak bu çok uzun bir çizgiyle PNM dosyası oluşturuyor ve bu da bazı sorunlara neden olabilir ya da olmayabilir.for yprinto

EDIT 2: Maltysen bana 20 bayt daha kazandırdı. Teşekkürler!

Bir kez daha EDIT: Şimdi sadece bir tane var print, otakma ad bir tasarruf değil tasarruftur. 4 bayt daha.

Biraz daha DÜZENLE: Sp3000 bana 2 bayt daha kazandırdı. Bu arada, aliasing mapiçin mokunabilirliği (!) Çıkarları böylece, hiçbir şey tasarrufu değildi Tekrar genişlettik. Şimdi güzel bir tur 8 8 bayt.

Sonuncuyu EDIT (?): Şimdi Öklid uzaklık desteği ile - ve karmaşık sayıları kötüye kullanarak, aynı sayıda baytta yaptım!

EDIT, Hollywood yeniden başlatıldı: Sp3000'in bir sonraki önerisi 5 baytı düşürdü.

Aptalca olarak adlandırılan netice: 6 bayt olan EDIT kesildi, bir öneri sayesinde Maltysen, Sp3000 tekrarlayana kadar kavramadım, sonra başka bir şey anlamadım 8 bayt %istismar. Ve sohbette konuşarak olağanüstü bir vuruş yaptı2126 bayt. Ben alçakgönüllüyüm.


@Maltysen: Çok doğru. 20 bayt kaydedildi!
Tim Pederick,

Biraz daha: yerine o karmaşık sys.stdin şeyler EOFs kullanabilirsiniz iter()sentinel değerlerle: docs.python.org/2/library/functions.html#iter olarak iter(raw_input,'')da koymak, w,h,Sgenişletilmiş veri açma ile aynı satırda.
Maltysen

@Maltysen: Bunun işe yarayacağından emin değilim. Neredeyse tam olarak bunu yapıyordum, ama isabet etti EOFError(ve bir trybloğa ihtiyacım vardı ), çünkü girdi dosyasında boş bir satır yoktu ve zorluğun bir tane eklememe izin verdiğinden emin değilim. Yoksa bir şey mi kaçırıyorum?
Tim Pederick,

Bence sentinel değeri olanı ise, dosyayı beslemeye karşı boş bir satırla sonlandırabilirsiniz, ancak, dosya işi işe yaramaz.
Maltysen

@ Sp3000: Şaşırtıcı, evet! stdinBir yineleyici olmadığından şikayet etmesini bekliyordum .
Tim Pederick

10

C ++, 272 bayt

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

Esnek bir C ++ 11 derleyicisine (GCC 4.9.2 yalnızca biraz sıkışık) ihtiyaç duyuyor ve png ++ kütüphanesine ihtiyaç duyuyor libpng. Manhattan mesafesi kullanıldı. Giriş alırstdin , geçerli dizindeki PNG formatında "a" adlı bir dosyaya çıkar.

Örnek D:

görüntü tanımını buraya girin


görüntü tanımını buraya girin


görüntü tanımını buraya girin


1
PCGİmajı beğendim :) (Tercihim PPCGkısaltmam olsa da;))
Calvin'in Hobileri

8

Python 2, 240 232 228 bayt

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

Manhattan mesafesini kullanır. Bu muhtemelen Python 3'te daha da kısa olacaktı, ancak Python paketlerimi son zamanlarda karıştırdım ve Pillow'ı yeniden yüklerken sorun yaşıyorum. PPM muhtemelen daha da kısa olacaktır, ama ben PIL'i severim.

Eğlence için, algoritmayı L * a * b * renk uzayında olduğu gibi uygulamaya çalıştım, bunun yerine daha iyi bir renk harmanı vereceğini düşünmüştüm (özellikle B örneğinde). Maalesef, Calvin'in algoritması, kanalların maksimum değerlerini aşmalarına izin veriyor, bu da görüntüleri umduğumdan biraz daha az harika gösteriyor ...

görüntü tanımını buraya girin


6

Mathematica, 146 bayt

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

Bir dize alarak saf bir işlev. Makul bir sürede çalıştırmak için, 1girişi 1+#~ManhattanDistance...bir1. ; bu, sembolik yerine sayısal hesaplamayı zorlar.

Ungolfed:

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

Python 2,287 251 bayt

Resimleri oluşturmak için kullanılan orijinal kodun golf versiyonu. Muhtemelen biraz daha fazla golf oynayabilir (benden daha iyi bir golfçü tarafından). Tam giriş dizesini alan bir işlevdir. Görüntü işleme ile yapılan PIL 'in Görüntü Modülü . Manhattan mesafesini kullanır.

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

Öklid mesafesinin kullanılması 5 bayt daha uzundur (256 bayt):

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

Her iki mesafe ölçümü için, sorudan A ve E arasındaki örnekleri çalıştıran eksiksiz bir test paketi:

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

Hepsi ayırt edilemez görünüyor. Büyük olanlar çalıştırmak için birkaç saniye sürebilir.


Sana değiştirerek bayt, bir avuç inanıyorum for x in r(I[0]):...for y in r(I[1]):bunu değiştirerek for x in r(I[0]*I[1]):. Daha sonra her girinti seviyesini 1 içinde aşağıya alabilir ve xile x/I[1]ve yile değiştirebilirsiniz y%I[1].
Kade

Sen değiştirerek 5 bayt kurtarabilir from PIL import Imageiçinfrom PIL import*
sagiksp

6

C, 247 bayt

Kazanmayacağım, ama C'de golf oynamayı seviyorum. Hiçbir dış görüntü kütüphanesi kullanılmıyor, PPM formatında stdout çıktı çıkıyor. Stdin'de girdi alır. Golf için Manhattan mesafesini kullanır.

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

İşte Öklid uzaklık değişkeni (257 bayt):

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 bayt

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

Bu bir golf dili için biraz uzun görünmekle birlikte, şu ana kadar yayınlanan çözümlerin, görüntü çıktısı işlevini kullanmayan en kısa yol olduğuna inanıyorum. Bu, ASCII formunda bir PPM dosyası üretir. Aşağıdaki resim GIMP kullanılarak PPM'den PNG'ye dönüştürüldü.

Kodun çevrimiçi CJam tercümanında çalıştırılmasını önermiyorum. En azından tam boyutlu görüntüler için. Tarayıcım büyük olasılıkla bellek kullanımı nedeniyle kilitlendi. 400x400 görüntüyü çevrimdışı sürümde ikinci aralıkta tamamlar.

Örnek C

Açıklama:

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 bayt

C # 'ın golf oynamak için korkunç olduğunu fark ettim, ama işte 718 bayttaki denemem

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

Birisi onu kısaltmak için herhangi bir öneriniz varsa, bana bildirmekten çekinmeyin.


Color.FromArgb (int, int, int) aşırı yüklenmesini kaçırdınız. 4 byte kurtarır ...
Melvyn

Ayrıca, muhtemelen .Count () yerine .Length kullanıyor olmalısınız. bir bayt daha az ve daha verimli. Bu arada, eğer istersen, C # 6'nın yeni ifade gövdeli üyelerini kullanarak çok daha fazla bayt kaydedebilirsin.
Melvyn

Şimdi ayarlama, hem uzunluk hem de aşırı yükte iyi noktalar. Ve ifadeye bağlı üyelere bakmak. Bunları daha önce görmedim. Teşekkürler
Allan Harper

4

Python, 259 bayt

Sonunda bitti! Denedim ilk kod golf Python kullanmaya karar verdi ve Manhattan mesafesine gitti. Yineleyicilerle ilgili yardım ettiğim için Maltysen'e seslen, toplam büyüklüğü neredeyse yarıya indirdi!

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

Hepsine tek bir hesaplama yapmanın bir yolu olduğunu biliyorum, ama dürüstçe Python'u o kadar iyi tanımıyorum.
Nicolás Siplis


Sizin hala düzgün çalışmıyorsa, hesaplamaları değiştirmek k[0]ve değiştirmek zorundasınız k[1].
Maltysen

Makinemde neden çalıştığını anlamam 10 dakika sürdü, çıktığını tersine çevirdim ama değiştirmeyi unuttum.
Nicolás Siplis

2

CJam, 70 bayt

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

Öklid mesafesi, ASCII PPM çıkışı. Çevrimiçi deneyin

Birkaç byte daha sıkmak mümkün olmalı, ama fazla zaman harcamak istemiyorum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.