ข้อสรุปกราฟสี


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:

กราฟตัวอย่าง

อินพุต 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

ดังนั้นหากมีnกราฟอินพุตจะมี2^n - 1บรรทัดในภาพที่ส่งออก?
Peter Taylor

@PeterTaylor ใช่
PurkkaKoodari

ฉันเอามันออกไม่จำเป็นต้องมีเส้นแนวตั้งใด ๆ จริง ๆ ? เฉพาะพิกเซลที่สูงที่สุดในแต่ละคอลัมน์ใช่ไหม
Martin Ender

@ MartinBüttnerนั่นถูกต้องเนื่องจากข้อมูลนั้นยังสามารถแยกวิเคราะห์เป็นกราฟตามที่กำหนดไว้ในส่วนแรก
PurkkaKoodari

คำตอบ:


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

โทรจาก commandline 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

ตัวอย่างผลลัพธ์ตัวอย่าง
ป้อนคำอธิบายรูปภาพที่นี่
อื่น
ป้อนคำอธิบายรูปภาพที่นี่

นั่นเป็นการดำเนินการของอาร์เรย์ระดับสูงที่ยุ่งยากและการใช้อาร์เรย์เนื่องจากดัชนีช่วยได้มากที่นี่ ฉันไม่ได้คาดหวังว่าจะเห็นวิธีแก้ปัญหาต่ำกว่า 1,000 ไบต์ยกเว้นใน Mathematica และ Matlab

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.