Ketika saya melihat entri kode-golf yang menjatuhkan beberapa karakter, mengurangi kodenya, saya melihat histori edit untuk perbedaan sisi-demi-sisi. Lihat dan pelajari :)
Tantangan ini adalah membuat program yang menghasilkan diff animasi tercantik.
- Masukan akan berupa serangkaian versi teks yang dipesan
- Program dapat ditulis dalam bahasa pemrograman apa pun.
- Program diizinkan membatasi input data dalam beberapa bahasa pemrograman tertentu.
- Program tidak boleh disetel ke data input spesifik; program harus generik dan berfungsi untuk serangkaian versi teks yang dipesan.
- Untuk setiap versi dalam input harus ada waktu yang sesuai dalam animasi output di mana teks lengkap versi ditampilkan. Anda harus menghidupkan perbedaan antara tahap versi, dan semua tahap versi harus ada dan dalam urutan dalam output. Pada bingkai kunci ini, ukuran versi harus diperlihatkan dan pemirsa harus memahami bahwa ini adalah versi lengkap yang mereka lihat pada saat itu.
- Program tidak boleh menggunakan kode pihak ketiga apa pun untuk menghitung diff.
- Output penyorotan sintaks adalah opsional. Jika program mewarnai sintaksis, program tersebut mungkin tidak menggunakan kode pihak ketiga mana pun untuk melakukannya.
- Outputnya akan menjadi GIF animasi.
- Program ini dapat menggunakan perpustakaan pihak ketiga untuk membuat GIF.
- Ini adalah kontes popularitas , sehingga sesuai definisi kontes popularitas di situs ini, entri dengan suara terbanyak menang .
Berikut ini adalah contoh skrip sederhana yang menggunakan dukungan GIF animasi ndiff dan ruddding dan bantal dari masing-masing Python untuk menambah dan menghapus langkah:
Secara pribadi, saya pikir ini pekerjaan yang sangat buruk. Itu tidak melakukan penyorotan sintaks, tidak mencoba dan memindahkan potongan kode yang disusun ulang, tidak terasa seperti seseorang hidup mengeditnya, dan sebagainya. Itu juga melanggar aturan tentang menampilkan ukuran input dalam byte pada frame kunci, dan menggunakan perpustakaan pihak ketiga untuk melakukan pembeda. Banyak ruang untuk perbaikan!
Dan mudah-mudahan entri populer itu akan menjadi alat menyenangkan yang berguna untuk komunitas codegolf.stackexchange.com juga. Jadi sangat dihargai jika program mudah bagi orang lain untuk berjalan dan digunakan.
Jawaban:
(OP)
Ini didasarkan pada contoh skrip Python dalam pertanyaan.
Saya menggunakan jarak edit yang paling sederhana daripada perbedaan kesabaran yang lebih pintar.
Untuk menyelaraskan genom ada algoritma Multi Sequence Alignment dan mereka bisa membuat pekerjaan yang lebih baik daripada hanya mempertimbangkan setiap pasangan frame yang berdekatan?
Saya terkejut betapa mudahnya menerapkan jarak edit untuk diff, dan membuatnya kompatibel dengan
difflib.ndiff
format Python . Ada banyak implementasi Python dari jarak edit yang dapat ditemukan di web, tapi saya pikir formulasi saya sedikit lebih rapi dan berhubungan dengan bagian yang rumit tetapi penting untuk benar-benar menentukan jalur dalam tabel juga; dalam konteks kita, kita perlu mengetahui langkah-langkah untuk mengubah satu menjadi yang lain dan bukan hanya berapa banyak langkah yang ada.Saya memperkenalkan penyorotan sintaksis menggunakan tokenizer yang sangat sederhana yang seharusnya dapat mengatasi sebagian besar bahasa c-like termasuk, dengan kelemahannya, Python dan semacamnya. Itu membagi sumber menjadi tanda baca, spasi, string (dengan dukungan melarikan diri) dan yang lainnya adalah pengidentifikasi dan diperiksa terhadap daftar kata kunci. The pewarnaan ini juga mudah untuk perubahan.
Mudah untuk mengintegrasikan sintaks yang disorot ke dalam bahasa yang dinamis; highlighter menampilkan daftar pasangan karakter dan warna, dan perbedaannya adalah agnostik terhadap apakah string yang berbeda atau setiap item yang dapat diperbandingkan secara acak! Efek yang menarik - dan disengaja - dari penyorotan pertama dan kemudian berbeda adalah bahwa karakter yang tetap tidak berubah tetapi berubah warna dianimasikan. Saya tidak ingin menghitung sorot setiap frame karena itu berarti bahwa ketika Anda menghapus string penutup Anda tiba-tiba akan mem-flash sebagian besar teks sebagai string.
Dukungan Python untuk menulis GIF agak terbatas. PIL tidak melakukannya, dan Bantal melakukannya dengan buruk. Saya menggunakan Bantal, tetapi kemudian harus dijalankan melalui gifsicle untuk mengompres dan menambahkan perulangan dll; Bantal tidak menuliskan waktu bingkai dengan benar dan tidak membiarkan Anda mengelola metode pembuangan dll, yang memalukan karena perbedaannya memiliki pemahaman yang jauh lebih baik tentang adegan itu daripada langkah pasca-pemrosesan yang berhubungan dengan bingkai yang rata :(
Kode sumber
sumber