В некоторых случаях, часто в физике, вы должны суммировать графики. Ваша задача - написать на выбранном вами языке программу или функцию, которая принимает несколько графиков в виде изображений, вычисляет все возможные суммы и выводит результат.
диаграммы
Графики - это изображения, которые содержат белый ( 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
строки в выходном изображении?