Animación de Code Golf

28

Cuando veo entradas de código de golf que eliminan algunos caracteres, reduciendo el código, miro el historial de edición para ver una diferencia de lado a lado. Mira y aprende :)

Este desafío es hacer un programa que produzca las diferencias animadas más bonitas.

  • La entrada será cualquier serie ordenada de versiones de texto.
  • El programa puede estar escrito en cualquier lenguaje de programación.
  • Se permite que el programa se limite a sí mismo para ingresar datos en algunos lenguajes de programación específicos.
  • El programa no debe ajustarse a los datos de entrada específicos; El programa debe ser genérico y funcionar para cualquier serie ordenada de versiones de texto.
  • Para cada versión en la entrada debe haber un tiempo correspondiente en la animación de salida donde se muestra el texto completo de la versión. Debe animar la diferencia entre las etapas de la versión, y todas las etapas de la versión deben estar presentes y en orden en la salida. En estos cuadros clave, se debe mostrar el tamaño de la versión y el espectador debe comprender que esta es una versión completa que están viendo en ese momento.
  • El programa no puede usar ningún código de terceros para calcular los diferenciales.
  • La salida de resaltado de sintaxis es opcional. Si el programa colorea la sintaxis, no puede usar ningún código de terceros para hacerlo.
  • La salida será un GIF animado.
  • El programa puede usar una biblioteca de terceros para crear el GIF.
  • Este es un , por lo que según la definición de concurso de popularidad en este sitio, gana la entrada con más votos .

Aquí hay un script de ejemplo simple que usa el ndiff de Python y el rudimentario soporte animado GIF de Pillow y anima cada paso de agregar y quitar:

Personalmente, creo que este es un trabajo bastante pobre. No resalta la sintaxis, no trata de mover fragmentos de código que se reorganizan, no parece que alguien lo esté editando en vivo, y así sucesivamente. También rompe las reglas respecto a mostrar el tamaño de la entrada en bytes en cuadros clave, y utiliza una biblioteca de terceros para hacer la diferencia. Mucho espacio para mejorar!

Y esperamos que las entradas populares se conviertan en útiles herramientas divertidas para la comunidad codegolf.stackexchange.com también. Por lo tanto, se agradece que los programas sean fáciles de ejecutar y usar para otros.

Será
fuente
1
Los comentarios se purgaron cuando la conversación extendida aquí parece detenerse. La discusión sobre esta publicación se puede encontrar en esta meta pregunta .
Pomo de la puerta

Respuestas:

11

(OP)

ingrese la descripción de la imagen aquí

Esto se basa en el script Python de ejemplo en la pregunta.

Utilicé la distancia de edición más simple en lugar de una diferencia de paciencia más inteligente.

Para alinear genomas, hay algoritmos de alineación de secuencia múltiple y podrían hacer un trabajo aún mejor que solo considerar cada par de cuadros adyacentes.

Me sorprendió gratamente lo sencillo que era implementar la distancia de edición para el diff, y lo hice compatible con el difflib.ndiffformato de Python . Hay muchas implementaciones de Python de distancia de edición que se pueden encontrar en la web, pero creo que mi formulación es un poco más ordenada y se ocupa de la parte difícil pero esencial de determinar realmente la ruta en la tabla; en nuestro contexto, necesitamos saber los pasos para convertir uno en otro y no solo cuántos pasos hay.

Introduje el resaltado de sintaxis utilizando un tokenizador muy simple que debería ser capaz de hacer frente a la mayoría de los lenguajes tipo c, incluidos, por su laxitud, Python y demás. Divide la fuente en signos de puntuación, espacios en blanco, cadenas (con soporte de escape) y todo lo demás es un identificador y se compara con una lista de palabras clave. El color también es fácil de cambiar.

Fue fácil integrar el resaltado de sintaxis en un lenguaje dinámico; el resaltador genera una lista de pares de caracteres y colores, y la diferencia es independiente de si se trata de cadenas diferentes o cualquier iteración arbitraria de comparables. Un efecto interesante, y deliberado, de resaltar primero y luego diferenciar es que los personajes que permanecen sin cambios pero cambian de color se animan. No quería calcular el resaltado de cada fotograma, ya que eso significaría que al eliminar una cadena de cierre, de repente parpadearía un gran fragmento de texto como cadena.

El soporte de Python para crear GIF es bastante limitado. PIL no lo hace, y Pillow lo hace bastante mal. Yo uso Pillow, pero luego tengo que correr a través de gifsicle para comprimir y agregar bucles, etc. Pillow no escribe correctamente la temporización del cuadro y no le permite administrar métodos de eliminación, etc., lo cual es una pena, ya que la diferencia tiene una comprensión mucho mejor de la escena que un paso posterior al procesamiento que trata de cuadros aplanados :(

Código fuente

Será
fuente
1
Implementé el mismo algoritmo diff. Más tarde lo reescribí usando Cython y obtuve una aceleración de 100x.
Ray