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ụ:
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 - 1
khoả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)
và 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:
Đầu vào B:
Ví dụ đầu ra:
(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à mã golf , 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")
n
đồ thị đầu vào, sẽ có 2^n - 1
dòng nào trong ảnh đầu ra?