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.