Tóm tắt đồ thị màu


9

Trong một số trường hợp, thường là trong vật lý, bạn phải tính tổng các biểu đồ. Thử thách của bạn là viết, bằng ngôn ngữ bạn chọn, một chương trình hoặc hàm lấy nhiều biểu đồ làm hình ảnh, tính toán tất cả các khoản tiền có thể và đưa ra kết quả.

Đồ thị

Các biểu đồ là hình ảnh chứa nền trắng ( rgb(255, 255, 255)) với pixel không trắng trong mỗi cột. Ví dụ:

biểu đồ ví dụ biểu đồ ví dụ biểu đồ ví dụ

Các giá trị của tập lệnh được biểu diễn dưới dạng vị trí Y của các pixel màu. Giá trị tại tọa độ X nhất định bằng với vị trí Y của pixel màu trên cùng trong cột đó, với tọa độ bắt đầu từ 0 ở dưới cùng bên trái. Có thể có hoặc không có các pixel màu bổ sung bên dưới các pixel đó vì lý do thẩm mỹ.

Bài tập

Nhiệm vụ của bạn là viết, bằng ngôn ngữ bạn chọn, một chương trình hoặc hàm lấy nhiều biểu đồ làm hình ảnh, tính toán tất cả các 2^n - 1khoản tiền có thể và đưa ra kết quả.

Tổng các biểu đồ là một biểu đồ trong đó giá trị của mỗi cột bằng tổng giá trị của cột tương ứng trong mỗi biểu đồ đầu vào.

Các biểu đồ sẽ có nhiều màu sắc. Hình ảnh kết quả phải chứa tất cả các tổng có thể có của các biểu đồ như các biểu đồ khác, bao gồm các biểu đồ gốc nhưng không bao gồm tổng bằng không.

Màu của mỗi tổng được xác định bằng mức trung bình của màu của các biểu đồ được bao gồm, ví dụ: biểu đồ màu rgb(255, 0, 255)rgb(0, 255, 255)sẽ tạo ra biểu đồ rgb(128, 128, 255)(cũng có thể được làm tròn xuống).

Hình ảnh thu được phải cao theo yêu cầu để phù hợp với tất cả các biểu đồ. Điều này có nghĩa là bạn có thể phải xuất hình ảnh lớn hơn bất kỳ đầu vào nào.

Thứ tự mà đồ thị kết quả được vẽ vào hình ảnh kết quả không quan trọng, nghĩa là nếu đồ thị kết quả trùng nhau, bạn có thể chọn cái nào ở trên cùng, nhưng nó phải là một trong những đồ thị, không phải là sự kết hợp màu sắc của chúng.

Bạn có thể giả sử rằng hình ảnh đầu vào có chiều rộng bằng nhau, rằng tất cả các cột của hình ảnh có ít nhất một pixel không phải màu trắng và chiều cao của hình ảnh (bao gồm cả đầu ra) dưới 4096 pixel.

Thí dụ

Đầu vào A:

ví dụ đồ thị a

Đầu vào B:

ví dụ đồ thị b

Ví dụ đầu ra:

ví dụ tổng đồ thị

(Trong trường hợp ai đó quan tâm, tôi đã sao chép dữ liệu cho những thứ này từ biểu đồ chứng khoán của các công ty ngẫu nhiên. Đó là cách đầu tiên tôi tìm thấy để lấy dữ liệu thực tế dưới dạng CSV.)

Quy tắc

  • Bạn có thể chọn bất kỳ định dạng tệp đầu vào hình ảnh bitmap.
  • Bạn có thể chọn bất kỳ định dạng tệp đầu ra hình ảnh bitmap nào không phù hợp với đầu vào.
  • Bạn có thể sử dụng các thư viện xử lý ảnh, tuy nhiên mọi chức năng để hoàn thành nhiệm vụ này đều bị cấm.
  • Tiêu chuẩn áp dụng.
  • Đây là , vì vậy mã ngắn nhất tính bằng byte thắng.

Kịch bản tạo đồ thị

Đây là một kịch bản Python 2 tạo ra các biểu đồ. Đầu vào được đưa ra trong các dòng, với ba dòng đầu tiên là màu RGB và phần còn lại là dữ liệu, được chấm dứt bởi 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 Tôi hiện đang tạo một cho hai biểu đồ. Tôi đang làm bằng tay (chưa có tài liệu tham khảo nào), vì vậy tôi không biết liệu tôi có kiên nhẫn cho 3. Ngoài ra, ba cái tôi đưa ra không thể được tóm tắt vì chúng có chiều rộng khác nhau.
PurkkaKoodari

Vậy nếu có nđồ thị đầu vào, sẽ có 2^n - 1dòng nào trong ảnh đầu ra?
Peter Taylor

@PeterTaylor Có.
PurkkaKoodari

Tôi lấy nó đầu ra không thực sự cần phải chứa bất kỳ dòng dọc? Chỉ các pixel trên cùng trong mỗi cột?
Martin Ender

@ MartinBüttner Điều đó là chính xác, vì dữ liệu đó vẫn có thể được phân tích cú pháp dưới dạng biểu đồ như được định nghĩa trong phần đầu tiên.
PurkkaKoodari

Câu trả lời:


3

MATLAB, 405

Gọi qua: 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

Con trăn, 422

Gọi từ dòng lệnh 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

Ví dụ đầu ra
nhập mô tả hình ảnh ở đây
Một ví dụ khác
nhập mô tả hình ảnh ở đây

Đó là một điều khó khăn, các hoạt động mảng mức cao và sử dụng mảng làm chỉ số giúp ích rất nhiều ở đây. Tôi không mong đợi để xem các giải pháp dưới 1000 byte ngoại trừ trong Mathicala và Matlab

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.