En una de las tiras xkcd más icónicas, Randall Munroe visualizó las líneas de tiempo de varias películas en gráficos narrativos:
(Haga clic para una versión más grande).
Fuente: xkcd No. 657 .
Dada una especificación de la línea de tiempo de una película (o alguna otra narrativa), debe generar dicho gráfico. Este es un concurso de popularidad, por lo que la respuesta con más votos (netos) ganará.
Requerimientos mínimos
Para ajustar un poco la especificación, aquí está el conjunto mínimo de características que cada respuesta debe implementar:
Tome como entrada una lista de nombres de personajes, seguida de una lista de eventos. Cada evento es una lista de personajes moribundos o una lista de grupos de personajes (lo que significa qué personajes están actualmente juntos). Aquí hay un ejemplo de cómo se podría codificar la narrativa 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]] ]
Por ejemplo, la primera línea significa que al comienzo de la tabla, T-Rex está solo, los tres Raptors están juntos, Malcolm está solo, Grant y Sattler están juntos, etc. El penúltimo evento significa que dos de los Raptors mueren .
De qué manera exactamente espera que la entrada dependa de usted, siempre que se pueda especificar este tipo de información. Por ejemplo, puede usar cualquier formato de lista conveniente. También puede esperar que los personajes de los eventos vuelvan a ser los nombres completos de los personajes, etc.
Puede (pero no tiene que) suponer que cada lista de grupos contiene cada personaje vivo en exactamente un grupo. Sin embargo, debe no asumir que los grupos o personajes dentro de un evento están en orden particularmente conveniente.
Renderice a la pantalla o al archivo (como un gráfico vectorial o ráster) un gráfico que tenga una línea para cada carácter. Cada línea debe estar etiquetada con un nombre de carácter al comienzo de la línea.
- Para cada evento normal, debe haber, en orden, una sección transversal de la tabla en la que los grupos de caracteres se parezcan claramente por la proximidad de sus líneas respectivas.
- Para cada evento de muerte, las líneas de los caracteres relevantes deben terminar en un blob visible.
- Usted no tiene que reproducir cualesquiera otras características de las parcelas de Randall, ni tiene que reproducir su estilo de dibujo. Líneas rectas con curvas cerradas, todo en negro, sin más etiquetas y un título está perfectamente bien para entrar en la competencia. Tampoco es necesario usar el espacio de manera eficiente; por ejemplo, podría simplificar su algoritmo moviendo solo líneas hacia abajo para encontrarse con otros personajes, siempre que haya una dirección de tiempo discernible.
He agregado una solución de referencia que cumple exactamente estos requisitos mínimos.
Haciéndolo bonito
Sin embargo, este es un concurso de popularidad, así que además de eso, puedes implementar cualquier fantasía que desees. La adición más importante es un algoritmo de diseño decente que hace que el gráfico sea más legible, por ejemplo, que hace que las curvas en las líneas sean fáciles de seguir y que reduce el número de cruces de línea necesarios. ¡Este es el problema algorítmico central de este desafío! Los votos decidirán qué tan bien funciona su algoritmo para mantener el gráfico ordenado.
Pero aquí hay algunas ideas más, la mayoría de ellas basadas en las listas de Randall:
Decoraciones:
- Líneas de colores
- Un título para la trama.
- La línea de etiquetado termina.
- Volver a etiquetar automáticamente las líneas que han pasado por una sección ocupada.
- Estilo dibujado a mano (u otro? Como dije, no hay necesidad de reproducir el estilo de Randall si tiene una mejor idea) para líneas y fuentes.
- Orientación personalizable del eje de tiempo.
Expresividad adicional:
- Eventos nombrados / grupos / muertes.
- Líneas que desaparecen y reaparecen.
- Personajes entrando tarde.
- Aspectos destacados que indican propiedades (¿transferibles?) De los caracteres (p. Ej., Vea el portador del anillo en el gráfico LotR).
- Codificación de información adicional en el eje de agrupación (por ejemplo, información geográfica como en el gráfico LotR).
- ¿Viaje en el tiempo?
- Realidades alternativas?
- ¿Un personaje que se convierte en otro?
- ¿Dos personajes fusionándose? (¿Un personaje dividiéndose?)
- 3D? (Si realmente llega tan lejos, ¡asegúrese de estar usando la dimensión adicional para visualizar algo!)
- Cualquier otra característica relevante, que podría ser útil para visualizar la narrativa de una película (o libro, etc.).
Por supuesto, muchos de estos requerirán una entrada adicional, y puede aumentar su formato de entrada según sea necesario, pero documente cómo se pueden ingresar los datos.
Incluya uno o dos ejemplos para mostrar las características que implementó.
Su solución debería ser capaz de manejar cualquier entrada válida, pero está absolutamente bien si se adapta mejor a ciertos tipos de narrativas que a otras.
Criterios de votación
No me hago ilusiones de que podría decirle a la gente cómo deberían gastar sus votos, pero aquí hay algunas pautas sugeridas en orden de importancia:
- Respuestas negativas que explotan las lagunas, las estándar u otras, o codifican uno o más resultados.
- No eleve las respuestas que no cumplan con los requisitos mínimos (no importa cuán elegante sea el resto).
- En primer lugar, votar por buenos algoritmos de diseño. Esto incluye respuestas que no usan mucho espacio vertical mientras minimizan el cruce de líneas para mantener legible el gráfico, o que logran codificar información adicional en el eje vertical. Visualizar las agrupaciones sin hacer un gran desastre debería ser el foco principal de este desafío, de modo que siga siendo un concurso de programación con un interesante problema algorítmico en el corazón.
- Vota características opcionales que agregan poder expresivo (es decir, no son solo decoración pura).
- Por último, upvote buena presentación.
fuente
[[x,y,z]]
significaría que todos los personajes están actualmente juntos. Pero si el evento no contiene listas, sino solo personajes directamente, incluso es una muerte, por lo que en la misma situación[x,y,z]
significa que esos tres personajes mueren. Siéntase libre de usar otro formato, con una indicación explícita de si algo es un evento de muerte o agrupación si eso lo ayuda. El formato anterior es solo una sugerencia. Siempre que su formato de entrada sea al menos tan expresivo, puede usar otra cosa.Respuestas:
Python3 con numpy, scipy y matplotlib
editar :
sorted_event
función.coords
).fuente
T-SQL
No estoy contento con esto como una entrada, pero creo que esta pregunta merece al menos intentarlo. Intentaré mejorar este tiempo más tarde si lo permite, pero el etiquetado siempre será un problema en SQL. La solución requiere SQL 2012+ y se ejecuta en SSMS (SQL Server Management Studio). El resultado está en la pestaña de resultados espaciales.
La línea de tiempo resultante tiene el siguiente aspecto
fuente
Mathematica, Solución de referencia
Como referencia, proporciono un script de Mathematica que cumple exactamente los requisitos mínimos, nada más y nada menos.
Espera que los caracteres sean una lista del formato en la pregunta
chars
y los eventos enevents
.Como ejemplo, aquí está el ejemplo de Jurassic Park usando el tipo de lista de Mathematica:
Nosotros recibiremos:
(Haga clic para una versión más grande).
Eso no se ve tan mal, pero eso se debe principalmente a que los datos de entrada están más o menos ordenados. Si barajamos los grupos y los personajes en cada evento (manteniendo la misma estructura), pueden suceder cosas como esta:
Lo cual es un poco desordenado.
Entonces, como dije, esto solo cumple los requisitos mínimos. No trata de encontrar un diseño agradable y no es bonito, ¡pero ahí es donde entran ustedes!
fuente