Анімація Code Golf


28

Коли я бачу записи коду-гольфу, які збивають декілька символів, відбілюючи код, я переглядаю історію редагування для того, щоб побічно розходитись. Побачити та дізнатися :)

Це завдання полягає в тому, щоб зробити програму, яка створює найкрасивіші анімовані розбіжності.

  • Введенням буде будь-яка впорядкована серія текстових версій.
  • Програма може бути написана будь-якою мовою програмування.
  • Допускається, що програма обмежує себе введенням даних у деяких конкретних мовах програмування.
  • Програма не повинна налаштовуватися на конкретні вхідні дані; програма повинна бути загальною і працювати для будь-якої впорядкованої серії текстових версій.
  • Для кожної версії на вході повинен бути відповідний час у анімації виводу, де відображається повний текст версії. Ви повинні анімувати різницю між етапами версій, і всі етапи версій повинні бути присутніми і в порядку у висновку. На цих ключових кадрах повинен бути показаний розмір версії, і глядач повинен зрозуміти, що це повна версія, яку вони бачать у цей момент.
  • Програма може не використовувати жодного стороннього коду для обчислення різниць.
  • Виділення синтаксису не є обов'язковим. Якщо програма забарвлює синтаксис, вона може не використовувати жодного стороннього коду для цього.
  • Вихід буде анімований GIF.
  • Програма може використовувати бібліотеку третьої сторони для створення GIF.
  • Це , тому згідно з визначенням популярності-конкурсу на цьому сайті виграє запис з найбільшою кількістю голосів .

Ось простий приклад скрипта , який використовує Пітона ndiff і подушку в елементарну анімований GIF підтримка і оживляє кожен додавати і видаляти крок:

Особисто я вважаю це досить поганою роботою. Він не робить підсвічування синтаксису, не намагається переміщувати фрагменти коду, які переставляються, не відчуває, що хтось редагує його в реальному часі тощо. Він також порушує правила щодо відображення розміру вхідних даних у байтах на ключових кадрах, і для використання дифференціалу використовує сторонні бібліотеки. Багато місця для вдосконалення!

І, сподіваємось, популярні записи стануть корисними цікавими інструментами і для спільноти codegolf.stackexchange.com. Тож його цінують, якщо іншим програмам легко запускати та користуватися.


1
Коментарі вичищені, оскільки розширена розмова тут, схоже, припиняється. Обговорення цієї публікації можна знайти на цьому мета-питанні .
Дверна ручка

Відповіді:


11

(ОП)

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

Це ґрунтується на прикладі сценарію Python у питанні.

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

Для вирівнювання геномів є алгоритми вирівнювання декількох послідовностей , і вони могли б зробити ще кращу роботу, ніж просто розглядати кожну пару сусідніх кадрів?

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

Я представив підсвічування синтаксису, використовуючи дуже простий токенізатор, який повинен бути в змозі впоратися з більшістю с-подібних мов, включаючи його в'ялість, Python тощо. Він розбиває джерело на пунктуацію, пробіл, рядки (з підтримкою втечі), а все інше є ідентифікатором і перевіряється на перелік ключових слів. Забарвлення також легко змінити.

Було легко інтегрувати виділення синтаксису в динамічну мову; Маркер виводить список пар символів та кольорів, а різниця є агностичною для того, чи відрізняються його рядки чи будь-які довільні ітерабелі порівнянних! Цікавим і навмисним ефектом підкреслення спочатку, а потім і відмінності є те, що персонажі, які залишаються незмінними, але змінюють колір, оживляють. Я не хотів обчислювати підсвічування кожного кадру, оскільки це означало б, що коли ви видаляєте рядок, що закривається, ви раптом спалахнете великий шматок тексту як рядок.

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

Вихідний код


1
Я реалізував той самий алгоритм diff. Пізніше я переписав його за допомогою Cython і отримав 100-кратну швидкість.
Рей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.