总结彩色图


9

在某些情况下,通常在物理学中,您必须对图形求和。您面临的挑战是以您选择的语言编写一个程序或函数,该程序或函数将多个图形作为图像,计算所有可能的总和,然后输出结果。

图表

这些图是包含白色(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:

示例图a

输入B:

示例图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")

@MartinBüttner我目前正在制作一张一对二的图表。我正在手工操作(尚无参考隐含功能),所以我不知道我是否对3有耐心。而且,由于宽度不同,我不能对这三个进行求和。
PurkkaKoodari 2015年

那么,如果有n输入图,2^n - 1输出图像中会有线条吗?
彼得·泰勒

@PeterTaylor是的。
PurkkaKoodari 2015年

我认为输出实际上不需要包含任何垂直线吗?每列中只有最顶部的像素?
马丁·恩德

@MartinBüttner正确,因为仍然可以将数据解析为第一部分中定义的图形。
PurkkaKoodari 2015年

Answers:


3

MATLAB 405

通过以下方式致电: f('http://i.stack.imgur.com/ffCzR.png','http://i.stack.imgur.com/zHldg.png')

function f(varargin)
for k=1:nargin
i=im2double(imread(varargin{k}))
V(k,:)=size(i,1)-cellfun(@(V)find(any(V~=1,3),1),num2cell(i,[1,3]))
C(k,:)=i(find(any(i(:,1,:)~=1,3),1),1,:)
end
s=2^nargin-1
G=dec2bin(1:s)-'0'
C=bsxfun(@rdivide,G*C,sum(G,2))
V=G*V
m=max(V(:))
r=ones(m+1,size(V,2))
g=r
b=r
for i=1:s
M=bsxfun(@eq,(m:-1:0).',V(i,:))
r(M)=C(i,1)
g(M)=C(i,2)
b(M)=C(i,3)
end
imwrite(cat(3,r,g,b),'S.png')

4

Python,422

从命令行调用 python plotsum im1.png im2.png im3.png

import sys
from numpy import*
from scipy import misc as m
R=m.imread
r=range
a=array
N=sys.args[1:]
L=len(N)
P=[map(argmin,R(n,1).T)for n in N]               #converts image to list of heights, counting from the top
C=a([R(N[i])[P[i][0],0,:]for i in r(L)])         #finds and stores the colour
P=a([len(R(N[i]))-a(P[i])for i in r(L)])         #flips the numbers, measures actual heights from bottom
w=len(P[0])
h=max(sum(P,0))+1                                    #compute dimensions
G=ones((h,w,3))*255                                  #and make a white grid
for i in r(1,2**L):
 z=where(a(list(bin(i)[2:].zfill(L)))=='1');y=sum(P[z],0)    #sum the graphs
 for x in r(w):G[y[x],x,:]=average(C[z],0)                   #average the colours
m.imsave('S.png',G[::-1])                            #flip image vertically and save

输出
在此处输入图片说明
示例
在此处输入图片说明

这是一个棘手的高级数组操作,在这里使用数组作为索引很有帮助。除了Mathematica和Matlab,我不希望看到1000字节以下的解决方案

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.