Когда я вижу записи кода для игры в гольф, которые сбивают несколько символов, сокращая код, я смотрю историю изменений для сравнения. Смотри и учись :)
Эта задача состоит в том, чтобы создать программу, которая производит самые красивые анимированные различия.
- На входе будет любая упорядоченная серия текстовых версий.
- Программа может быть написана на любом языке программирования.
- Допускается, чтобы программа ограничивалась вводом данных на некоторых конкретных языках программирования.
- Программа не должна быть настроена на конкретные входные данные; Программа должна быть универсальной и работать для любой упорядоченной серии текстовых версий.
- Для каждой версии на входе должно быть соответствующее время в выходной анимации, где отображается полный текст версии. Вы должны анимировать различия между этапами версии, и все этапы версии должны присутствовать и в порядке вывода. На этих ключевых кадрах должен быть показан размер версии, и зритель должен понимать, что это полная версия, которую он видит в тот момент.
- Программа не может использовать какой-либо сторонний код для вычисления различий.
- Вывод подсветки синтаксиса не является обязательным. Если программа окрашивает синтаксис, она может не использовать какой-либо сторонний код для этого.
- На выходе будет анимированный GIF.
- Программа может использовать стороннюю библиотеку для создания GIF.
- Это конкурс популярности , поэтому, согласно определению конкурса популярности на этом сайте, выигрывает участник с наибольшим количеством голосов .
Вот простой пример сценария, который использует поддержку Python ndiff и Pillow, а также анимированную поддержку GIF и анимирует каждый шаг добавления и удаления:
Лично я считаю, что это довольно плохая работа. Он не выполняет подсветку синтаксиса, не пытается перемещать фрагменты кода, которые переставляются, он не чувствует, что кто-то редактирует его вживую и так далее. Он также нарушает правила отображения размера входных данных в байтах на ключевых кадрах и использует стороннюю библиотеку для выполнения сравнения. Много места для улучшения!
И, надеюсь, популярные записи станут полезными инструментами для сообщества codegolf.stackexchange.com. Поэтому важно, чтобы другие программы легко запускали и использовали.
Ответы:
(ОП)
Это основано на примере скрипта Python в вопросе.
Я использовал простейшее редактирование расстояния, а не более умный анализ терпения.
Для выравнивания геномов есть алгоритмы Multi Sequence Alignment , и они вполне могли бы сделать еще лучшую работу, чем просто рассматривать каждую пару соседних кадров?
Я был приятно удивлен, насколько просто реализовать расстояние редактирования для различий, и сделал его совместимым с
difflib.ndiff
форматом Python . В Интернете можно найти множество реализаций расстояния редактирования Python, но я думаю, что моя формулировка немного более аккуратна и касается сложной, но важной части фактического определения пути в таблице; в нашем контексте нам нужно знать шаги, чтобы превратить один в другой, а не просто сколько шагов.Я ввел подсветку синтаксиса, используя очень простой токенизатор, который должен быть в состоянии справиться с большинством с-подобных языков, включая, в силу своей слабости, Python и тому подобное. Он разбивает источник на пунктуацию, пробелы, строки (с escape-поддержкой), а все остальное является идентификатором и сверяется со списком ключевых слов. Окраска также легко изменить.
Было легко интегрировать подсветку синтаксиса в динамический язык; маркер выводит список пар символов и цветов, и различие не зависит от того, являются ли его отличительными строками или произвольными итерациями сопоставимых объектов! Интересный и преднамеренный эффект выделения вначале, а затем различий заключается в том, что символы, которые остаются неизменными, но меняют цвет, становятся анимированными. Я не хотел вычислять выделение каждого кадра, поскольку это означало бы, что при удалении закрывающей строки вы внезапно высвечивали большой кусок текста в виде строки.
Поддержка Python для создания GIF довольно ограничена. Пил не делает этого, а Подушка делает это довольно плохо. Я использую Подушку, но затем должен пройти через gifsicle, чтобы сжать и добавить циклы и т.д .; Подушка не правильно записывает синхронизацию кадров и не позволяет вам управлять методами удаления и т. Д., Что обидно, поскольку отличие намного лучше понимает сцену, чем этап постобработки, касающийся сплющенных кадров :(
Исходный код
источник