У деяких випадках, часто з фізики, доводиться підсумовувати графіки. Ваше завдання полягає в тому, щоб написати мовою на вашу вибір програму або функцію, яка сприймає кілька графіків як зображення, обчислює всі можливі суми та видає результат.
Графіки
Графіки - зображення, які містять білий ( rgb(255, 255, 255)
) фон із небілим пікселем у кожному стовпчику. Приклади:
Значення сценарію представлені у вигляді Y-позицій кольорових пікселів. Значення на певній координаті X дорівнює положенню Y самого верхнього кольорового пікселя в цьому стовпчику, координати починаються від 0 внизу зліва. Можливо, з естетичних причин можуть бути додаткові кольорові пікселі нижче цих пікселів.
Завдання
Ваше завдання полягає в тому, щоб написати мовою, яку ви обрали, програму чи функцію, яка сприймає кілька графіків як зображення, обчислює всі можливі 2^n - 1
суми та видає результат.
Сума графіків - це графік, де значення кожного стовпця дорівнює сумі значень відповідного стовпця у кожному з вхідних графіків.
Графіки вийдуть у декількох кольорах. Результатне зображення повинно містити всі можливі суми графіків у вигляді інших графіків, включаючи оригінальні графіки, але виключаючи нульову суму.
Колір кожної суми визначається середнім значенням кольорів графіків, що включаються, наприклад, графіки кольорів rgb(255, 0, 255)
і rgb(0, 255, 255)
дають графік rgb(128, 128, 255)
(може також округлятися вниз).
Отримане зображення має бути настільки високим, скільки потрібно для розміщення всіх графіків. Це означає, що вам, можливо, доведеться вивести зображення, яке перевищує будь-який з входів.
Порядок, в якому малюються отримані графіки до отриманого зображення, не має значення, тобто якщо графіки результатів перекриваються, ви можете вибрати, який з них знаходиться вгорі, але він повинен бути одним із графіків, а не комбінацією їх кольорів.
Ви можете припустити, що вхідні зображення мають однакову ширину, що всі стовпці зображень мають принаймні один небілий піксель, а висота зображень (включаючи вихідні) нижче 4096 пікселів.
Приклад
Введення A:
Введення B:
Приклад виводу:
(Якщо хтось зацікавився, я скопіював ці дані для них з фондових діаграм випадкових компаній. Це був перший спосіб, коли я знайшов реалістичні дані як CSV.)
Правила
- Ви можете обрати будь-який формат вхідного зображення зображення.
- Ви можете вибрати будь-який формат вихідного файлу растрового зображення, який не повинен відповідати вхідному.
- Ви можете використовувати бібліотеки обробки зображень, однак будь-які функції безпосередньо для виконання цього завдання заборонені.
- Застосовуються стандартні лазівки .
- Це є код-гольф, тому виграє найкоротший код у байтах.
Сценарій генератора графіків
Ось сценарій Python 2, який генерує графіки. Введення подається у рядках, три перші рядки як колір RGB, а решта як дані, що закінчуються 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
вхідні графіки, 2^n - 1
у вихідному зображенні будуть рядки?