Анимация Code Golf

28

Когда я вижу записи кода для игры в гольф, которые сбивают несколько символов, сокращая код, я смотрю историю изменений для сравнения. Смотри и учись :)

Эта задача состоит в том, чтобы создать программу, которая производит самые красивые анимированные различия.

  • На входе будет любая упорядоченная серия текстовых версий.
  • Программа может быть написана на любом языке программирования.
  • Допускается, чтобы программа ограничивалась вводом данных на некоторых конкретных языках программирования.
  • Программа не должна быть настроена на конкретные входные данные; Программа должна быть универсальной и работать для любой упорядоченной серии текстовых версий.
  • Для каждой версии на входе должно быть соответствующее время в выходной анимации, где отображается полный текст версии. Вы должны анимировать различия между этапами версии, и все этапы версии должны присутствовать и в порядке вывода. На этих ключевых кадрах должен быть показан размер версии, и зритель должен понимать, что это полная версия, которую он видит в тот момент.
  • Программа не может использовать какой-либо сторонний код для вычисления различий.
  • Вывод подсветки синтаксиса не является обязательным. Если программа окрашивает синтаксис, она может не использовать какой-либо сторонний код для этого.
  • На выходе будет анимированный GIF.
  • Программа может использовать стороннюю библиотеку для создания GIF.
  • Это , поэтому, согласно определению конкурса популярности на этом сайте, выигрывает участник с наибольшим количеством голосов .

Вот простой пример сценария, который использует поддержку Python ndiff и Pillow, а также анимированную поддержку GIF и анимирует каждый шаг добавления и удаления:

Лично я считаю, что это довольно плохая работа. Он не выполняет подсветку синтаксиса, не пытается перемещать фрагменты кода, которые переставляются, он не чувствует, что кто-то редактирует его вживую и так далее. Он также нарушает правила отображения размера входных данных в байтах на ключевых кадрах и использует стороннюю библиотеку для выполнения сравнения. Много места для улучшения!

И, надеюсь, популярные записи станут полезными инструментами для сообщества codegolf.stackexchange.com. Поэтому важно, чтобы другие программы легко запускали и использовали.

Будет
источник
1
Комментарии стерлись, поскольку расширенный разговор здесь, кажется, заканчивается. Обсуждение этого поста можно найти по этому мета-вопросу .
Дверная ручка

Ответы:

11

(ОП)

введите описание изображения здесь

Это основано на примере скрипта Python в вопросе.

Я использовал простейшее редактирование расстояния, а не более умный анализ терпения.

Для выравнивания геномов есть алгоритмы Multi Sequence Alignment , и они вполне могли бы сделать еще лучшую работу, чем просто рассматривать каждую пару соседних кадров?

Я был приятно удивлен, насколько просто реализовать расстояние редактирования для различий, и сделал его совместимым с difflib.ndiffформатом Python . В Интернете можно найти множество реализаций расстояния редактирования Python, но я думаю, что моя формулировка немного более аккуратна и касается сложной, но важной части фактического определения пути в таблице; в нашем контексте нам нужно знать шаги, чтобы превратить один в другой, а не просто сколько шагов.

Я ввел подсветку синтаксиса, используя очень простой токенизатор, который должен быть в состоянии справиться с большинством с-подобных языков, включая, в силу своей слабости, Python и тому подобное. Он разбивает источник на пунктуацию, пробелы, строки (с escape-поддержкой), а все остальное является идентификатором и сверяется со списком ключевых слов. Окраска также легко изменить.

Было легко интегрировать подсветку синтаксиса в динамический язык; маркер выводит список пар символов и цветов, и различие не зависит от того, являются ли его отличительными строками или произвольными итерациями сопоставимых объектов! Интересный и преднамеренный эффект выделения вначале, а затем различий заключается в том, что символы, которые остаются неизменными, но меняют цвет, становятся анимированными. Я не хотел вычислять выделение каждого кадра, поскольку это означало бы, что при удалении закрывающей строки вы внезапно высвечивали большой кусок текста в виде строки.

Поддержка Python для создания GIF довольно ограничена. Пил не делает этого, а Подушка делает это довольно плохо. Я использую Подушку, но затем должен пройти через gifsicle, чтобы сжать и добавить циклы и т.д .; Подушка не правильно записывает синхронизацию кадров и не позволяет вам управлять методами удаления и т. Д., Что обидно, поскольку отличие намного лучше понимает сцену, чем этап постобработки, касающийся сплющенных кадров :(

Исходный код

Будет
источник
1
Я реализовал тот же алгоритм сравнения. Позже я переписал его с помощью Cython и получил 100-кратное ускорение.
Рэй