Animation von Code Golf

28

Wenn ich Code-Golf-Einträge sehe, die ein paar Zeichen wegwerfen und den Code einschränken, schaue ich im Bearbeitungsverlauf nach einem Side-by-Side-Diff. Sehen und lernen :)

Diese Herausforderung besteht darin, ein Programm zu erstellen, das die schönsten animierten Unterschiede erzeugt.

  • Die Eingabe erfolgt in einer beliebigen Reihenfolge von Textversionen.
  • Das Programm kann in einer beliebigen Programmiersprache geschrieben sein.
  • Es ist zulässig, dass sich das Programm auf die Eingabe von Daten in bestimmten Programmiersprachen beschränkt.
  • Das Programm sollte nicht auf die spezifischen Eingabedaten abgestimmt werden. Das Programm sollte generisch sein und für alle bestellten Serien von Textversionen funktionieren.
  • Für jede Version in der Eingabe muss in der Ausgabeanimation eine entsprechende Zeit angegeben werden, in der der vollständige Text der Version angezeigt wird. Sie müssen den Unterschied zwischen den Versionsstufen animieren, und alle Versionsstufen müssen in der Ausgabe vorhanden und in der richtigen Reihenfolge sein. Auf diesen Keyframes muss die Versionsgröße angezeigt werden, und der Betrachter sollte verstehen, dass es sich um eine vollständige Version handelt, die zu diesem Zeitpunkt angezeigt wird.
  • Das Programm verwendet möglicherweise keinen Code von Drittanbietern, um die Unterschiede zu berechnen.
  • Die Ausgabe der Syntaxhervorhebung ist optional. Wenn die Syntax des Programms Farben enthält, wird möglicherweise kein Code von Drittanbietern verwendet.
  • Die Ausgabe wird ein animiertes GIF sein.
  • Das Programm verwendet möglicherweise eine Drittanbieter-Bibliothek, um das GIF zu erstellen.
  • Dies ist ein , so dass gemäß der Definition des Beliebtheitswettbewerbs auf dieser Website der Eintrag mit den meisten Stimmen gewinnt .

Hier ist ein einfaches Beispielskript , das die rudimentäre animierte GIF-Unterstützung von Pythons ndiff und Pillow verwendet und die einzelnen Schritte zum Hinzufügen und Entfernen animiert:

Persönlich halte ich das für einen ziemlich schlechten Job. Es führt keine Syntaxhervorhebung durch, versucht nicht, Code-Chunks zu verschieben, die neu angeordnet werden, und es fühlt sich nicht so an, als würde jemand sie live bearbeiten und so weiter. Es verstößt auch gegen die Regeln bezüglich der Anzeige der Größe der Eingabe in Bytes in Schlüsselbildern und verwendet eine Bibliothek eines Drittanbieters, um das Vergleichen durchzuführen. Viel Raum für Verbesserungen!

Und hoffentlich werden die beliebten Einträge auch für die codegolf.stackexchange.com-Community zu nützlichen Tools. Es wird daher geschätzt, wenn die Programme für andere leicht zum Laufen zu bringen und zu verwenden sind.

Wille
quelle
1
Kommentare, die gelöscht wurden, als das erweiterte Gespräch hier zum Stillstand zu kommen scheint. Eine Diskussion zu diesem Beitrag finden Sie auf dieser Meta-Frage .
Türklinke

Antworten:

11

(OP)

Bildbeschreibung hier eingeben

Dies basiert auf dem Beispiel-Python-Skript in der Frage.

Ich habe die einfachste Bearbeitungsentfernung verwendet, anstatt einen klügeren Unterschied in der Geduld zu machen.

Für die Ausrichtung von Genomen gibt es Algorithmen für die Mehrfachsequenzausrichtung, und sie könnten eine noch bessere Arbeit leisten, als nur jedes Paar benachbarter Frames in Betracht zu ziehen?

Ich war angenehm überrascht, wie einfach es war, den Bearbeitungsabstand für das Diff zu implementieren , und machte es kompatibel mit dem Python- difflib.ndiffFormat. Es gibt viele Python-Implementierungen von edit distance im Web, aber ich denke, meine Formulierung ist ein bisschen aufgeräumter und befasst sich mit dem kniffligen, aber wesentlichen Teil der eigentlichen Bestimmung des Pfades in der Tabelle. In unserem Kontext müssen wir die Schritte kennen, um eine in eine andere umzuwandeln, und nicht nur, wie viele Schritte es gibt.

Ich habe die Syntaxhervorhebung mit einem sehr einfachen Tokenizer eingeführt , der in der Lage sein sollte, mit den meisten C-ähnlichen Sprachen umzugehen, einschließlich Python und so weiter. Es unterteilt die Quelle in Interpunktion, Leerzeichen, Zeichenfolgen (mit Escape-Unterstützung) und alles andere ist eine Kennung und wird mit einer Liste von Schlüsselwörtern verglichen. Die Färbung ist auch leicht zu ändern.

Es war einfach, die Syntaxhervorhebung in eine dynamische Sprache zu integrieren. Der Textmarker gibt eine Liste von Zeichen- und Farbpaaren aus, und der Unterschied ist unabhängig davon, ob es sich um unterschiedliche Zeichenfolgen oder beliebige Iterationen von Vergleichselementen handelt. Ein interessanter und bewusster Effekt des Hervorhebens und anschließenden Unterscheidens besteht darin, dass Zeichen, die unverändert bleiben, aber ihre Farbe ändern, animiert werden. Ich wollte die Hervorhebung nicht für jedes Bild berechnen, da dies bedeuten würde, dass Sie beim Löschen einer abschließenden Zeichenfolge plötzlich einen großen Textblock als Zeichenfolge aufblitzen lassen würden.

Pythons Unterstützung für das Verfassen von GIF ist eher begrenzt. PIL macht es nicht und Pillow macht es ziemlich schlecht. Ich benutze Pillow, muss dann aber durch Gifsicle laufen, um Loopings usw. zu komprimieren und hinzuzufügen. Pillow schreibt das Frame-Timing nicht korrekt und lässt Sie keine Entsorgungsmethoden usw. verwalten. Dies ist eine Schande, da der Unterschied die Szene so viel besser versteht als ein Nachbearbeitungsschritt, der sich mit abgeflachten Frames befasst :(

Quellcode

Wille
quelle
1
Ich habe den gleichen Diff-Algorithmus implementiert. Später habe ich es mit Cython umgeschrieben und eine 100-fache Geschwindigkeit erreicht.
Ray