Die Herausforderung
GIFs sind das am häufigsten verwendete Bildformat für Animationen und werden in den heutigen sozialen Medien ziemlich häufig verwendet. Für diese Herausforderung werde ich neu definieren, was ein GIF sein kann. Für diese Herausforderung müssen Sie ein 3D-Array aufnehmen, das eine Art Darstellung eines 2D-Bilds enthält, und diese durchlaufen und eine Animation anzeigen. Diese Animation kann überall ausgeführt werden, in einem GIF, in Ihrer Konsole, in einer GUI usw.; Die Lieferung spielt keine Rolle, solange sie animiert ist.
Die Eingabe
- Ein 3D-Array, in dem die darin enthaltenen Daten irgendwie ein 2D-Bild darstellen.
- Das Array kann RGB-Daten, True / False-Daten oder alles andere enthalten, was Sie für richtig halten.
- Mir geht es auch gut, wenn Sie es auf ein 2D-Array von Zeichenfolgen oder ähnliches reduzieren, aber die Animation muss eine 2D-Animation sein .
- Die Zeit zwischen den einzelnen Bildern in einem Format Ihrer Wahl (Sekunden, Millisekunden usw.).
- Die Leute haben mich gefragt, ob sie die Dauer angeben müssen oder nicht. Meine Antwort lautet "meh", solange Sie Animationen anzeigen können. Ich mache mir mehr Sorgen, dass Sie sich an den Parameter "Array" halten als an diesen, was bedeutet, dass keine zufälligen Animationen vorhanden sind.
Die Ausgabe
- Eine nahtlos iterierte Sequenz von Ausgaben, die wie eine 2D-Animation mit der richtigen Verzögerung bei jedem Übergang basierend auf der Werteingabe aussieht.
Die Regeln
- Die Ausgabe kann sein, ist aber nicht beschränkt auf:
- GIF-Bild.
- GUI-Animation (mein Beispiel).
- In-Console-Animation.
- Ehrlich gesagt, jede "Animation", die Sie für richtig halten, solange sie den folgenden Regeln folgt.
- Wenn Sie Ihr Bild ausgeben, müssen Sie die Konsole löschen, bevor Sie das nächste Bild anzeigen. Sie können sie nicht einfach nacheinander drucken.
- Das Emulieren einer Konsole "clear" ist ebenfalls akzeptabel, solange sie wie eine nahtlose Animation aussieht (weitere Informationen zu meinen Begriffen finden Sie im Hinweis unter meinem Beispiel).
- Unabhängig von der Implementierung sollte Ihre Animation für immer oder bis zum Stopp wiederholt werden.
- Die "Schleife" kann so einfach wie
while(true){}
oder unendlich rekursiv sein. Sie können davon ausgehen, dass der Benutzer dieses Meisterwerk anzeigen möchte, bis er "Strg + C" drückt.
- Die "Schleife" kann so einfach wie
- Sie müssen in der Lage sein, 2D-Bilder jeder Größe zu verarbeiten. Wenn Ihre Sprache durch Puffergrößen begrenzt ist, ist dies akzeptabel und Sie können dies in Ihrer Erklärung angeben.
- Standardlücken sind nicht zulässig.
Beispiel E / A.
Eingabe (3D-Array, Verzögerung)
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)
Ausgabe (Beispiel, 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("");
}
}
}
}
Dies führt dazu, dass eine Swing-GUI angezeigt wird, die das Array animiert:
TIPP TIPP: Verwenden Sie eine Sprache, in der das Löschen der Konsole möglich ist, oder geben Sie an, warum das, was Sie tun, zu einem Ergebnis führt, das wie eine Animation in der von Ihnen ausgewählten Sprache aussieht. Ich denke, einige Sprachen haben Standardpuffergrößen auf ihren Konsolen. Sie können dies zu Ihrem Vorteil nutzen, aber ich erwarte eine Erklärung oder ein Beispiel. Nur weil ich meine Animation als Zeichenfolge ausgebe, müssen Sie das nicht tun. Ich hätte genauso gut 0 für Schwarz und 1 für Weiß verwenden und ein echtes GIF erstellen können.
Richten
Dies ist Code-Golf, niedrigste Byte-Anzahl gewinnt (Eingaben ausgeschlossen).
Ich werde +1 jeden, der eine Sprache auch cool oder unerwartet benutzt.