Die Farben in unseren Sternen


90

Schreiben Sie ein Programm, das eine Zeichenfolge oder eine Textdatei aufnimmt, deren erste Zeile die Form hat

width height

und jede nachfolgende Zeile hat die Form

x y intensity red green blue

wo:

  • widthund heightkann jede positive ganze Zahl sein.
  • xund ykann eine ganze Zahl sein.
  • intensity kann eine beliebige nicht negative ganze Zahl sein.
  • red, greenUnd bluekann beliebige Zahlen von 0 bis einschließlich 255 sein.

Ihr Programm muss Ausgang ein Truecolor - Bild in jedem gängigen lossless Bilddateiformat , deren Abmessungen widthdurch height. Jede x y intensity red green blueLinie stellt einen bunten Stern oder eine Kugel dar, die auf das Bild gezeichnet werden muss. Es können beliebig viele Sterne gezeichnet werden, einschließlich 0. Sie können davon ausgehen, dass die Zeichenfolge oder Datei eine nachgestellte neue Zeile enthält.

Der Algorithmus zum Zeichnen des Bildes lautet wie folgt, Sie können es jedoch beliebig implementieren, solange das Ergebnis identisch ist:

Für jedes Pixel ( X , Y ) im Bild (wobei X am linken Rand 0 und Breite-1 am rechten Rand und Y am oberen Rand 0 und Höhe-1 am unteren Rand ist) den Farbkanal C ϵ { Rot , Grün , Blau } (ein Wert zwischen 0 und 255) ergibt sich aus der Gleichung:

Farbkanalgleichung

Wenn die dist- Funktion entweder eine euklidische Distanz ist :

Euklidische Abstandsgleichung

Oder Manhattan Entfernung :

Manhattan-Entfernungsgleichung

Wählen Sie die Distanzfunktion, die Sie bevorzugen, basierend auf der Golffähigkeit oder der Ästhetik.

Jede der Zeilen in der Eingabe neben der ersten ist ein Element der Sternmenge . So, zum Beispiel, S x repräsentiert den xWert auf einem der Eingangsleitungen und S C steht entweder red, greenoder blue, je nachdem , welchen Farbkanal gegenwärtig berechnet wird.

Beispiele

Beispiel A

Wenn der Eingang ist

400 150
-10 30 100 255 128 0

die Ausgabe sollte sein

Beispiel A, euklidisch

wenn Sie die euklidische Distanz verwenden, und

Beispiel A, Manhattan

wenn Sie Manhattan Distanz verwenden.

Beispiel B

Wenn der Eingang ist

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

die jeweiligen Ausgänge für euklidische und Manhattan-Entfernung sollten sein

Beispiel B, euklidischund Beispiel B, Manhattan.

Beispiel C

Wenn der Eingang ist

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

die Ausgabe sollte sein

Beispiel C, euklidisch

wenn Sie die euklidische Distanz verwenden, und

Beispiel C, Manhattan

wenn Sie Manhattan Distanz verwenden.

Beispiel D

Wenn der Eingang ist

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

die Ausgabe sollte sein

Beispiel D, euklidisch

wenn Sie die euklidische Distanz verwenden, und

Beispiel D, Manhattan

wenn Sie Manhattan Distanz verwenden.

Beispiel E

Wenn der Eingang ist

100 1

Dann sollte die Ausgabe ein Bild mit einer Breite von 100 Pixel und einer Höhe von 1 Pixel sein, das vollständig schwarz ist.

Anmerkungen

  • Nehmen Sie die Eingabezeichenfolge oder den Namen einer Textdatei, die sie enthält, aus stdin oder der Befehlszeile, oder schreiben Sie eine Funktion, die eine Zeichenfolge enthält.
  • Das "Ausgeben" des Bildes bedeutet entweder:
    • Speichern Sie es in einer Datei mit dem Namen Ihrer Wahl.
    • Drucken Sie die Rohdaten der Bilddatei auf stdout.
    • Anzeigen des Bildes, zB mit PIL 's image.show().
  • Ich werde nicht überprüfen, ob Ihre Bilder pixelgenau sind (Stack Exchange komprimiert Bilder trotzdem verlustbehaftet), aber ich bin sehr misstrauisch, wenn ich visuell einen Unterschied feststellen kann.
  • Sie können Grafik- / Bildbibliotheken verwenden.

Gewinnen

Die kürzeste Übermittlung in Bytes gewinnt. Bei Stimmengleichheit gewinnt die früheste Einreichung.

Spaßbonus: Geben Sie den Input für ein wirklich spektakuläres Ausgabebild.


38
+1 Wow. Das ist herrlich. (Und ein angemessener Zeitpunkt für die Veröffentlichung, wie wir von einem gesunden Raumschiff von New Horizons hören!)
BrainSteel

Muss die Eingabe in diesem durch Leerzeichen getrennten Format vorliegen oder kann sie durch Kommas getrennt werden? Wie auch immer, +1.
Maltysen

1
@Maltysen Raum getrennt. (Ich weiß, dass das geizig ist, aber es ist einfacher, als ein Dutzend Eingabevarianten zuzulassen.)
Calvins Hobbys

4
Ich kann mich nicht entscheiden, ob die Kugeln oder Sterne schöner sind.
Trichoplax

Für die Pixel-Perfektion können Sie den Hash der Bitmap vergleichen
Tobias Kienzler

Antworten:


26

Pyth - 46 Bytes

Das hat Spaß gemacht! Endlich muss ich Pyths Image-I / O-Funktionen nutzen. Tut euklidischen Abstand wegen Golfiness, obwohl Manhattan nur eine kurze Änderung ist.

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

Dies durchläuft einfach alle Pixel mit den Formeln, obwohl es die divmodPixelschleife zu einer Schleife komprimiert und verwendet, da Pyth nur 3 verschachtelte Karten unterstützt und die Berechnungen zwei (eine für RGB und eine für die Sterne) dauern.

Speichert das Bild als o.png. Ziemlich langsam, führt die ersten 2 Tests in <2 Minuten durch, die anderen 2 dauern in der Größenordnung von einer halben Stunde.

Es gibt einen Fehler .w, den niemand bemerkt hat, weil niemand ihn benutzt;), aber ich habe eine Pull-Anfrage gestellt, also benutze meine Gabel, um zu testen, ob nicht bald zusammengeführt wird. Zusammengeführt!

Beispiele Ausgänge

Beispiel A

Beispiel A

Beispiel B

Beispiel B

Beispiel C

Beispiel C

Beispiel D

Beispiel D


7
Wow, ich wusste nicht, dass Pyth das kann. Eines Tages werden wir möglicherweise Geschäftssoftware in Pyth schreiben. Es muss weniger Code geschrieben werden, daher sollte das Refactoring schneller und einfacher sein. : D
Cristian Lupascu

7
@ w0lf "Programmiererzeit ist wichtiger als Ausführungszeit" und wir alle wissen, dass Pyth dazu beiträgt, die Programmiererzeit zu reduzieren :) Die Bild-E / A wurde kürzlich hinzugefügt, nachdem Pyth aus einer grafischen Ausgabe herausgefordert wurde. Es verwendet Kissen intern.
Maltysen

11
@Nit Absolut. Es hat auch nichts damit zu tun, wie schnell es ist, zu schreiben. Mein vorheriger Kommentar war ein Witz.
Cristian Lupascu

2
Ihr habt eine wichtige Sache vergessen - es ist auch einfacher zu debuggen, da der Code weniger ist;)
Optimizer

14
Indem Sie die Programmiererzeit reduzieren, meinen Sie "Sie spielen Codegolf mit Pyth und haben daher weniger Zeit," echten "Code zu schreiben"?

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

Bearbeiten: Der Code wurde stark verkürzt, indem Wolfhammers fantastische Vorschläge angewendet wurden .

Prüfung

Hinweis: Warten Sie einige Sekunden, bis das folgende Snippet gerendert ist (auf meinem Computer ca. 4 Sekunden).

Sie können es auch in JSFiddle ausführen .

Bonus: Blaue Sonnenfinsternis

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

Sie können es auch in JSFiddle ausführen .

Beschreibung

Dies ist eine einfache JavaScript + HTML5-Canvas-Implementierung: Eine Funktion, die ein Zeichenfolgenargument (ohne nachfolgende Leerzeichen / Zeilenumbrüche) verwendet und die Ausgabe im DOM anzeigt. Es verwendet die euklidische Distanz.

Hier ist der lesbare Code:

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

Ich mag es, wie Halos in Blue Eclipse zusammengeklebt werden.
PTwr

1
@PTwr Sicher, hier ist es: jsfiddle.net/pjLnazw1
Cristian Lupascu

Genial! (7 mehr zu gehen ... ugh)
PTwr

@ w0lf Sie können einige Bytes aus Ihrer Funktion entfernen, indem Sie die Iteratoren x und y kombinieren. jsfiddle
wolfhammer

@wolfhammer Wow, das sind jetzt nur "ein paar Bytes", es ist eine Menge Verbesserung. Ich werde das später noch genauer betrachten, da ich glaube, dass es etwas gibt, das bei der Indizierung behoben werden muss (bei den Beispielbildern 2, 3 und 4 scheinen sich die Pixel auf der linken Seite zu drehen). Vielen Dank!
Cristian Lupascu

26

Java - 627 Bytes

Java ist in der Tat eine der besten Golfsprachen :)

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

Mithilfe der folgenden Eingabe können Sie ein realistisches Modell unseres Sonnensystems erstellen (die Größe einiger Planeten ist falsch, aber der Abstand zwischen ihnen sollte genau sein). Ich habe versucht, Saturn Ringe zu geben, aber es hat nicht funktioniert ... Quelle

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

Sonnensystem mit Pluto

Full HD-Bild , das nicht so toll aussieht ... Würde mich freuen, wenn jemand es verbessern könnte!


15
+1 für Sonnensystem. -1 für das Verlassen von Pluto (jetzt, da wir sogar die tatsächliche Farbe und Größe kennen)
Optimierer

1
Außerdem wäre es wirklich schön, wenn ein vollständiges 1080p-Hintergrundbild verlinkt wäre :)
Optimizer

@Optimizer Ich habe Pluto hinzugefügt;) Mal sehen, was ich gegen das Hintergrundbild tun kann
CommonGuy

1
@ Sp3000 Ups, vergaß die Intensität, als ich
Pluto

2
Beachten Sie, dass Saturn nicht der einzige Planet mit Ringen ist. Wenn Sie Ringe zum Laufen bringen, sollten Sie diese auch zu Uranus hinzufügen.
mbomb007

20

Bash, 147 145 Bytes

ImageMagick wird zum Bearbeiten von Bildern verwendet. Euklidischer Abstand wird verwendet.

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

Mit können Sie ein Byte speichern $w\x$h.
DeltaB

... und noch eine mit o=o.png.
DeltaB

16

Python 3, 189 Bytes

Ich habe keine Ahnung von einem erfahrenen Golfer, aber es geht los.

  • Die Eingabe kommt stdinund geht stdoutim PPM-Format .
  • Führen Sie es so aus: python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm

Erstens Manhattan Entfernung:

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

Und zweitens die euklidische Distanz:

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

Ich könnte vier Bytes einsparen, indem ich stattdessen eine Ganzzahldivision verwende int(), und tatsächlich scheint das so zu sein, wie es die Originalbilder tun - Sie können nur ein paar Streifen in den dunklen Rändern des Sternglühens erkennen, die nicht genau richtig vorhanden sind Code. In der jetzigen Form folgt dieser Code jedoch der Beschreibung und nicht den Bildern.

Die ungolfed Version und mein ursprüngliches Golfspiel vor den vielen Optimierungen, auf die andere hingewiesen haben oder die ich über mich selbst gestolpert bin, sind in diesem Kern enthalten .

BEARBEITEN: Ich habe 7 Bytes durch Verschieben for xund for yin eine einzelne print(oder o) Funktion gespart , aber dies erzeugt eine PNM-Datei mit einer sehr langen Zeile, die einige Probleme verursachen kann oder auch nicht.

EDIT 2: Maltysen hat mir noch 20 Bytes gespart. Vielen Dank!

Erneut BEARBEITEN: Jetzt, da es nur noch einen gibt print, ist der oAlias ​​eine Haftung, keine Einsparung. 4 weitere Bytes aus.

BEARBEITEN Sie noch etwas: Sp3000 sparte mir 2 weitere Bytes. In der Zwischenzeit hat das Aliasing mapfür mnichts gespart, daher habe ich es aus Gründen der Lesbarkeit (!) Erneut erweitert. Es ist jetzt eine schöne Runde 2 8 Bytes.

EDIT the last (?): Jetzt mit euklidischer Distanzunterstützung - und indem ich komplexe Zahlen missbrauchte, tat ich es in genau der gleichen Anzahl von Bytes!

EDIT, der Neustart in Hollywood: Sp3000's nächster Vorschlag hat 5 Bytes verloren.

EDIT, die dumm benannte Fortsetzung: 6 Bytes abgeschnitten, dank eines Vorschlags, den Maltysen gemacht hat, dass ich nicht begriffen habe, bis Sp3000 es wiederholt hat ... dann noch 8 Bytes vor %Missbrauch. Und es im Chat auszusprechen, war phänomenal2126 Bytes. Ich bin demütig.


@Maltysen: Ganz richtig. 20 Bytes gespeichert!
Tim Pederick

Noch etwas: Anstatt dieses komplizierten sys.stdin-Zeugs mit EOFs können Sie es iter()mit Sentinel-Werten verwenden: docs.python.org/2/library/functions.html#iter as iter(raw_input,''), setzen Sie es auch w,h,Sbeim erweiterten Entpacken in dieselbe Zeile.
Maltysen

@Maltysen: Ich bin mir nicht sicher, ob das funktionieren würde. Ich habe schon fast genau das gemacht, aber es trifft zu EOFError(und so brauchte ich einen tryBlock), weil die Eingabedatei keine leere Zeile enthält und ich nicht sicher bin, ob ich bei dieser Herausforderung eine hinzufügen kann. Oder vermisse ich etwas?
Tim Pederick

Ich denke, wenn Sie die Sache mit dem Sentinel-Wert sind, können Sie einfach mit einer Leerzeile abschließen, anstatt die Datei einzuspeisen, aber ja, die Datei-Sache würde nicht funktionieren.
Maltysen

@ Sp3000: Überraschenderweise ja! Ich hatte damit gerechnet, dass ich mich beschweren würde, dass stdindas kein Iterator ist.
Tim Pederick

10

C ++, 272 Bytes

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

Benötigt einen nachgiebigen C ++ 11-Compiler (GCC 4.9.2 ist nur wenig unzufrieden) und die png ++ - Bibliothek, die selbst benötigt libpng. Manhattan Entfernung verwendet. Übernimmt die Eingabe stdinund gibt sie in eine Datei mit dem Namen "a" im aktuellen Verzeichnis im PNG-Format aus.

Beispiel D:

Bildbeschreibung hier eingeben


Bildbeschreibung hier eingeben


Bildbeschreibung hier eingeben


1
Ich mag das PCGBild :) (Obwohl PPCGist meine bevorzugte Abkürzung;))
Calvin Hobbies

8

Python 2, 240 232 228 Bytes

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

Verwendet Manhattan Entfernung. In Python 3 wäre dies wahrscheinlich sogar noch kürzer, aber ich habe kürzlich meine Python-Pakete durcheinander gebracht und Probleme, Pillow neu zu installieren. PPM wäre wahrscheinlich noch kürzer, aber ich mag PIL.

Zum Spaß habe ich versucht, den Algorithmus wie im L * a * b * -Farbraum anzuwenden, da ich dachte, er würde eine bessere Farbmischung ergeben (besonders in Beispiel B). Leider lässt der Algorithmus von Calvin zu, dass Kanäle ihre Maximalwerte überschreiten, wodurch die Bilder ein wenig weniger gut aussehen als ich gehofft habe ...

Bildbeschreibung hier eingeben


6

Mathematica, 146 Bytes

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

Eine reine Funktion, die einen String nimmt. Um es in angemessener Zeit auszuführen, ersetzen Sie das 1in 1+#~ManhattanDistance...durch ein 1.; Dies erzwingt eine numerische Berechnung anstelle einer symbolischen.

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 Bytes

Eine Golfversion des Originalcodes, mit dem ich die Bilder erstellt habe. Könnte wahrscheinlich ein bisschen mehr Golf spielen (von einem besseren Golfer als mir). Es ist eine Funktion, die die gesamte Eingabezeichenfolge aufnimmt. Bildverarbeitung mit getan PIL ‚s Bild - Modul . Verwendet Manhattan Entfernung.

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

Die Verwendung des euklidischen Abstands ist 5 Bytes länger (256 Bytes):

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

Hier ist eine vollständige Testsuite, die die Beispiele A bis E der Frage für beide Entfernungsmetriken ausführt:

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

Sie sehen alle ununterscheidbar aus. Bei den größeren kann es einige Sekunden dauern, bis sie ausgeführt werden.


Ich glaube, Sie können ein paar Bytes sparen, for x in r(I[0]):...for y in r(I[1]):indem Sie sie in ändern for x in r(I[0]*I[1]):. Sie können dann um 1 jede Einzugsebene innerhalb nach unten nehmen, und ersetzen Sie xmit x/I[1]und ymit y%I[1].
Kade

Sie könnten 5 Bytes speichern , indem Sie ersetzen from PIL import Imageauffrom PIL import*
sagiksp

6

C 247 Bytes

Ich werde nicht gewinnen, aber ich spiele gerne Golf in C. Keine externe Bildbibliothek verwendet, gibt im PPM-Format stdout aus. Übernimmt die Eingabe für stdin. Nutzt die Manhattan-Distanz zum Golfen.

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

Hier ist die euklidische Abstandsvariante (257 Bytes):

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 Bytes

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

Obwohl dies für eine Golfsprache etwas langwierig erscheint, glaube ich, dass von den bisher veröffentlichten Lösungen die kürzeste ist, bei der die Bildausgabefunktion nicht verwendet wird. Dies erzeugt eine PPM-Datei in ASCII-Form. Das folgende Bild wurde mit GIMP von PPM nach PNG konvertiert.

Ich empfehle nicht, den Code im Online-CJam-Interpreter auszuführen. Zumindest nicht für die Bilder in voller Größe. Mein Browser ist gesperrt, höchstwahrscheinlich wegen der Speichernutzung. Mit der Offline-Version werden die 400x400-Bilder im zweiten Bereich vervollständigt.

Beispiel C

Erläuterung:

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 Bytes

Mir ist klar, dass C # schrecklich zum Golfen ist, aber hier ist mein Versuch mit 718 Bytes

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

Wenn jemand Vorschläge zur Verkürzung hat, kann er mich gerne informieren.


Sie haben die Color.FromArgb (int, int, int) -Überladung verpasst. Würde 4 Bytes sparen ...
Melvyn

Außerdem sollten Sie wahrscheinlich .Length anstelle von .Count () verwenden. Ein Byte weniger und effizienter. Übrigens können Sie mit den neuen ausdrucksstarken Elementen von C # 6 viel mehr Bytes einsparen, wenn Sie dazu bereit sind.
Melvyn

Gute Punkte sowohl in Bezug auf die Länge als auch in Bezug auf die Überlastung, die sich jetzt einstellen. Und in die ausdrucksstarken Mitglieder schauen. Habe ich noch nie gesehen. Vielen Dank
Allan Harper

4

Python, 259 Bytes

Endlich fertig! Erster Code Golf, den ich ausprobiert habe, entschied mich für Python und ging mit der Manhattan-Distanz. Dank an Maltysen, der mir bei den Iteratoren geholfen hat, wurde die Gesamtgröße auf fast die Hälfte reduziert!

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

Ich weiß, dass es eine Möglichkeit geben muss, eine Berechnung für alle von ihnen durchzuführen, aber ich kenne Python ehrlich gesagt nicht so gut.
Nicolás Siplis


Dein geht immer noch nicht richtig, muss das k[0]und k[1]in den Berechnungen umstellen .
Maltysen

Ich brauchte ungefähr 10 Minuten, um zu verstehen, warum es auf meiner Maschine funktionierte. Es stellte sich heraus, dass ich sie invertiert habe, aber vergessen habe, sie hier zu ändern.
Nicolás Siplis

2

CJam, 70 Bytes

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

Euklidischer Abstand, ASCII-PPM-Ausgabe. Probieren Sie es online aus

Es sollte möglich sein, ein paar Bytes mehr zu komprimieren, aber ich möchte nicht zu viel Zeit damit verbringen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.