Animation de Code Golf

28

Quand je vois des entrées de golf de code qui font tomber quelques caractères, réduisant le code, je vais regarder l'historique des modifications pour un diff côte à côte. Voir et apprendre :)

Ce défi est de faire un programme qui produit les plus jolis diffs animés.

  • L'entrée sera une série ordonnée de versions de texte.
  • Le programme peut être écrit dans n'importe quel langage de programmation.
  • Il est autorisé que le programme se limite à entrer des données dans certains langages de programmation spécifiques.
  • Le programme ne doit pas être réglé sur les données d'entrée spécifiques; le programme doit être générique et fonctionner pour toute série ordonnée de versions de texte.
  • Pour chaque version dans l'entrée, il doit y avoir un temps correspondant dans l'animation de sortie où le texte complet de la version est affiché. Vous devez animer le diff entre les étapes de version, et toutes les étapes de version doivent être présentes et en ordre dans la sortie. Sur ces images clés, la taille de la version doit être affichée et le spectateur doit comprendre qu'il s'agit d'une version complète qu'il voit à ce stade.
  • Le programme ne peut utiliser aucun code tiers pour calculer les différences.
  • La sortie de mise en évidence de la syntaxe est facultative. Si le programme colore la syntaxe, il ne peut utiliser aucun code tiers pour ce faire.
  • La sortie sera un GIF animé.
  • Le programme peut utiliser une bibliothèque tierce pour créer le GIF.
  • Il s'agit d'un , donc selon la définition du concours de popularité sur ce site, l'entrée avec le plus de votes l'emporte .

Voici un exemple de script simple qui utilise ndiff de Python et le support GIF animé rudimentaire de Pillow et anime chaque étape d'ajout et de suppression:

Personnellement, je pense que c'est un assez mauvais travail. Il ne fait pas de mise en évidence de la syntaxe, il n'essaie pas de déplacer des morceaux de code qui sont réarrangés, il n'a pas l'impression que quelqu'un l'édite en direct, etc. Il casse également les règles concernant l'affichage de la taille de l'entrée en octets sur les images clés, et il utilise une bibliothèque tierce pour faire la différence. Beaucoup de place pour l'amélioration!

Et j'espère que les entrées populaires deviendront également des outils amusants utiles pour la communauté codegolf.stackexchange.com. Il est donc apprécié que les programmes soient faciles à exécuter et à utiliser pour les autres.

Volonté
la source
1
Les commentaires sont purgés alors que la conversation prolongée ici semble s'arrêter. La discussion sur ce post se trouve sur cette méta-question .
Poignée de porte

Réponses:

11

(OP)

entrez la description de l'image ici

Ceci est basé sur l'exemple de script Python dans la question.

J'ai utilisé la distance d'édition la plus simple plutôt qu'une différence de patience plus intelligente.

Pour aligner les génomes, il existe des algorithmes d' alignement multi-séquence et ils pourraient bien faire un meilleur travail que de simplement considérer chaque paire de trames adjacentes?

J'ai été agréablement surpris de voir à quel point il était simple d'implémenter la distance d'édition pour le diff et de le rendre compatible avec le difflib.ndiffformat Python . Il existe de nombreuses implémentations Python de distance d'édition sur le Web, mais je pense que ma formulation est un peu plus ordonnée et traite de la partie délicate mais essentielle de la détermination du chemin dans le tableau; dans notre contexte, nous devons connaître les étapes pour se transformer l'une en l'autre et pas seulement le nombre d'étapes.

J'ai introduit la coloration syntaxique en utilisant un tokenizer très simple qui devrait être capable de faire face à la plupart des langages de type c, y compris, par son laxisme, Python et autres. Il divise la source en ponctuation, espace blanc, chaînes (avec support d'échappement) et tout le reste est un identifiant et comparé à une liste de mots clés. La coloration est également facile à changer.

Il était facile d'intégrer la coloration syntaxique dans un langage dynamique; le surligneur génère une liste de paires de caractères et de couleurs, et la différence est indépendante de savoir si ses chaînes diffèrent ou tout itérable arbitraire de comparables! Un effet intéressant - et délibéré - de la mise en évidence en premier et ensuite de la différence est que les personnages qui restent inchangés mais changent de couleur s'animent. Je ne voulais pas calculer la surbrillance de chaque image car cela signifierait que lorsque vous supprimez une chaîne de fermeture, vous flashez soudainement un gros morceau de texte sous forme de chaîne.

La prise en charge de Python pour la création de GIF est plutôt limitée. PIL ne le fait pas, et Pillow le fait plutôt mal. J'utilise Pillow, mais je dois ensuite parcourir gifsicle pour compresser et ajouter des boucles, etc.; L'oreiller n'écrit pas correctement la synchronisation des images et ne vous permet pas de gérer les méthodes d'élimination, etc., ce qui est dommage car la différence a une bien meilleure compréhension de la scène qu'une étape de post-traitement traitant des images aplaties :(

Code source

Volonté
la source
1
J'ai implémenté le même algorithme de diff. Plus tard, je l'ai réécrit en utilisant Cython et j'ai gagné une accélération de 100x.
Ray