El reto
Los GIF son el formato de imagen más común para la animación, y se usan bastante en las redes sociales actuales. Para el propósito de este desafío, voy a redefinir lo que puede ser un GIF. Este desafío requerirá que tome una matriz 3D que contenga algún tipo de representación de una 'imagen' 2D e itere a través de ellas, mostrando una animación. Esta animación se puede hacer en cualquier lugar, en un GIF, en su consola, en una GUI, etc. la entrega no importa, siempre y cuando sea animada.
La entrada
- Una matriz 3D donde los datos dentro de alguna manera representan una imagen 2D.
- La matriz puede contener datos RGB, datos verdaderos / falsos o cualquier otra cosa que considere conveniente.
- También estoy de acuerdo con que lo reduzca a una matriz 2D de cadenas o algo similar, pero la animación debe ser una animación 2D .
- El tiempo entre cada cuadro en un formato de su elección (Segundos, Milisegundos, etc.).
- La gente me pregunta si TIENEN que incluir o no la duración. Mi respuesta es "meh", siempre que pueda mostrar animación. Me preocupa más que se adhiera al parámetro "Array" que este, lo que significa que no hay animaciones aleatorias.
La salida
- Una secuencia de salida perfectamente iterada que se parece a una animación 2D con el retraso correcto en cada transición en función de la entrada de valor.
Las normas
- La salida puede ser, pero no se limita a:
- Imagen GIF
- Animación GUI (mi ejemplo).
- Animación en consola.
- Honestamente, cualquier "animación" que creas conveniente, siempre y cuando siga las siguientes reglas.
- Al generar su imagen, debe borrar la consola antes de mostrar el siguiente cuadro, no puede simplemente imprimirlos secuencialmente.
- Emular una consola "limpia" también es aceptable, siempre y cuando parezca una animación perfecta (vea la pista debajo de mi ejemplo para obtener más información sobre lo que quiero decir).
- Independientemente de la implementación, su animación debe repetirse para siempre o hasta que se detenga.
- El "bucle" puede ser tan simple como
while(true){}
una recursión infinita, puede suponer que el usuario quiere ver esta obra maestra hasta que presione "Ctrl + C".
- El "bucle" puede ser tan simple como
- Debe poder manejar 'imágenes' en 2D de cualquier tamaño, si su idioma está limitado por los tamaños del búfer, esto es aceptable y puede indicarlo en su explicación.
- Las lagunas estándar no están permitidas.
Ejemplo de E / S
Entrada (matriz 3D, retraso)
f([
[[1,0,0],
[0,0,0],
[0,0,0]],
[[0,0,0],
[0,1,0],
[0,0,0]],
[[0,0,0],
[0,0,0],
[0,0,1]],
], 1)
Salida (Ejemplo, Bytes 2020 - Java)
import javax.swing.JFrame;
import javax.swing.JTextArea;
/**
* Simple GIF class to animate a 3D integer array in a swing text area.
* (Clearing the console in java isn't something you really do, so I chose
* java on purpose to make it an extremely ungolf-able answer that someone
* wouldn't bother to steal).
*/
public class Gif implements Runnable {
/**
* The output area.
*/
private final JTextArea area;
/**
* The list of images.
*/
private final int[][][] images;
/**
* The delay between image transitions.
*/
private final long transitionDelay;
/**
* Main method, instantiates a GIF object and runs it.
* @param args Does absolutely nothing.
*/
public static void main(String[] args) {
final int[][][] images = {{{1,0,0},{0,0,0},{0,0,0}},{{0,0,0},{0,1,0},{0,0,0}},{{0,0,0},{0,0,0},{0,0,1}}};
final long transitionDelay = 1000L;
new Thread(new Gif(images, transitionDelay)).start();
}
/**
* Constructor for a GIF, takes in a 3D array of images and a transition
* delay to wait between transitioning the images.
* @param images The list of images.
* @param delay The delay between each image.
*/
public Gif(int[][][] images, long transitionDelay) {
this.images = images;
this.transitionDelay = transitionDelay;
this.area = new JTextArea();
final JFrame frame = new JFrame("It's a GIF!");
frame.setSize(10,100);
frame.add(area);
frame.setVisible(true);
}
/**
* When run, it will alter the area to imitate an animated GIF.
*/
@Override
public void run() {
while (true) {
for (int i = 0; i < images.length; i++) {
final StringBuffer frame = new StringBuffer();
for (int j = 0; j < images[i].length; j++) {
for (int k = 0; k < images[i][j].length; k++) {
frame.append("" + images[i][j][k]);
}
frame.append("\n");
}
this.area.setText(frame.toString());
try{Thread.sleep(transitionDelay);}catch(Exception e){}
this.area.setText("");
}
}
}
}
Esto da como resultado una GUI de swing emergente, animando la matriz:
SUGERENCIA SUGERENCIA: use un idioma donde sea posible limpiar la consola o especifique por qué lo que está haciendo terminará con un resultado que parece una animación en el idioma que eligió. Creo que algunos idiomas tienen tamaños de búfer predeterminados en sus consolas, puede usar esto para su ventaja, pero espero una explicación o ejemplo. Solo porque produzco mi animación como una cadena, no es necesario; Podría haber usado con la misma facilidad 0 para negro y 1 para blanco y crear un GIF real.
Juzgar
Este es el código de golf, el conteo de bytes más bajo gana (entradas excluidas).
También haré +1 en cualquier persona que use un idioma de manera genial o inesperada.
Respuestas:
MATL ,
161211 bytesLa entrada es una matriz de celdas de 2D. Por ejemplo:
El tiempo de pausa está
1
en el código. Se puede cambiar a cualquier número real, como.5
o `.2.¡Pruébalo en MATL Online! (Si no funciona, actualice la página y presione "Ejecutar" nuevamente).
La entrada también puede ser una matriz de celdas de matrices de caracteres 2D. Por ejemplo:
¡Prueba este también!
Explicación
fuente
[0.2 0 0.2;0 0.2 0] ...
, y así reducirxx
ax
, y evitar1G
y2G
? Creo que se adhiere a las reglas. Es necesario añadir unos pocos bytes con el fin de convertir0.2
a1
, si no quiere0.2
saltar alrededor, por supuesto, y de alguna manera para almacenar el valor de pausa. Todavía creo que podría reducir el conteo de bytes :) :)Octava,
565447 bytesSe eliminó la posibilidad de ingresar el tiempo de pausa como parte de la matriz de entrada. Estaba muy satisfecho con él, así que eche un vistazo en el historial de edición si desea echar un vistazo. Esta solución es 7 bytes más corta.
La entrada será algo como esto:
[4 0 0 4;0 4 4 0;4 0 0 0]
donde será una matriz de dimensiones 3x4, y el tiempo de pausa deseado es de 4 segundos.Muestra una gráfica como la siguiente, pero alterna entre mostrar los valores verdadero y falso de la entrada. Entonces, todos los puntos azules se volverán blancos en la próxima iteración, y todos los blancos se volverán azules.
En la siguiente gráfica, utilicé la entrada
rand(10,10)>0.6*2
. Esto significa que tendrá dimensiones de 10x10, y todos los elementos de la matriz aleatoria que sean mayores que 0.6 serán verdaderos. Después de eso, lo multiplico por el tiempo de pausa deseado, 2 segundos. Aquí utilicé una matriz aleatoria, pero también podría haber creado la matriz manualmente.No tengo Octave instalado en esta computadora, así que hice una pequeña modificación para que esto funcione en MATLAB. Es exactamente el mismo principio, pero
n=~n
no funciona en MATLAB.fuente
sed
14113490-51 gracias a seshoumara
Entrada: Primero toma cada fotograma separado por una línea con un solo espacio y luego muestra el siguiente fotograma después de recibir cada línea en blanco (parece un flipbook). Mínimo 3 cuadros.
Por defecto en mi sistema (Windows 7) cuando abro cygwin tiene 24 líneas verticalmente. Entre cuadros, siempre hay al menos esa cantidad de líneas en blanco impresas. Esto efectivamente borra la pantalla.
Más de 1/3 de los bytes provienen de limpiar la consola. Estoy seguro de que hay una mejor manera.
fuente
p
comando como parte des///p
, más 6 bytes más al eliminar/^\n/!
antesP
, lo que creo que no es necesario. Por el esfuerzo, +1, aunque también estoy seguro de que hay una mejor manera.sed
, pero por alguna razón no funciona concat
oecho
.echo -e "\e[2Jtest"
. Con cat, el carácter de escape ya debe estar en el archivo / entrada, intenteecho -e "\e[2Jtest"|cat -n
desplazarse hacia arriba.GNU sed,
8884 + 1 (n flag) = 85 bytesEditar: 3 bytes menos gracias a Riley
El formato de entrada es un cuadro de animación por línea. Para varias líneas de salida en un marco, use una coma como separador. Como ejecuto el programa en una consola Linux, el tamaño máximo de imagen disponible (medido en filas y columnas) depende del tamaño de la ventana del terminal. La pausa entre dos cuadros se realiza mediante el comando sleep shell; para obtener una llamada de animación más rápida
esleep 0.4
(segundos).¡La mejor parte es que apoyo la animación en color! Para hacer esto, utilicé las llamadas secuencias de escape ANSI para controlar la fuente del texto, el primer plano y el color de fondo, además de la posición del cursor, para poder borrar la pantalla antes de cada fotograma (código
ESC[2J
). Para agregar información de color, use el siguiente formato en la entrada, que se explica mejor aquí .Correr:
Ejemplos: para cada prueba, se capturaron 2 ciclos de animación y se guardaron en formato GIF de imagen (disculpas por la baja resolución)
Pausa de 0,4 segundos
1 segundo por defecto
Explicación:
fuente
1h;1d;H;
conH;1h;
Ruby,
8945 bytesEl
^[
es un personaje de escape.Hexdump:
Ahorrado un montón de bytes gracias a @Jordan
fuente
->h,t{h.cycle{|x|puts"^[[2J",x.map(&:join)}}
Lua ( LÖVE ),
296287 bytesEjemplo de uso
Salida : https://youtu.be/0kDhPbbyG9E
fuente
SmallBasic, 167 bytes
Como parámetro, defina y establezca la variable global i! Lamentablemente, SmallBasic no admite parámetros para sus propias subrutinas.
fuente