Code Golf Animasyonu


28

Birkaç karaktere ulaşan kod-golf girişleri gördüğümde, kodu aşağı çekerken, yan yana bir fark için düzenleme geçmişine bakarım. Gör ve öğren :)

Bu zorluk en güzel animasyonlu farkları üreten bir program yapmaktır.

  • Giriş, sipariş edilen herhangi bir metin sürümü serisi olacaktır.
  • Program herhangi bir programlama dilinde yazılabilir.
  • Programın bazı özel programlama dillerinde veri girişi yapmak için kendini sınırlamasına izin verilir.
  • Program belirli girdi verilerine göre ayarlanmamalıdır; Program genel olmalı ve sıralı metin sürümleri dizisi için çalışmalıdır.
  • Girdideki her sürüm için, sürümün tam metninin görüntülendiği çıktı animasyonunda karşılık gelen bir zaman olmalıdır. Sürüm aşamaları arasındaki farkı canlandırmalısınız ve tüm sürüm aşamaları çıktıda sırada bulunmalıdır. Bu ana karelerde, sürüm boyutu gösterilmeli ve izleyici bunun bu noktada gördükleri tam bir sürüm olduğunu anlamalıdır.
  • Program, farklılıkları hesaplamak için herhangi bir üçüncü taraf kodunu kullanamaz.
  • Sözdizimi vurgulama çıkışı isteğe bağlıdır. Programın sözdizimi renklendirirse, bunu yapmak için herhangi bir üçüncü taraf kodunu kullanmayabilir.
  • Çıktı, animasyonlu bir GIF olacaktır.
  • Program GIF'yi yazmak için üçüncü taraf bir kütüphane kullanabilir.
  • Bu bir , bu yüzden bu sitedeki popülerlik yarışması tanımına göre en çok oy alan giriş kazanır .

İşte basit bir örnek senaryo Python'un kullanır ndiff ve Pillow en ilkel animasyonlu GIF desteği ve her eklenti ve kaldır adımını animasyon uygulanmaktadır:

Şahsen ben bu oldukça zayıf bir iş olduğunu düşünüyorum. Sözdizimi vurgusu yapmaz, yeniden düzenlenmiş kod parçalarını denemez ve taşımaz, birisinin canlı düzenleme yaptığı gibi hissetmez, vb. Aynı zamanda, girdilerin bayt cinsinden anahtar karelerde gösterilmesiyle ilgili kuralları da ihlal eder ve farklılığı yapmak için üçüncü taraf bir kitaplık kullanır. İyileştirilmesi için oda bir sürü!

Ve umarım popüler girişler, codegolf.stackexchange.com topluluğu için de eğlenceli araçlar haline gelir. Bu nedenle, programların başkalarının çalıştırması ve kullanması kolay olduğu takdirde takdir edilir.


1
Buradaki genişletilmiş görüşmenin durduğu gibi görünen yorumlar silindi. Bu yazı hakkında tartışma bu meta soruda bulunabilir .
Doorknob

Yanıtlar:


11

(OP)

görüntü tanımını buraya girin

Bu sorudaki Python betiğini temel alır.

Daha zeki bir sabrı fark yerine, en basit kurgu mesafesini kullandım.

Genomları hizalamak için Çok Sıralı Hizalama algoritmaları var ve her bir bitişik kare düşüncesinden daha iyi bir iş çıkarabilirler mi?

Fark için düzenleme mesafesini uygulamanın ne kadar kolay olduğunu şaşırdım ve Python'un difflib.ndiffformatıyla uyumlu hale getirdim . Web'de bulunacak düzenleme mesafesinin bol miktarda Python uygulaması var, ancak formülasyonumun biraz daha derli toplu olduğunu ve tablodaki yolu belirlemenin zor ama zorunlu bir kısmıyla ilgilendiğini düşünüyorum; Bağlamımızda, bir başkasını çevirme adımlarını bilmemiz gerekiyor, sadece kaç adım olduğunu değil.

Python ve benzerleri de dahil olmak üzere çoğu c benzeri dille başa çıkması gereken çok basit bir belirteç kullanarak vurgulama sözdizimi tanıttım . Kaynağı noktalama işaretlerine, boşluklara, dizelere (kaçış desteğiyle) ayırır ve diğer her şey bir tanımlayıcıdır ve bir anahtar kelime listesine göre kontrol edilir. Renklendirme de değişime kolaydır.

Dinamik bir dilin vurgulanmasını vurgulamak kolaydı; Vurgulayıcı, bir karakter ve renk çiftlerinin bir listesini çıkarır ve farklılık, farklı dizgilerin veya karşılaştırılabilir herhangi bir rastgele yinelemenin herhangi bir yinelemeli olup olmadığına göre belirgin değildir! İlk önce vurgulamanın ve daha sonra farklılaştırmanın ilginç ve kasıtlı bir etkisi, değişmeden kalan ancak renk değiştiren karakterlerin canlandırılmasıdır. Vurgulamayı her kareyi hesaplamak istemedim, bunun anlamı bir kapanış dizesini sildiğinizde aniden büyük bir metin yığınını dizeceğe çevirirsiniz.

Python’un GIF’e yazma desteği oldukça sınırlıdır. PIL yapmaz ve Pillow çok kötü şekilde yapar. Yastık kullanıyorum, ancak sonra döngü vb eklemek ve eklemek için gifsicle ile koşmak zorunda; Pillow, çerçeve zamanlamasını doğru bir şekilde yazmaz ve bertaraf yöntemlerini yönetmenize izin vermez, çünkü farklılığı sahneyi düzleştirilmiş çerçevelerle işleyen bir son işlem adımından çok daha iyi anladığı için ayıptır :(

Kaynak kodu


1
Aynı fark algoritmasını kullandım. Daha sonra Cython kullanarak yeniden yazdım ve 100x hız kazandım.
Ray
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.