Animazione di Code Golf


28

Quando vedo le voci del code-golf che eliminano alcuni caratteri, riducendo il codice, vado a guardare la cronologia delle modifiche per una differenza side-by-side. Guarda e impara :)

Questa sfida è quella di creare un programma che produca le differenze animate più belle.

  • L'input sarà qualsiasi serie ordinata di versioni di testo.
  • Il programma può essere scritto in qualsiasi linguaggio di programmazione.
  • È consentito che il programma si limiti a inserire dati in alcuni linguaggi di programmazione specifici.
  • Il programma non deve essere sintonizzato sui dati di input specifici; il programma dovrebbe essere generico e funzionare per qualsiasi serie ordinata di versioni di testo.
  • Per ogni versione nell'input deve essere presente un tempo corrispondente nell'animazione di output in cui viene visualizzato il testo completo della versione. È necessario animare la differenza tra le fasi della versione e tutte le fasi della versione devono essere presenti e in ordine nell'output. Su questi fotogrammi chiave, la dimensione della versione deve essere mostrata e lo spettatore dovrebbe capire che questa è una versione completa che stanno vedendo a quel punto.
  • Il programma non può utilizzare alcun codice di terze parti per calcolare le differenze.
  • L'output di evidenziazione della sintassi è facoltativo. Se il programma colora la sintassi, non può utilizzare alcun codice di terze parti per farlo.
  • L'output sarà una GIF animata.
  • Il programma può utilizzare una libreria di terze parti per creare la GIF.
  • Questo è un , così come per la definizione di concorso di popolarità su questo sito, vince l'iscrizione con il maggior numero di voti .

Ecco un semplice script di esempio che utilizza il supporto GIF rudimentale animato di nythiff e Pillow di Python e anima ogni passaggio di aggiunta e rimozione:

Personalmente, penso che questo sia un lavoro piuttosto scadente. Non mette in evidenza l'evidenziazione della sintassi, non cerca di spostare blocchi di codice che vengono riorganizzati, non sembra che qualcuno lo stia modificando dal vivo e così via. Inoltre, infrange le regole relative alla visualizzazione della dimensione dell'input in byte sui fotogrammi chiave e utilizza una libreria di terze parti per eseguire il diffing. Un sacco di spazio per migliorare!

E si spera che le voci popolari diventeranno utili strumenti divertenti anche per la comunità codegolf.stackexchange.com. Quindi è apprezzato se i programmi sono facili da eseguire e utilizzare per gli altri.


1
I commenti sono stati eliminati mentre la conversazione estesa qui sembra fermarsi. La discussione su questo post è disponibile su questa meta domanda .
Maniglia della porta

Risposte:


11

(OPERAZIONE)

inserisci qui la descrizione dell'immagine

Questo si basa sull'esempio dello script Python nella domanda.

Ho usato la distanza di modifica più semplice piuttosto che una differenza di pazienza più intelligente.

Per allineare i genomi ci sono algoritmi di allineamento multi-sequenza e potrebbero fare un lavoro ancora migliore rispetto al solo considerare ogni coppia di frame adiacenti?

Sono stato piacevolmente sorpreso da quanto fosse semplice implementare la distanza di modifica per il diff e l'ho reso compatibile con il difflib.ndiffformato di Python . Ci sono molte implementazioni di Python per la modifica della distanza da trovare sul web, ma penso che la mia formulazione sia un po 'più ordinata e affronti la parte difficile ma essenziale per determinare effettivamente il percorso nella tabella; nel nostro contesto, dobbiamo conoscere i passaggi per trasformarne uno in un altro e non solo quanti passaggi ci sono.

Ho introdotto l'evidenziazione della sintassi usando un tokenizer molto semplice che dovrebbe essere in grado di far fronte alla maggior parte dei linguaggi di tipo c tra cui, per la sua lassità, Python e simili. Suddivide la fonte in punteggiatura, spazi bianchi, stringhe (con supporto di escape) e tutto il resto è un identificatore e confrontato con un elenco di parole chiave. Anche la colorazione è facile da cambiare.

È stato facile integrare l'evidenziazione della sintassi in un linguaggio dinamico; l'evidenziatore produce un elenco di coppie di caratteri e colori, e il diverso è agnostico al fatto che le sue stringhe differenti o qualsiasi iterabile arbitrario di elementi comparabili! Un effetto interessante - e deliberato - di evidenziare prima e poi diffondere è che i personaggi che rimangono invariati ma cambiano colore si animano. Non volevo calcolare l'evidenziazione di ogni fotogramma poiché ciò significherebbe che eliminando una stringa di chiusura, improvvisamente si fa lampeggiare un grosso pezzo di testo come stringa.

Il supporto di Python per la creazione di GIF è piuttosto limitato. PIL non lo fa e Pillow lo fa piuttosto male. Uso Pillow, ma poi devo passare attraverso gifsicle per comprimere e aggiungere loop ecc; Pillow non scrive correttamente i tempi dei fotogrammi e non consente di gestire i metodi di smaltimento ecc., Il che è un peccato poiché il diverso ha una comprensione della scena molto migliore rispetto a una fase di post-elaborazione che si occupa di fotogrammi appiattiti :(

Codice sorgente


1
Ho implementato lo stesso algoritmo diff. Più tardi l'ho riscritto usando Cython e ho guadagnato una velocità 100x.
Ray,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.