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:
width
undheight
kann jede positive ganze Zahl sein.x
undy
kann eine ganze Zahl sein.intensity
kann eine beliebige nicht negative ganze Zahl sein.red
,green
Undblue
kann beliebige Zahlen von 0 bis einschließlich 255 sein.
Ihr Programm muss Ausgang ein Truecolor - Bild in jedem gängigen lossless Bilddateiformat , deren Abmessungen width
durch height
. Jede x y intensity red green blue
Linie 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:
Wenn die dist- Funktion entweder eine euklidische Distanz ist :
Oder Manhattan Entfernung :
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
x
Wert auf einem der Eingangsleitungen und S C steht entwederred
,green
oderblue
, 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
wenn Sie die euklidische Distanz verwenden, und
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
und .
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
wenn Sie die euklidische Distanz verwenden, und
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
wenn Sie die euklidische Distanz verwenden, und
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.
quelle
Antworten:
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.
Dies durchläuft einfach alle Pixel mit den Formeln, obwohl es die
divmod
Pixelschleife 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 FehlerZusammengeführt!.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.Beispiele Ausgänge
Beispiel A
Beispiel B
Beispiel C
Beispiel D
quelle
JavaScript
394344Bearbeiten: 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).
Code-Snippet anzeigen
Sie können es auch in JSFiddle ausführen .
Bonus: Blaue Sonnenfinsternis
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:
quelle
Java - 627 Bytes
Java ist in der Tat eine der besten Golfsprachen :)
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
Full HD-Bild , das nicht so toll aussieht ... Würde mich freuen, wenn jemand es verbessern könnte!
quelle
Bash,
147145 BytesImageMagick wird zum Bearbeiten von Bildern verwendet. Euklidischer Abstand wird verwendet.
quelle
$w\x$h
.o=o.png
.Python 3, 189 Bytes
Ich habe keine Ahnung von einem erfahrenen Golfer, aber es geht los.
stdin
und gehtstdout
im PPM-Format .python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm
Erstens Manhattan Entfernung:
Und zweitens die euklidische Distanz:
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 x
undfor y
in eine einzelneprint
(odero
) 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 dero
Alias eine Haftung, keine Einsparung. 4 weitere Bytes aus.BEARBEITEN Sie noch etwas: Sp3000 sparte mir 2 weitere Bytes. In der Zwischenzeit hat das Aliasing
map
fürm
nichts 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.quelle
EOF
s können Sie esiter()
mit Sentinel-Werten verwenden: docs.python.org/2/library/functions.html#iter asiter(raw_input,'')
, setzen Sie es auchw,h,S
beim erweiterten Entpacken in dieselbe Zeile.EOFError
(und so brauchte ich einentry
Block), 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?stdin
das kein Iterator ist.C ++, 272 Bytes
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 Eingabestdin
und gibt sie in eine Datei mit dem Namen "a" im aktuellen Verzeichnis im PNG-Format aus.Beispiel D:
quelle
PCG
Bild :) (ObwohlPPCG
ist meine bevorzugte Abkürzung;))Python 2,
240232228 BytesVerwendet 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 ...
quelle
Mathematica, 146 Bytes
Eine reine Funktion, die einen String nimmt. Um es in angemessener Zeit auszuführen, ersetzen Sie das
1
in1+#~ManhattanDistance...
durch ein1.
; Dies erzwingt eine numerische Berechnung anstelle einer symbolischen.Ungolfed:
quelle
Python 2,
287251 BytesEine 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.
Die Verwendung des euklidischen Abstands ist 5 Bytes länger (256 Bytes):
Hier ist eine vollständige Testsuite, die die Beispiele A bis E der Frage für beide Entfernungsmetriken ausführt:
Sie sehen alle ununterscheidbar aus. Bei den größeren kann es einige Sekunden dauern, bis sie ausgeführt werden.
quelle
for x in r(I[0]):...for y in r(I[1]):
indem Sie sie in ändernfor x in r(I[0]*I[1]):
. Sie können dann um 1 jede Einzugsebene innerhalb nach unten nehmen, und ersetzen Siex
mitx/I[1]
undy
mity%I[1]
.from PIL import Image
auffrom PIL import*
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.
Hier ist die euklidische Abstandsvariante (257 Bytes):
quelle
CJam, 86 Bytes
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.
Erläuterung:
quelle
C # 718 Bytes
Mir ist klar, dass C # schrecklich zum Golfen ist, aber hier ist mein Versuch mit 718 Bytes
Wenn jemand Vorschläge zur Verkürzung hat, kann er mich gerne informieren.
quelle
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!
quelle
k[0]
undk[1]
in den Berechnungen umstellen .CJam, 70 Bytes
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.
quelle