在某些情况下,通常在物理学中,您必须对图形求和。您面临的挑战是以您选择的语言编写一个程序或函数,该程序或函数将多个图形作为图像,计算所有可能的总和,然后输出结果。
图表
这些图是包含白色(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
输出图像中会有线条吗?