Code Golf的动画


28

当我看到敲打几个字符的代码高尔夫球条目,使代码变淡时,我去查看并排差异的编辑历史记录。观看和学习:)

面临的挑战是制作一个能够产生最漂亮的动画差异的程序。

  • 输入将是任何有序的文本版本系列。
  • 该程序可以用任何编程语言编写。
  • 允许程序将自身限制为以某些特定的编程语言输入数据。
  • 程序不应该调整到特定的输入数据;该程序应该是通用的,并且可以用于任何有序的文本版本系列。
  • 对于输入中的每个版本,输出动画中必须有相应的时间显示版本的全文。您必须为版本阶段之间的差异设置动画,并且所有版本阶段都必须存在并在输出中按顺序排列。在这些关键帧上,必须显示版本大小,并且查看者应该理解这是他们当时看到的完整版本。
  • 该程序可能不使用任何第三方代码来计算差异。
  • 语法突出显示输出是可选的。如果程序为语法着色,则它可能不使用任何第三方代码来这样做。
  • 输出将是动画GIF。
  • 该程序可能使用第三方库来创作GIF。
  • 这是一次,因此,按照此站点上的人气竞赛的定义,投票最多的条目将获胜

这是一个简单的示例脚本,该脚本使用Python的ndiffPillow的基本动画GIF支持,并对每个添加和删除步骤进行动画处理:

我个人认为这是一项非常糟糕的工作。它不执行语法高亮显示,不尝试移动重新排列的代码块,不觉得有人正在现场编辑它,依此类推。它还打破了关于在关键帧上显示输入大小(以字节为单位)的规则,并且使用第三方库进行区分。有很大的改进空间!

希望这些受欢迎的条目也将成为codegolf.stackexchange.com社区有用的有趣工具。因此,如果程序易于他人使用和使用,将非常感激。


1
由于此处的扩展对话即将停止,因此清除了评论。关于这个帖子的讨论可以在这个元问题上找到。
门把手

Answers:


11

(OP)

在此处输入图片说明

这基于问题中的示例Python脚本。

我使用最简单的编辑距离,而不是巧妙的耐心差异。

为了比对基因组,使用了多序列比对算法,与仅考虑每对相邻的框架相比,它们可以做得更好。

我感到惊讶的是,实现差异的编辑距离非常简单,并使其与Python的difflib.ndiff格式兼容。在网上可以找到许多Python的编辑距离实现,但是我认为我的说法有点琐碎,并且也处理了实际确定表中路径的棘手但必不可少的部分。在我们的上下文中,我们需要知道将一个步骤变成另一个步骤的步骤,而不仅仅是步骤的数量。

我介绍了使用一个非常简单的标记器突出显示语法的功能,该标记器应该能够处理大多数类似c的语言,包括其宽松性,Python等。它将源分为标点,空格,字符串(带有转义支持),其他所有内容都是一个标识符,并对照关键字列表进行检查。该着色也很容易改变。

将语法突出显示集成到动态语言很容易;荧光笔输出一个字符和颜色对的列表,而区别在于它的差异字符串还是可比较对象的任意可迭代项!先突出显示然后进行差异化的有趣且故意的效果是,保持不变但颜色改变的字符会获得动画效果。我不想计算每个帧的高光,因为这意味着删除删除字符串时,会突然将一大段文本闪烁为字符串。

Python对创作GIF的支持非常有限。PIL不这样做,而Pillow则做得很糟糕。我使用枕头,但随后必须遍历gifsicle进行压缩并添加循环等;枕头不能正确编写帧时序,也不能让您管理处理方法等,这很遗憾,因为与处理扁平帧的后处理步骤相比,差异对场景的理解要好得多:((

源代码


1
我实现了相同的差异算法。后来我用Cython重写了它,并获得了100倍的加速。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.