In alcuni casi, spesso in fisica, devi sommare i grafici. La tua sfida è scrivere, in una lingua a tua scelta, un programma o una funzione che prende più grafici come immagini, calcola tutte le possibili somme e genera il risultato.
grafici
I grafici sono immagini che contengono uno rgb(255, 255, 255)
sfondo bianco ( ) con un pixel non bianco in ogni colonna. Esempi:
I valori dello script sono rappresentati come posizioni Y dei pixel colorati. Il valore in corrispondenza di una determinata coordinata X è uguale alla posizione Y del pixel colorato più in alto in quella colonna, con coordinate che iniziano da 0 in basso a sinistra. Potrebbero esserci o meno pixel colorati aggiuntivi al di sotto di tali pixel per motivi estetici.
Compito
Il tuo compito è scrivere, in una lingua a tua scelta, un programma o una funzione che prende più grafici come immagini, calcola tutte le possibili 2^n - 1
somme e genera il risultato.
Una somma di grafici è un grafico in cui il valore di ogni colonna è uguale alla somma dei valori della colonna corrispondente in ciascuno dei grafici di input.
I grafici verranno in più colori. L'immagine del risultato deve contenere tutte le possibili somme dei grafici come altri grafici, inclusi i grafici originali ma esclusa la somma zero.
Il colore di ogni somma è determinato dalla media dei colori dei grafici inclusi, ad esempio i grafici dei colori rgb(255, 0, 255)
e rgb(0, 255, 255)
produrrebbe un grafico di rgb(128, 128, 255)
(può anche essere arrotondato per difetto).
L'immagine risultante dovrebbe essere alta quanto basta per adattarsi a tutti i grafici. Ciò significa che potrebbe essere necessario produrre un'immagine più grande di qualsiasi input.
L'ordine in cui i grafici risultanti vengono disegnati sull'immagine risultante non ha importanza, vale a dire se i grafici dei risultati si sovrappongono, è possibile scegliere quale si trova in cima, ma deve essere uno dei grafici, non una combinazione dei loro colori.
Si può presumere che le immagini di input abbiano la stessa larghezza, che tutte le colonne delle immagini abbiano almeno un pixel non bianco e che le altezze delle immagini (incluso l'output) siano inferiori a 4096 pixel.
Esempio
Ingresso A:
Ingresso B:
Esempio di output:
(Nel caso qualcuno fosse interessato, ho copiato e incollato i dati per questi da grafici azionari di società casuali. Questo è stato il primo modo che ho trovato per ottenere dati realistici come CSV.)
Regole
- È possibile scegliere qualsiasi formato di file di input dell'immagine bitmap.
- È possibile scegliere qualsiasi formato di file di output dell'immagine bitmap, che non deve corrispondere all'input.
- È possibile utilizzare le librerie di elaborazione delle immagini, tuttavia è vietata qualsiasi funzione per completare direttamente questa attività.
- Si applicano scappatoie standard .
- Questo è code-golf , quindi vince il codice più breve in byte.
Script del generatore di grafici
Ecco uno script di Python 2 che genera grafici. L'input viene dato in righe, con le prime tre righe come colore RGB e il resto come dati, terminato da EOF.
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
grafici di input, ci saranno 2^n - 1
linee nell'immagine di output?