In einigen Fällen, oft in der Physik, müssen Sie Graphen summieren. Ihre Herausforderung besteht darin, in einer Sprache Ihrer Wahl ein Programm oder eine Funktion zu schreiben, die mehrere Grafiken als Bilder verwendet, alle möglichen Summen berechnet und das Ergebnis ausgibt.
Grafiken
Die Grafiken sind Bilder, die einen weißen ( rgb(255, 255, 255)
) Hintergrund mit einem nicht weißen Pixel in jeder Spalte enthalten. Beispiele:
Die Werte des Skripts werden als Y-Positionen der farbigen Pixel dargestellt. Der Wert an einer bestimmten X-Koordinate entspricht der Y-Position des obersten farbigen Pixels in dieser Spalte, wobei die Koordinaten unten links bei 0 beginnen. Aus ästhetischen Gründen können unter diesen Pixeln zusätzliche farbige Pixel vorhanden sein oder nicht.
Aufgabe
Ihre Aufgabe ist es, in einer Sprache Ihrer Wahl ein Programm oder eine Funktion zu schreiben, die mehrere Grafiken als Bilder verwendet, alle möglichen 2^n - 1
Summen berechnet und das Ergebnis ausgibt.
Eine Summe von Diagrammen ist ein Diagramm, bei dem der Wert jeder Spalte gleich der Summe der Werte der entsprechenden Spalte in jedem der Eingabediagramme ist.
Die Grafiken werden in mehreren Farben geliefert. Das Ergebnisbild muss alle möglichen Summen der Diagramme wie andere Diagramme enthalten, einschließlich der Originaldiagramme, jedoch ohne die Nullsumme.
Die Farbe jeder Summe wird durch den Durchschnitt der Farben der enthaltenen Diagramme bestimmt, beispielsweise Farbdiagramme, rgb(255, 0, 255)
und rgb(0, 255, 255)
würde ein Diagramm von erzeugen rgb(128, 128, 255)
(kann auch abgerundet werden).
Das resultierende Bild sollte so hoch sein, wie es für alle Diagramme erforderlich ist. Dies bedeutet, dass Sie möglicherweise ein Bild ausgeben müssen, das größer als eine der Eingaben ist.
Die Reihenfolge, in der die resultierenden Diagramme in das resultierende Bild gezeichnet werden, spielt keine Rolle. Wenn sich die Ergebnisdiagramme überlappen, können Sie auswählen, welches oben liegt. Es muss sich jedoch um eines der Diagramme handeln, nicht um eine Kombination ihrer Farben.
Sie können davon ausgehen, dass die Eingabebilder gleich breit sind, dass alle Spalten der Bilder mindestens ein nicht weißes Pixel haben und dass die Höhe der Bilder (einschließlich der Ausgabe) unter 4096 Pixel liegt.
Beispiel
Eingabe A:
Eingang B:
Beispielausgabe:
(Falls jemand interessiert ist, habe ich die Daten für diese aus den Aktiencharts zufälliger Unternehmen kopiert. Dies war der erste Weg, um realistische Daten als CSV zu erhalten.)
Regeln
- Sie können ein beliebiges Bitmap-Bildeingabedateiformat auswählen.
- Sie können ein beliebiges Bitmap-Bildausgabedateiformat auswählen, das nicht mit der Eingabe übereinstimmen muss.
- Sie können Bildverarbeitungsbibliotheken verwenden, jedoch sind alle Funktionen zum direkten Ausführen dieser Aufgabe gesperrt.
- Es gelten Standardlücken .
- Dies ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Graphgeneratorskript
Hier ist ein Python 2-Skript, das Diagramme generiert. Die Eingabe erfolgt in Zeilen, wobei die drei ersten Zeilen als RGB-Farbe und der Rest als Daten als EOF abgeschlossen werden.
import PIL.Image as image
import sys
if len(sys.argv) < 2:
sys.stderr.write("Usage: graphgen.py <outfile> [infile]")
exit(1)
outfile = sys.argv[1]
if len(sys.argv) > 2:
try:
stream = open(sys.argv[2], "r")
data = stream.read()
stream.close()
except IOError as err:
if err.errno == 2:
sys.stderr.write("File \"{0}\" not found".format(sys.argv[2]))
else:
sys.stderr.write("IO error {0}: {1}".format(err.errno, err.strerror))
exit(1)
else:
data = sys.stdin.read()
try:
items = map(int, data.strip().split("\n"))
red, green, blue = items[:3]
items = items[3:]
highest = max(items)
except (ValueError, TypeError, IndexError):
sys.stderr.write("Invalid value(s) in input")
img = image.new("RGB", (len(items), highest + 1), (255, 255, 255))
prev = items[0]
img.putpixel((0, highest - items[0]), (red, green, blue))
for x, item in enumerate(items[1:]):
img.putpixel((x + 1, highest - item), (red, green, blue))
if item < prev:
for i in range(item + 1, prev):
img.putpixel((x, highest - i), (red, green, blue))
else:
for i in range(prev + 1, item):
img.putpixel((x + 1, highest - i), (red, green, blue))
prev = item
img.save(outfile, "png")
n
Eingabegraphen vorhanden sind , enthält 2^n - 1
das Ausgabebild Linien?