W jednym z bardziej kultowych pasków xkcd Randall Munroe przedstawił linie czasu kilku filmów na wykresach narracyjnych:
(Kliknij, aby zobaczyć większą wersję.)
Źródło: xkcd nr 657 .
Biorąc pod uwagę specyfikację osi czasu filmu (lub innej narracji), musisz wygenerować taki wykres. To konkurs popularności, więc wygra odpowiedź z największą liczbą głosów (netto).
Minimalne wymagania
Aby nieco zawęzić specyfikację, oto minimalny zestaw funkcji, które każda odpowiedź musi zaimplementować:
Weź jako dane wejściowe listę nazw znaków, a następnie listę wydarzeń. Każde zdarzenie jest albo listą umierających znaków, albo listą grup znaków (oznaczających, które znaki są obecnie razem). Oto jeden przykład, w jaki sposób można zakodować narrację o Parku Jurajskim:
["T-Rex", "Raptor", "Raptor", "Raptor", "Malcolm", "Grant", "Sattler", "Gennaro", "Hammond", "Kids", "Muldoon", "Arnold", "Nedry", "Dilophosaurus"] [ [[0],[1,2,3],[4],[5,6],[7,8,10,11,12],[9],[13]], [[0],[1,2,3],[4,7,5,6,8,9,10,11,12],[13]], [[0],[1,2,3],[4,7,5,6,8,9,10],[11,12],[13]], [[0],[1,2,3],[4,7,5,6,9],[8,10,11,12],[13]], [[0,4,7],[1,2,3],[5,9],[6,8,10,11],[12],[13]], [7], [[5,9],[0],[4,6,10],[1,2,3],[8,11],[12,13]], [12], [[0, 5, 9], [1, 2, 3], [4, 6, 10, 8, 11], [13]], [[0], [5, 9], [1, 2], [3, 11], [4, 6, 10, 8], [13]], [11], [[0], [5, 9], [1, 2, 10], [3, 6], [4, 8], [13]], [10], [[0], [1, 2, 9], [5, 6], [3], [4, 8], [13]], [[0], [1], [9, 5, 6], [3], [4, 8], [2], [13]], [[0, 1, 9, 5, 6, 3], [4, 8], [2], [13]], [1, 3], [[0], [9, 5, 6, 3, 4, 8], [2], [13]] ]
Np. Pierwsza linia oznacza, że na początku mapy T-Rex jest samotny, trzy Raptory są razem, Malcolm jest sam, Grant i Sattler są razem, itp. Przedostatnie zdarzenie oznacza, że dwa Raptory umierają .
Jak dokładnie oczekujesz, że dane wejściowe zależą od Ciebie, o ile można określić tego rodzaju informacje. Np. Możesz użyć dowolnego wygodnego formatu listy. Możesz także oczekiwać, że postacie w wydarzeniach będą ponownie pełnymi nazwami postaci itp.
Możesz (ale nie musisz) zakładać, że każda lista grup zawiera każdą żywą postać w dokładnie jednej grupie. Nie należy jednak zakładać, że grupy lub postacie w ramach jednego wydarzenia są w szczególnie dogodnej kolejności.
Renderuj, aby wyświetlić ekran lub plik (jako grafikę wektorową lub rastrową) wykres, który ma jedną linię dla każdego znaku. Każda linia musi być oznaczona nazwą znaku na początku linii.
- Dla każdego normalnego zdarzenia musi istnieć jakiś przekrój wykresu, na którym grupy znaków są wyraźnie przypominane przez bliskość odpowiednich linii.
- Dla każdego zdarzenia śmierci wiersze odpowiednich znaków muszą kończyć się widocznym kroplem.
- Zdajesz nie trzeba powielać innych cech działek Randall, ani czy masz do odtworzenia jego styl rysowania. Proste linie z ostrymi zakrętami, wszystko w kolorze czarnym, bez dalszych etykiet i tytułu jest idealnie w porządku, aby wziąć udział w konkursie. Nie ma również potrzeby efektywnego wykorzystywania przestrzeni - np. Możesz potencjalnie uprościć algorytm, przesuwając tylko linie w dół, aby spotkać się z innymi postaciami, o ile istnieje zauważalny kierunek czasu.
Dodałem rozwiązanie referencyjne, które dokładnie spełnia te minimalne wymagania.
Czyni to ładnym
Jest to jednak konkurs popularności, dlatego możesz wdrożyć dowolną modę. Najważniejszym dodatkiem jest przyzwoity algorytm układania, który sprawia, że wykres jest bardziej czytelny - np. Co sprawia, że zakręty w liniach są łatwe do śledzenia i które zmniejszają liczbę koniecznych skrzyżowań linii. To jest podstawowy problem algorytmiczny tego wyzwania! Głosy decydują o skuteczności algorytmu w utrzymywaniu porządku w tabeli.
Ale oto kilka pomysłów, większość opartych na wykresach Randalla:
Dekoracje:
- Kolorowe linie.
- Tytuł fabuły.
- Kończy się linia etykietowania.
- Automatyczne ponowne znakowanie linii, które przeszły przez zajęty odcinek.
- Ręcznie rysowany styl (lub inny? Jak powiedziałem, nie ma potrzeby odtwarzania stylu Randall, jeśli masz lepszy pomysł) dla linii i czcionek.
- Konfigurowalna orientacja osi czasu.
Dodatkowa ekspresja:
- Nazwane wydarzenia / grupy / zgony.
- Znikające i ponownie pojawiające się linie.
- Postacie spóźniają się.
- Najważniejsze cechy, które wskazują (możliwe do przeniesienia?) Właściwości znaków (np. Patrz profil dzwonka na wykresie LotR).
- Kodowanie dodatkowych informacji w osi grupowania (np. Informacji geograficznych jak na wykresie LotR).
- Podróż w czasie?
- Alternatywne rzeczywistości?
- Postać zmieniająca się w inną?
- Dwie postacie się łączą? (Podział znaków?)
- 3D? (Jeśli naprawdę posuniesz się tak daleko, upewnij się, że faktycznie używasz dodatkowego wymiaru do wizualizacji czegoś!)
- Wszelkie inne istotne cechy, które mogą być przydatne do wizualizacji narracji filmu (lub książki itp.).
Oczywiście wiele z nich będzie wymagało dodatkowych danych wejściowych i możesz dowolnie rozszerzać swój format wejściowy, ale udokumentuj, w jaki sposób można wprowadzać dane.
Podaj jeden lub dwa przykłady, aby pochwalić się wdrożonymi funkcjami.
Twoje rozwiązanie powinno być w stanie poradzić sobie z każdym ważnym wkładem, ale jest absolutnie w porządku, jeśli lepiej pasuje do niektórych rodzajów narracji niż inne.
Kryteria głosowania
Nie mam złudzeń, że mógłbym powiedzieć ludziom, jak powinni wydawać głosy, ale oto kilka sugerowanych wskazówek w kolejności ich ważności:
- Potwierdź odpowiedzi, które wykorzystują luki, standardowe lub inne, lub zakoduj jeden lub więcej wyników.
- Nie oceniaj odpowiedzi, które nie spełniają minimalnych wymagań (bez względu na to, jak fantazyjna może być cała reszta).
- Przede wszystkim poprzyj dobre algorytmy układania. Obejmuje to odpowiedzi, które nie zajmują dużo miejsca w pionie, minimalizując przecinanie się linii, aby wykres był czytelny, lub które potrafią zakodować dodatkowe informacje w osi pionowej. Wizualizacja grup bez robienia wielkiego bałaganu powinna być głównym celem tego wyzwania, tak aby pozostał to programowy konkurs z interesującym problemem algorytmicznym w sercu.
- Upvote opcjonalne funkcje, które dodają ekspresyjnej mocy (tj. Nie są po prostu czystą dekoracją).
- Na koniec głosuj ładnie.
źródło
[[x,y,z]]
oznaczałoby, że wszystkie postacie są obecnie razem. Ale jeśli wydarzenie nie zawiera list, a jedynie postacie bezpośrednio, to nawet śmierć, więc w tej samej sytuacji[x,y,z]
oznacza to, że te trzy postacie umierają. Możesz użyć innego formatu, z wyraźnym wskazaniem, czy coś jest zdarzeniem śmierci lub zgrupowania, jeśli ci to pomoże. Powyższy format jest jedynie sugestią. Tak długo, jak format wejściowy jest co najmniej tak wyrazisty, możesz użyć czegoś innego.Odpowiedzi:
Python3 z numpy, scipy i matplotlib
edycja :
sorted_event
funkcja.coords
).źródło
T-SQL
Nie jestem zadowolony z tego jako wpisu, ale myślę, że to pytanie zasługuje przynajmniej na próbę. Spróbuję poprawić to później, jeśli pozwala, ale etykietowanie zawsze będzie problemem w SQL. Rozwiązanie wymaga SQL 2012+ i jest uruchamiane w SSMS (SQL Server Management Studio). Dane wyjściowe znajdują się na karcie wyników przestrzennych.
Wynikowa oś czasu wygląda następująco
źródło
Mathematica, rozwiązanie referencyjne
Dla porównania udostępniam skrypt Mathematica, który spełnia dokładnie minimalne wymagania, nic więcej, nic więcej.
Oczekuje, że znaki będą listą formatu w pytaniu w
chars
i wydarzeniach wevents
.Jako przykład, oto przykład Parku Jurajskiego z wykorzystaniem typu listy Mathematica:
dostaniemy:
(Kliknij, aby zobaczyć większą wersję.)
Że nie wygląda zbyt złe, ale to głównie dlatego, że dane wejściowe są mniej lub bardziej uporządkowane. Jeśli przetasujemy grupy i postacie w każdym zdarzeniu (zachowując tę samą strukturę), mogą się zdarzyć takie rzeczy:
Co jest trochę bałaganu.
Tak jak powiedziałem, spełnia to tylko minimalne wymagania. Nie próbuje znaleźć ładnego układu i nie jest ładny, ale tam właśnie wchodzicie!
źródło