コードゴルフのアニメーション


28

いくつかの文字を落とし、コードを削るコードゴルフエントリが表示されたら、横並びのdiffの編集履歴を確認します。見て、学ぶ:)

この課題は、最も美しいアニメーションdiffを生成するプログラムを作成することです。

  • 入力は、順序付けられた一連のテキストバージョンになります。
  • プログラムは、任意のプログラミング言語で作成できます。
  • プログラムは、特定のプログラミング言語の入力データにプログラム自体を制限することが許可されています。
  • プログラムは特定の入力データに合わせて調整しないでください。プログラムは汎用で、順序付けられた一連のテキストバージョンで機能する必要があります。
  • 入力のバージョンごとに、バージョンの全文が表示される出力アニメーションに対応する時間が必要です。バージョンステージ間の差分をアニメーション化する必要があり、すべてのバージョンステージが出力に順番に存在している必要があります。これらのキーフレームでは、バージョンサイズを表示する必要があり、視聴者はこれがその時点で見ている完全なバージョンであることを理解する必要があります。
  • プログラムは、差分の計算にサードパーティのコードを使用することはできません。
  • 構文強調表示の出力はオプションです。プログラムが構文を色付けする場合、サードパーティのコードを使用して色付けすることはできません。
  • 出力は、アニメーションGIFになります。
  • プログラムは、サードパーティのライブラリを使用してGIFを作成する場合があります。
  • これはので、このサイトの人気コンテストの定義に従って、最も投票数の多いエントリが勝ちます。

PythonのndiffPillowの初歩的なアニメーションGIFサポートを使用し、追加と削除の各ステップをアニメーション化する簡単なスクリプトの例を次に示します

個人的には、これはかなり悪い仕事だと思います。構文の強調表示は行わず、再配置されたコードチャンクを移動しようとすることも、誰かがライブで編集しているように感じることもありません。また、キーフレームの入力サイズをバイト単位で表示することに関する規則を破り、サードパーティのライブラリを使用して差分を作成します。改善の余地がたくさん!

そして、できれば、人気のあるエントリがcodegolf.stackexchange.comコミュニティにとっても便利な楽しいツールになることを願っています。そのため、他の人がプログラムを簡単に実行して使用できるようになれば幸いです。


1
ここでの拡張会話が停止するようになっているようにコメントがパージされました。この質問に関するこの投稿に関する議論を見つけることができます。
ドアノブ

回答:


11

(OP)

ここに画像の説明を入力してください

これは、質問のPythonスクリプトの例に基づいています。

巧妙な忍耐の違いではなく、最も単純な編集距離を使用しました。

ゲノムのアライメントにはマルチシーケンスアラインメントアルゴリズムがあり、隣接するフレームの各ペアを検討するよりもさらに良い仕事をすることができますか?

diffの編集距離を実装するのがどれほど簡単か、そしてPythonのdifflib.ndiffフォーマットと互換性があることを嬉しく思いました。編集距離のPython実装はウェブ上にたくさんありますが、私の定式化は少し整然としており、実際にテーブル内のパスを決定する上でトリッキーですが重要な部分を扱っていると思います。私たちの文脈では、ステップの数だけでなく、別のステップに切り替えるためのステップを知る必要があります。

私は、非常に単純なトークナイザーを使用して構文の強調表示を導入しました。ソースを句読点、空白、文字列(エスケープサポート付き)に分割し、それ以外はすべて識別子であり、キーワードのリストに対してチェックされます。着色はまた、変更が容易です。

構文強調表示を動的言語に統合するのは簡単でした。蛍光ペンは、文字と色のペアのリストを出力します。違いは、その文字列が異なるか、同等の任意のイテラブルであるかを区別しません!最初にハイライトを行い、次に差分を作成することの興味深い-意図的な効果は、変更されないままで色が変わる文字がアニメーション化されることです。各フレームのハイライトを計算したくありませんでした。これは、閉じている文字列を削除すると、突然大量のテキストが文字列としてフラッシュされることを意味するためです。

GIFのオーサリングに対するPythonのサポートはかなり制限されています。PILはそれを行わず、Pillowはかなりひどく行います。Pillowを使用しますが、gifsicleを実行して、ループなどを圧縮および追加する必要があります。Pillowはフレームタイミングを正しく記述せず、廃棄方法などを管理できません。これは、フラット化されたフレームを処理する後処理ステップよりもシーンの理解が非常に優れているため、残念です。

ソースコード


1
同じdiffアルゴリズムを実装しました。その後、Cythonを使用して書き直し、100倍の高速化を実現しました。
レイ14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.