Em uma das faixas mais icônicas do xkcd, Randall Munroe visualizou as linhas do tempo de vários filmes em gráficos narrativos:
(Clique para uma versão maior.)
Fonte: xkcd No. 657 .
Dada uma especificação da linha do tempo de um filme (ou alguma outra narrativa), você deve gerar esse gráfico. Como é um concurso de popularidade, a resposta com mais votos (líquidos) será vencedora.
Requerimentos mínimos
Para restringir um pouco as especificações, eis o conjunto mínimo de recursos que todas as respostas devem implementar:
Tome como entrada uma lista de nomes de caracteres, seguida por uma lista de eventos. Cada evento é uma lista de caracteres que estão morrendo ou uma lista de grupos de caracteres (significando quais caracteres estão atualmente juntos). Aqui está um exemplo de como a narrativa do Jurassic Park pode ser codificada:
["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 exemplo, a primeira linha significa que, no início do gráfico, o T-Rex está sozinho, os três Raptors estão juntos, Malcolm está sozinho, Grant e Sattler estão juntos, etc. O penúltimo evento significa que dois dos Raptors morrem .
Como exatamente você espera que a entrada seja sua, desde que esse tipo de informação possa ser especificado. Por exemplo, você pode usar qualquer formato de lista conveniente. Você também pode esperar que os personagens nos eventos sejam os nomes completos dos personagens, etc.
Você pode (mas não precisa) assumir que cada lista de grupos contém cada personagem vivo em exatamente um grupo. No entanto, você não deve assumir que os grupos ou caracteres em um evento estão em uma ordem particularmente conveniente.
Renderize na tela ou arquivo (como um vetor ou gráfico de varredura) um gráfico que tenha uma linha para cada caractere. Cada linha deve ser rotulada com um nome de caractere no início da linha.
- Para cada evento normal, deve haver, em ordem, uma seção transversal do gráfico na qual os grupos de caracteres se assemelhem claramente à proximidade de suas respectivas linhas.
- Para cada evento de morte, as linhas dos caracteres relevantes devem terminar em um blob visível.
- Você não precisa reproduzir nenhum outro recurso dos enredos de Randall, nem o estilo de desenho dele. Linhas retas com curvas fechadas, todas em preto, sem mais etiquetas e um título é perfeitamente adequado para entrar na competição. Também não é necessário usar o espaço com eficiência - por exemplo, você pode potencialmente simplificar seu algoritmo apenas movendo as linhas para baixo para encontrar outros caracteres, desde que haja uma direção discernível do tempo.
Adicionei uma solução de referência que atende exatamente a esses requisitos mínimos.
Tornando-o bonito
Porém, este é um concurso de popularidade; portanto, além disso, você pode implementar a fantasia que desejar. A adição mais importante é um algoritmo de layout decente, que torna o gráfico mais legível - por exemplo, que facilita as dobras nas linhas e reduz o número de cruzamentos de linhas necessários. Esse é o principal problema algorítmico desse desafio! Os votos decidirão o desempenho do seu algoritmo em manter o gráfico organizado.
Mas aqui estão mais algumas idéias, a maioria delas baseadas nos gráficos de Randall:
Decorações:
- Linhas coloridas.
- Um título para o enredo.
- A linha de rotulagem termina.
- Reencaminhar automaticamente as linhas que passaram por uma seção ocupada.
- Estilo desenhado à mão (ou outro? Como eu disse, não há necessidade de reproduzir o estilo de Randall, se você tiver uma idéia melhor) para linhas e fontes.
- Orientação personalizável do eixo do tempo.
Expressividade adicional:
- Eventos / grupos / mortes nomeados.
- Linhas desaparecendo e reaparecendo.
- Caracteres entrando tarde.
- Destaques que indicam propriedades (transferíveis?) De caracteres (por exemplo, consulte o portador do anel no gráfico LotR).
- Codificação de informações adicionais no eixo de agrupamento (por exemplo, informações geográficas, como no gráfico LotR).
- Viagem no tempo?
- Realidades alternativas?
- Um personagem se transformando em outro?
- Dois caracteres se fundindo? (Um personagem se dividindo?)
- 3D? (Se você realmente for tão longe, verifique se está usando a dimensão adicional para visualizar algo!)
- Quaisquer outras características relevantes, que possam ser úteis para visualizar a narrativa de um filme (ou livro etc.).
Obviamente, muitos deles exigirão informações adicionais, e você poderá aumentar seu formato de entrada conforme necessário, mas documente como os dados podem ser inseridos.
Inclua um ou dois exemplos para mostrar os recursos que você implementou.
Sua solução deve ser capaz de lidar com qualquer entrada válida, mas não há problema se for mais adequada a certos tipos de narrativas do que a outras.
Critérios de votação
Não tenho ilusões de que poderia dizer às pessoas como elas devem gastar seus votos, mas aqui estão algumas diretrizes sugeridas em ordem de importância:
- Respostas negativas que exploram brechas, padrões ou outros, ou codificam um ou mais resultados.
- Não promova respostas que não atendam aos requisitos mínimos (por mais sofisticados que sejam os demais).
- Antes de tudo, vote de novo em algoritmos de layout agradáveis. Isso inclui respostas que não usam muito espaço vertical enquanto minimizam o cruzamento de linhas para manter o gráfico legível ou que conseguem codificar informações adicionais no eixo vertical. Visualizar os agrupamentos sem fazer uma grande bagunça deve ser o foco principal desse desafio, de modo que este continua sendo um concurso de programação com um problema algorítmico interessante no coração.
- Upvote recursos opcionais que adicionam poder expressivo (ou seja, não são apenas decoração pura).
- Por fim, vote com agrado a apresentação.
fonte
[[x,y,z]]
significaria que todos os personagens estão juntos atualmente. Mas se o evento não contém listas, mas apenas os personagens diretamente, é uma morte constante; portanto, na mesma situação[x,y,z]
, esses três personagens morrem. Sinta-se à vontade para usar outro formato, com uma indicação explícita de que algo é um evento de morte ou de agrupamento, se isso o ajudar. O formato acima é apenas uma sugestão. Desde que o seu formato de entrada seja pelo menos tão expressivo, você pode usar outra coisa.Respostas:
Python3 com numpy, scipy e matplotlib
editar :
sorted_event
função.coords
).fonte
T-SQL
Não estou feliz com isso como entrada, mas acho que essa pergunta merece pelo menos uma tentativa. Tentarei melhorar esse tempo posteriormente, mas a rotulagem sempre será um problema no SQL. A solução requer o SQL 2012+ e é executada no SSMS (SQL Server Management Studio). A saída está na guia de resultados espaciais.
A linha do tempo resultante é semelhante à seguinte
fonte
Mathematica, Solução de Referência
Para referência, forneço um script do Mathematica que preenche exatamente os requisitos mínimos, nada mais, nada menos.
Ele espera que os caracteres sejam uma lista do formato na pergunta
chars
e nos eventos emevents
.Como exemplo, aqui está o exemplo do Jurassic Park usando o tipo de lista do Mathematica:
nós conseguiremos:
(Clique para uma versão maior.)
Isso não parece muito ruim, mas é principalmente porque os dados de entrada são mais ou menos ordenados. Se embaralharmos os grupos e os personagens em cada evento (mantendo a mesma estrutura), coisas assim podem acontecer:
O que é um pouco confuso.
Então, como eu disse, isso preenche apenas os requisitos mínimos. Ele não tenta encontrar um layout agradável e não é bonito, mas é aí que vocês entram!
fonte