Dans l’une des bandes les plus emblématiques de xkcd, Randall Munroe a visualisé les chronologies de plusieurs films dans des tableaux narratifs:
Source: xkcd n ° 657 .
Étant donné une spécification de la chronologie d'un film (ou d'un autre récit), vous devez générer un tel graphique. Ceci est un concours de popularité, donc la réponse avec le plus grand nombre de votes (nets) l'emportera.
Exigences minimales
Pour resserrer un peu les spécifications, voici l'ensemble minimal de fonctionnalités que chaque réponse doit implémenter:
Prenez en entrée une liste de noms de personnages, suivie d'une liste d'événements. Chaque événement est soit une liste de caractères mourants, soit une liste de groupes de caractères (indiquant quels caractères sont actuellement ensemble). Voici un exemple de codage du récit de 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]] ]
Par exemple, la première ligne signifie qu'au début du graphique, T-Rex est un seul, les trois rapaces sont ensemble, Malcolm est seul, Grant et Sattler sont ensemble, etc. L'avant-dernier événement signifie que deux des rapaces meurent. .
Vous vous attendez à ce que l'entrée corresponde exactement à votre choix, à condition que ce type d'information puisse être spécifié. Par exemple, vous pouvez utiliser n'importe quel format de liste pratique. Vous pouvez également vous attendre à ce que les personnages des événements reprennent le nom complet du personnage, etc.
Vous pouvez (mais ne devez pas nécessairement) supposer que chaque liste de groupes contient chaque personnage vivant dans exactement un groupe. Cependant, vous devriez ne pas supposer que les groupes ou personnages dans un événement sont en ordre particulièrement pratique.
Rendez à l'écran ou au fichier (sous forme de vecteur ou de graphique tramé) un graphique comportant une ligne pour chaque caractère. Chaque ligne doit être étiquetée avec un nom de caractère au début de la ligne.
- Pour chaque événement normal, il doit exister, dans l’ordre, une section du graphique dans laquelle les groupes de caractères se ressemblent nettement par la proximité de leurs lignes respectives.
- Pour chaque événement de mort, les lignes des caractères pertinents doivent se terminer par un blob visible.
- Vous n'avez pas à reproduire d'autres caractéristiques des parcelles de Randall, ni à reproduire son style de dessin. Des lignes droites avec des virages serrés, toutes en noir, sans autres étiquettes et un titre est parfaitement acceptable pour entrer dans la compétition. Il n’est pas non plus nécessaire d’utiliser efficacement l’espace - par exemple, vous pourriez potentiellement simplifier votre algorithme en ne déplaçant jamais les lignes vers le bas pour rencontrer d’autres caractères, à condition que la direction du temps soit perceptible.
J'ai ajouté une solution de référence qui répond exactement à ces exigences minimales.
Le rendre joli
Cependant, il s’agit d’un concours de popularité, vous pouvez donc mettre en œuvre toutes les fantaisies que vous souhaitez. L'ajout le plus important est un algorithme de mise en page décent qui rend la carte plus lisible - par exemple, qui permet de suivre facilement les courbures dans les lignes et qui réduit le nombre de croisements de lignes nécessaires. C'est le problème algorithmique de base de ce défi! Les votes détermineront les performances de votre algorithme pour maintenir le graphique en ordre.
Mais voici quelques idées supplémentaires, la plupart basées sur les graphiques de Randall:
Décorations:
- Lignes colorées.
- Un titre pour l'intrigue.
- La ligne d'étiquetage se termine.
- Les étiquettes qui ont été réétiquetées automatiquement et qui sont passées par une section occupée.
- Style dessiné à la main (ou autre? Comme je l'ai dit, il n'est pas nécessaire de reproduire le style de Randall si vous avez une meilleure idée) pour les lignes et les polices.
- Orientation personnalisable de l'axe des temps.
Expressivité supplémentaire:
- Événements / groupes / décès nommés.
- Lignes disparaissant et réapparaissant.
- Caractères entrant en retard.
- Faits saillants qui indiquent les propriétés (transférables?) Des caractères (par exemple, voir le porteur de sonnerie dans le tableau LotR).
- Encodage d'informations supplémentaires dans l'axe de regroupement (par exemple, des informations géographiques comme dans le graphique LotR).
- Voyage dans le temps?
- Des réalités alternatives?
- Un personnage en train de devenir un autre?
- Deux personnages se confondant? (Un personnage se dédoublant?)
- 3D? (Si vous allez vraiment aussi loin, assurez-vous d'utiliser la dimension supplémentaire pour visualiser quelque chose!)
- Tout autre élément pertinent pouvant être utile pour visualiser le récit d'un film (ou d'un livre, etc.).
Bien sûr, beaucoup d’entre elles nécessiteront une entrée supplémentaire, et vous êtes libre d’augmenter votre format d’entrée au besoin, mais veuillez indiquer comment les données peuvent être entrées.
Veuillez inclure un ou deux exemples pour montrer les fonctionnalités que vous avez implémentées.
Votre solution devrait pouvoir traiter n'importe quelle entrée valide, mais elle convient parfaitement si elle convient mieux à certains types de récits que d'autres.
Critères de vote
Je ne me fais pas d'illusions, je pourrais dire aux gens comment ils devraient dépenser leurs votes, mais voici quelques recommandations suggérées par ordre d'importance:
- Les réponses négatives qui exploitent des échappatoires, standard ou autres, ou codent en dur un ou plusieurs résultats.
- Ne pas upvote les réponses qui ne remplissent pas les exigences minimales (peu importe la fantaisie du reste).
- D'abord et avant tout, optimisez les algorithmes de mise en page. Cela inclut les réponses qui n'utilisent pas beaucoup d'espace vertical tout en minimisant le croisement des lignes pour que le graphique reste lisible, ou qui parviennent à coder des informations supplémentaires dans l'axe vertical. Visualiser les groupes sans causer de gros dégâts devrait être l’objectif principal de ce défi, de sorte qu’il reste un concours de programmation avec un problème algorithmique intéressant à cœur.
- Upvote fonctions optionnelles qui ajoutent un pouvoir expressif (c’est-à-dire ne sont pas simplement de la décoration pure).
- Enfin, upvote belle présentation.
la source
[[x,y,z]]
voudrait dire que tous les personnages sont actuellement ensemble. Mais si l'événement ne contient pas de listes, mais uniquement des personnages directement, c'est même une mort, alors dans la même situation[x,y,z]
, ces trois personnages meurent. N'hésitez pas à utiliser un autre format, avec une indication explicite de savoir si quelque chose est un événement de décès ou de regroupement si cela vous aide. Le format ci-dessus n'est qu'une suggestion. Tant que votre format de saisie est au moins aussi expressif, vous pouvez utiliser autre chose.Réponses:
Python3 avec numpy, scipy et matplotlib
éditer :
sorted_event
fonction.coords
).la source
T-SQL
Je ne suis pas content que cela soit une entrée, mais je pense que cette question mérite au moins un essai. Je vais essayer d’améliorer cette situation plus tard, mais l’étiquetage restera toujours un problème en SQL. La solution nécessite SQL 2012+ et est exécutée dans SSMS (SQL Server Management Studio). La sortie se trouve dans l'onglet de résultats spatiaux.
Le calendrier qui en résulte ressemble à ce qui suit
la source
Mathematica, solution de référence
Pour référence, je fournis un script Mathematica qui remplit exactement les exigences minimales, rien de plus, rien de moins.
Il s'attend à ce que les caractères soient une liste du format de la question
chars
et des événementsevents
.À titre d'exemple, voici l'exemple de Jurassic Park utilisant le type de liste de Mathematica:
nous aurons:
(Cliquez pour agrandir.)
Cela ne regarde pas trop mal, mais c'est surtout parce que les données d'entrée est plus ou moins ordonné. Si nous mélangeons les groupes et les personnages dans chaque événement (tout en conservant la même structure), cela peut arriver:
Ce qui est un peu le bordel.
Donc, comme je l'ai dit, cela ne remplit que les exigences minimales. Il n'essaie pas de trouver une belle mise en page et ce n'est pas joli, mais c'est là que vous entrez!
la source