W niektórych przypadkach, często w fizyce, trzeba sumować wykresy. Twoim wyzwaniem jest napisanie, w wybranym języku, programu lub funkcji, która pobiera wiele wykresów jako obrazy, oblicza wszystkie możliwe sumy i generuje wynik.
Wykresy
Wykresy to obrazy, które zawierają białe ( rgb(255, 255, 255)
) tło z białymi pikselami w każdej kolumnie. Przykłady:
Wartości skryptu są reprezentowane jako pozycje Y kolorowych pikseli. Wartość przy określonej współrzędnej X jest równa pozycji Y najwyższego kolorowego piksela w tej kolumnie, przy współrzędnych zaczynających się od 0 w lewym dolnym rogu. Ze względów estetycznych poniżej tych pikseli mogą znajdować się dodatkowe kolorowe piksele.
Zadanie
Twoim zadaniem jest napisanie, w wybranym języku, programu lub funkcji, która pobiera wiele wykresów jako obrazy, oblicza wszystkie możliwe 2^n - 1
sumy i wyświetla wynik.
Suma wykresów to wykres, na którym wartość każdej kolumny jest równa sumie wartości odpowiedniej kolumny na każdym z wykresów wejściowych.
Wykresy będą dostępne w wielu kolorach. Obraz wynikowy musi zawierać wszystkie możliwe sumy wykresów jak inne wykresy, w tym wykresy oryginalne, ale z wyłączeniem sumy zerowej.
Kolor każdej sumy jest określany przez średnią kolorów zawartych wykresów, na przykład wykresów kolorów rgb(255, 0, 255)
i rgb(0, 255, 255)
tworzy wykres rgb(128, 128, 255)
(może być również zaokrąglony w dół).
Wynikowy obraz powinien być tak wysoki, jak to konieczne, aby pasował do wszystkich wykresów. Oznacza to, że być może będziesz musiał wydrukować obraz większy niż którekolwiek z wejść.
Kolejność, w jakiej wykresy wynikowe są rysowane na obrazie wynikowym, nie ma znaczenia, tzn. Jeśli wykresy wynikowe nachodzą na siebie, możesz wybrać, który z nich jest na górze, ale musi to być jeden z wykresów, a nie kombinacja ich kolorów.
Możesz założyć, że obrazy wejściowe mają równą szerokość, że wszystkie kolumny obrazów mają co najmniej jeden inny niż biały piksel i że wysokość obrazów (łącznie z danymi wyjściowymi) jest mniejsza niż 4096 pikseli.
Przykład
Wejście A:
Wejście B:
Przykładowe dane wyjściowe:
(Jeśli ktoś jest zainteresowany, skopiowałem dane dla nich z wykresów giełdowych przypadkowych firm. To był pierwszy sposób, w jaki udało mi się uzyskać realistyczne dane jako CSV.)
Zasady
- Możesz wybrać dowolny format pliku obrazu bitmapowego.
- Możesz wybrać dowolny format pliku wyjściowego obrazu bitmapowego, który nie musi być zgodny z danymi wejściowymi.
- Możesz korzystać z bibliotek przetwarzania obrazu, jednak wszelkie funkcje umożliwiające bezpośrednie wykonanie tego zadania są zabronione.
- Obowiązują standardowe luki .
- To jest golf-golf, więc wygrywa najkrótszy kod w bajtach.
Skrypt generatora wykresów
Oto skrypt w języku Python 2, który generuje wykresy. Dane wejściowe są podawane w wierszach, z trzema pierwszymi liniami jako kolorem RGB, a pozostałe jako danymi, zakończonymi przez 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
wykresy wejściowe, 2^n - 1
na obrazie wyjściowym będą linie?