O desafio
GIFs são o formato de imagem mais comum para animação e são usados bastante nas mídias sociais atuais. Para o objetivo deste desafio, vou redefinir o que um GIF pode ser. Esse desafio exigirá que você pegue uma matriz 3D que contenha algum tipo de representação de uma 'imagem' 2D e itere através dela, exibindo uma animação. Essa animação pode ser feita em qualquer lugar, em um GIF, no seu console, em uma GUI, etc; a entrega não importa, desde que seja animada.
A entrada
- Uma matriz 3D onde os dados dentro de alguma forma representam uma imagem 2D.
- A matriz pode conter dados RGB, dados verdadeiros / falsos ou qualquer outra coisa que você achar melhor.
- Também estou bem com você modificando-o para uma matriz 2D de seqüências de caracteres ou algo semelhante, mas a animação deve ser uma animação 2D .
- O tempo entre cada quadro em um formato de sua escolha (segundos, milissegundos, etc ...).
- As pessoas me perguntam se têm ou não que incluir a duração da duração. Minha resposta é "meh", desde que você seja capaz de mostrar animação. Estou mais preocupado que você adira ao parâmetro "Matriz" do que este, o que significa que não há animações aleatórias.
A saída
- Uma sequência de saída perfeitamente iterada que se parece com uma animação 2D com o atraso correto em cada transição com base na entrada de valor.
As regras
- A saída pode ser, mas não está limitada a:
- Imagem GIF.
- Animação GUI (meu exemplo).
- Animação no console.
- Honestamente, qualquer "animação" que você achar conveniente, desde que siga as regras abaixo.
- Ao produzir sua imagem, você deve limpar o console antes de mostrar o próximo quadro, não pode imprimi-las apenas sequencialmente.
- Emular um console "claro" também é aceitável, desde que pareça uma animação contínua (veja a dica no meu exemplo para obter mais informações sobre o que quero dizer).
- Independentemente da implementação, sua animação deve repetir para sempre ou até parar.
- O "looping" pode ser tão simples quanto
while(true){}
uma recursão infinita; você pode assumir que o usuário deseja visualizar esta obra-prima até clicar em "ctrl + c".
- O "looping" pode ser tão simples quanto
- Você deve poder manipular 'imagens' 2D de qualquer tamanho, se o seu idioma for limitado por tamanhos de buffer, isso é aceitável e você pode declarar isso na sua explicação.
- As brechas padrão não são permitidas.
Exemplo de E / S
Entrada (matriz 3D, atraso)
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)
Saída (exemplo, 2020 bytes - 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("");
}
}
}
}
Isso resulta em uma GUI de balanço aparecendo, animando a matriz:
SUGESTÃO: Use um idioma em que a limpeza do console seja possível ou especifique por que o que você está fazendo terminará com um resultado que se parece com uma animação no idioma escolhido. Acho que alguns idiomas têm tamanhos de buffer padrão em seus consoles, você pode usar isso para sua vantagem, mas espero uma explicação ou exemplo. Só porque eu mostro minha animação como uma string, você não precisa; Eu poderia facilmente usar 0 para preto e 1 para branco e criar um GIF real.
A julgar
Isso é código-golfe, menor número de bytes ganhos (entradas excluídas).
Marcarei com +1 qualquer pessoa que use um idioma de uma maneira interessante ou inesperada.