Animacja Code Golf

28

Kiedy widzę hasła do gry w golfa, które znokautują kilka znaków, zmniejszając kod, idę do historii edycji w celu porównania różnic. Zobacz i ucz się :)

Wyzwanie polega na stworzeniu programu, który produkuje najładniejsze animowane pliki różnicowe.

  • Wprowadzane będą dowolne uporządkowane serie wersji tekstowych.
  • Program może być napisany w dowolnym języku programowania.
  • Dozwolone jest, aby program sam ograniczał się do wprowadzania danych w niektórych określonych językach programowania.
  • Program nie powinien być dostosowany do konkretnych danych wejściowych; program powinien być ogólny i działać dla każdej zamówionej serii wersji tekstowych.
  • Dla każdej wersji na wejściu musi być odpowiedni czas w animacji wyjściowej, w której wyświetlany jest pełny tekst wersji. Musisz animować różnicę między etapami wersji, a wszystkie etapy wersji muszą być obecne i uporządkowane w danych wyjściowych. W tych kluczowych klatkach musi być pokazany rozmiar wersji, a widz powinien zrozumieć, że jest to pełna wersja, którą widzą w tym momencie.
  • Program nie może używać żadnego kodu strony trzeciej do obliczania różnic.
  • Podświetlanie składni jest opcjonalne. Jeśli program ma składnię kolorów, nie może do tego użyć kodu strony trzeciej.
  • Rezultatem będzie animowany GIF.
  • Program może wykorzystywać bibliotekę strony trzeciej do tworzenia GIF-ów.
  • To jest , więc zgodnie z definicją konkursu popularności na tej stronie wygrywa zgłoszenie z największą liczbą głosów .

Oto prosty przykładowy skrypt, który korzysta z ndiff Pythona i podstawowej obsługi animowanego GIF- a Pillowa i animuje każdy krok dodawania i usuwania:

Osobiście uważam, że to dość kiepska praca. Nie wykonuje podświetlania składni, nie próbuje przenosić fragmentów kodu, które ulegają zmianie, nie wydaje się, że ktoś je edytuje na żywo i tak dalej. Łamie także zasady dotyczące pokazywania wielkości danych wejściowych w bajtach w ramkach kluczowych i korzysta z biblioteki innej firmy do różnicowania. Dużo miejsca na ulepszenia!

Mamy nadzieję, że popularne wpisy staną się przydatnymi zabawnymi narzędziami dla społeczności codegolf.stackexchange.com. Jest to docenione, jeśli programy są łatwe w uruchomieniu dla innych.

Wola
źródło
1
Komentarze zostały wyczyszczone, ponieważ rozmowa tutaj wydaje się kończyć. Dyskusję na temat tego postu można znaleźć w tym meta pytaniu .
Klamka

Odpowiedzi:

11

(OP)

wprowadź opis zdjęcia tutaj

Jest to oparte na przykładowym skrypcie Python w pytaniu.

Użyłem najprostszej odległości edycji zamiast mądrzejszej różnicy cierpliwości.

Do wyrównywania genomów służą algorytmy Multi Sequence Alignment , które mogłyby zrobić jeszcze lepszą robotę niż rozważenie każdej pary sąsiednich ramek?

Byłem mile zaskoczony, jak proste było zaimplementowanie odległości edycji dla diff i uczyniłem ją kompatybilną z formatem Pythona difflib.ndiff. Istnieje wiele implementacji Pythona dotyczących odległości edytowania, które można znaleźć w Internecie, ale myślę, że moje sformułowanie jest nieco bardziej uporządkowane i dotyczy trudnej, ale istotnej części faktycznego określania ścieżki w tabeli; w naszym kontekście musimy znać kroki, aby zamienić jeden w drugi, a nie tylko liczbę kroków.

Wprowadziłem podświetlanie składni za pomocą bardzo prostego tokenizera, który powinien być w stanie poradzić sobie z większością języków podobnych do c, w tym ze względu na swoją wiotkość, Python i tym podobne. Dzieli źródło na interpunkcję, białe znaki, ciągi znaków (z obsługą znaków ucieczki), a wszystko inne jest identyfikatorem i sprawdzane na liście słów kluczowych. Kolorystyka jest również łatwe do zmiany.

Łatwo było zintegrować podświetlanie składni z dynamicznym językiem; zakreślacz wyświetla listę par znaków i kolorów, a różnica jest niezależna od tego, czy jej różne ciągi znaków, czy też dowolne iterowalne elementy porównywalne! Ciekawym - i celowym - efektem podświetlania najpierw, a następnie różnicowania jest to, że postacie, które pozostają niezmienione, ale zmieniają kolor, są animowane. Nie chciałem obliczać podświetlenia każdej klatki, ponieważ oznaczałoby to, że usuwając zamykający ciąg, nagle flashujesz dużą część tekstu jako ciąg.

Wsparcie Pythona w tworzeniu GIF-ów jest raczej ograniczone. PIL tego nie robi, a Pillow robi to raczej źle. Używam Pillow, ale potem muszę przebiec przez gifsicle, aby skompresować i dodać pętle itp .; Poduszka nie zapisuje poprawnie taktowania klatek i nie pozwala zarządzać metodami utylizacji itp., Co szkoda, ponieważ różni się o wiele lepiej rozumiejąc scenę niż etap przetwarzania końcowego spłaszczonych klatek :(

Kod źródłowy

Wola
źródło
1
Zaimplementowałem ten sam algorytm różnicowy. Później przepisałem go za pomocą Cython i uzyskałem przyspieszenie 100x.
Ray