In una delle più iconiche strisce xkcd, Randall Munroe ha visualizzato le linee temporali di diversi film nelle classifiche narrative:
(Fare clic per una versione più grande.)
Data una specifica della linea temporale di un film (o di qualche altra narrativa), devi generare tale grafico. Questo è un concorso di popolarità, quindi vincerà la risposta con il maggior numero di voti (netti).
Requisiti minimi
Per restringere un po 'le specifiche, ecco il set minimo di funzionalità che ogni risposta deve implementare:
Prendi come input un elenco di nomi di personaggi, seguito da un elenco di eventi. Ogni evento è un elenco di personaggi morenti o un elenco di gruppi di personaggi (che indica quali personaggi sono attualmente insieme). Ecco un esempio di come potrebbe essere codificata la narrativa di Jurassic Park:
["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]] ]
Ad esempio, la prima riga significa che all'inizio del grafico, T-Rex è un solitario, i tre Rapaci sono insieme, Malcolm è solo, Grant e Sattler sono insieme, ecc. Il penultimo evento significa che due dei Rapaci muoiono .
Quanto esattamente ti aspetti che l'input dipenda da te, purché sia possibile specificare questo tipo di informazioni. Ad esempio è possibile utilizzare qualsiasi formato elenco conveniente. Puoi anche aspettarti che i personaggi degli eventi siano di nuovo i nomi completi dei personaggi, ecc.
Puoi (ma non devi) presumere che ogni elenco di gruppi contenga ciascun personaggio vivente in esattamente un gruppo. Tuttavia, si dovrebbe non dare per scontato che i gruppi o caratteri all'interno di un evento sono in ordine particolarmente conveniente.
Renderizza su schermo o file (come grafica vettoriale o raster) un grafico che ha una linea per ogni personaggio. Ogni riga deve essere etichettata con un nome di carattere all'inizio della riga.
- Per ogni evento normale, ci deve essere, in ordine, una sezione del diagramma in cui i gruppi di personaggi sono chiaramente assomigliati dalla vicinanza delle rispettive linee.
- Per ogni evento di morte, le linee dei personaggi rilevanti devono terminare in un blob visibile.
- Non , non è necessario riprodurre tutte le altre caratteristiche di trame di Randall, né si deve riprodurre il suo stile di disegno. Linee dritte con curve strette, tutte in nero, senza ulteriori etichette e un titolo è perfettamente adatto per partecipare alla competizione. Inoltre, non è necessario utilizzare lo spazio in modo efficiente, ad esempio potresti potenzialmente semplificare il tuo algoritmo spostando le linee verso il basso solo per incontrare altri personaggi, purché vi sia una direzione temporale percepibile.
Ho aggiunto una soluzione di riferimento che soddisfa esattamente questi requisiti minimi.
Rendendolo carino
Questo è un concorso di popolarità, quindi, oltre a ciò, puoi implementare qualsiasi fantasia tu voglia. L'aggiunta più importante è un algoritmo di layout decente che rende il grafico più leggibile, ad esempio che rende facili da seguire le curve nelle linee e che riduce il numero di incroci di linea necessari. Questo è il problema algoritmico principale di questa sfida! I voti decideranno in che misura il tuo algoritmo si comporta nel mantenere in ordine il grafico.
Ma qui ci sono altre idee, la maggior parte basate sulle carte di Randall:
decorazioni:
- Linee colorate.
- Un titolo per la trama.
- La linea di etichettatura termina.
- Rietichettatura automatica delle linee che hanno attraversato una sezione occupata.
- Stile disegnato a mano (o altro? Come ho detto, non è necessario riprodurre lo stile di Randall se hai un'idea migliore) per linee e caratteri.
- Orientamento personalizzabile dell'asse temporale.
Espressività aggiuntiva:
- Eventi / gruppi / morti nominati.
- Linee che scompaiono e riappaiono.
- I personaggi entrano in ritardo.
- Punti salienti che indicano le proprietà (trasferibili?) Dei caratteri (ad esempio, vedere il portatore di anelli nella tabella LotR).
- Codifica di informazioni aggiuntive nell'asse di raggruppamento (ad es. Informazioni geografiche come nel diagramma LotR).
- Viaggio nel tempo?
- Realtà alternative?
- Un personaggio si trasforma in un altro?
- Due personaggi si fondono? (Una divisione del personaggio?)
- 3D? (Se vai davvero così lontano, assicurati di utilizzare effettivamente la dimensione aggiuntiva per visualizzare qualcosa!)
- Qualsiasi altra caratteristica pertinente, che potrebbe essere utile per visualizzare la narrazione di un film (o libro, ecc.).
Naturalmente, molti di questi richiedono input aggiuntivi e sei libero di aumentare il formato di input secondo necessità, ma ti preghiamo di documentare come è possibile inserire i dati.
Includi uno o due esempi per mostrare le funzionalità implementate.
La tua soluzione dovrebbe essere in grado di gestire qualsiasi input valido, ma va assolutamente bene se si adatta meglio a determinati tipi di narrazioni rispetto ad altri.
Criteri di voto
Non ho illusioni di poter dire alla gente come dovrebbero spendere i loro voti, ma ecco alcune linee guida suggerite in ordine di importanza:
- Downvote le risposte che sfruttano le lacune, quelle standard o altre, o codificano uno o più risultati.
- Non votare le risposte che non soddisfano i requisiti minimi (non importa quanto il resto possa essere).
- Innanzitutto, elabora algoritmi di layout gradevoli. Ciò include le risposte che non utilizzano molto spazio verticale riducendo al minimo l'attraversamento delle linee per mantenere leggibile il grafico o che riescono a codificare informazioni aggiuntive nell'asse verticale. Visualizzare i raggruppamenti senza fare un gran casino dovrebbe essere l'obiettivo principale di questa sfida, in modo che questo rimanga un concorso di programmazione con un interessante problema algoritmico a cuore.
- Valorizza le funzionalità opzionali che aggiungono potenza espressiva (cioè non sono solo pura decorazione).
- Infine, valuti la bella presentazione.
[[x,y,z]]
significherebbe che tutti i personaggi sono attualmente insieme. Ma se l'evento non contiene elenchi, ma solo personaggi direttamente, è addirittura una morte, quindi nella stessa situazione [x,y,z]
significa che quei tre personaggi muoiono. Sentiti libero di usare un altro formato, con un'indicazione esplicita se qualcosa è un evento di morte o di raggruppamento se ciò ti aiuta. Il formato sopra è solo un suggerimento. Finché il tuo formato di input è almeno altrettanto espressivo, puoi usare qualcos'altro.