Animação do Code Golf

28

Quando vejo entradas de código de golfe que eliminam alguns caracteres, diminuindo o código, vou olhar para o histórico de edições para obter uma comparação lado a lado. Veja e aprenda :)

Esse desafio é criar um programa que produza as diferenças animadas mais bonitas.

  • A entrada será qualquer série ordenada de versões de texto.
  • O programa pode ser escrito em qualquer linguagem de programação.
  • É permitido que o programa se limite a inserir dados em algumas linguagens de programação específicas.
  • O programa não deve ser ajustado para os dados de entrada específicos; o programa deve ser genérico e funcionar para qualquer série ordenada de versões de texto.
  • Para cada versão da entrada, deve haver um tempo correspondente na animação de saída em que o texto completo da versão é exibido. Você deve animar o diff entre os estágios da versão, e todos os estágios da versão devem estar presentes e em ordem na saída. Nesses quadros-chave, o tamanho da versão deve ser mostrado e o visualizador deve entender que esta é uma versão completa que eles estão vendo naquele momento.
  • O programa não pode usar nenhum código de terceiros para calcular as diferenças.
  • A saída de destaque da sintaxe é opcional. Se o programa colorir a sintaxe, ele não poderá usar nenhum código de terceiros para fazer isso.
  • A saída será um GIF animado.
  • O programa pode usar uma biblioteca de terceiros para criar o GIF.
  • Este é um , de acordo com a definição de concurso de popularidade deste site, a participação com mais votos vence .

Aqui está um exemplo de script simples que usa o ndiff do Python e o suporte rudimentar de GIF animado do Pillow e anima cada etapa de adição e remoção:

Pessoalmente, acho que esse é um trabalho muito ruim. Ele não realça a sintaxe, não tenta mover blocos de código que são reorganizados, não parece que alguém está editando ao vivo e assim por diante. Ele também quebra as regras relativas à exibição do tamanho da entrada em bytes nos quadros-chave e usa uma biblioteca de terceiros para fazer a diferença. Muito espaço para melhorias!

E espero que as entradas populares também se tornem ferramentas divertidas úteis para a comunidade codegolf.stackexchange.com. Portanto, é apreciado se os programas são fáceis de executar e usar.

Vai
fonte
1
Os comentários foram eliminados quando a conversa prolongada aqui parece estar parando. Discussões sobre este post podem ser encontradas nesta meta questão .
Maçaneta

Respostas:

11

(OP)

insira a descrição da imagem aqui

Isso se baseia no exemplo de script Python na pergunta.

Usei a distância de edição mais simples, em vez de uma diferença de paciência mais inteligente.

Para alinhar genomas, existem algoritmos de alinhamento múltiplo e eles podem fazer um trabalho ainda melhor do que apenas considerar cada par de quadros adjacentes?

Fiquei agradavelmente surpreso com o quão simples era implementar a distância de edição para o diff e o tornei compatível com o difflib.ndiffformato do Python . Existem muitas implementações Python de distância de edição na Web, mas acho que minha formulação é um pouco mais organizada e lida com a parte complicada, mas essencial, de determinar também o caminho na tabela; em nosso contexto, precisamos conhecer as etapas para transformar uma na outra e não apenas quantas etapas existem.

Introduzi o destaque da sintaxe usando um tokenizador muito simples que deve ser capaz de lidar com a maioria das linguagens do tipo c, incluindo, por sua frouxidão, Python e outros. Ele divide a fonte em pontuação, espaço em branco, strings (com suporte a escape) e todo o resto é um identificador e verificado em uma lista de palavras-chave. A coloração também é fácil de mudar.

Foi fácil integrar o destaque da sintaxe em uma linguagem dinâmica; o marca-texto gera uma lista de pares de caracteres e cores, e a diferença é independente de suas seqüências diferentes ou de quaisquer iteráveis ​​arbitrárias de comparáveis! Um efeito interessante - e deliberado - de destacar primeiro e depois diferenciar é que os personagens que permanecem inalterados, mas que mudam de cor, são animados. Eu não queria calcular o realce de cada quadro, pois isso significa que, ao excluir uma sequência de fechamento, você repentinamente exibirá um grande pedaço de texto como sequência.

O suporte do Python à criação de GIF é bastante limitado. PIL não faz isso, e Pillow faz muito mal. Eu uso Pillow, mas depois tenho que passar pelo gifsicle para comprimir e adicionar looping etc; O travesseiro não grava corretamente o tempo do quadro e não permite que você gerencie os métodos de descarte, etc., o que é uma pena, pois o diferente tem uma compreensão muito melhor da cena do que uma etapa de pós-processamento que lida com quadros achatados :(

Código fonte

Vai
fonte
1
Eu implementei o mesmo algoritmo diff. Mais tarde, reescrevi-o usando o Cython e ganhei uma aceleração de 100x.
Ray