Tantangan
GIF adalah format gambar yang paling umum untuk animasi, dan digunakan cukup banyak di media sosial saat ini. Untuk tujuan tantangan ini, saya akan mendefinisikan kembali seperti apa GIF itu. Tantangan ini akan mengharuskan Anda untuk mengambil dalam array 3D yang berisi semacam representasi 'gambar' 2D dan beralih melalui mereka, menampilkan animasi. Animasi ini dapat dilakukan di mana saja, di GIF, di konsol Anda, di GUI, dll; pengiriman tidak masalah, asalkan animasi.
Input
- Array 3D di mana data di dalamnya mewakili gambar 2D.
- Array dapat berisi data RGB, data benar / salah atau apa pun yang Anda inginkan.
- Saya juga baik-baik saja dengan Anda membenamkannya ke array 2D string atau sesuatu yang serupa, tetapi animasi harus menjadi animasi 2D .
- Waktu antara setiap frame dalam format yang Anda pilih (Detik, Milidetik, dll ...).
- Orang-orang bertanya kepada saya apakah mereka HARUS memasukkan panjang durasi. Jawaban saya adalah "meh", selama Anda dapat menampilkan animasi. Saya lebih khawatir Anda mematuhi parameter "Array" daripada yang ini, artinya tidak ada animasi acak.
Hasil
- Urutan output yang diulang mulus yang terlihat seperti animasi 2D dengan penundaan yang tepat pada setiap transisi berdasarkan pada input nilai.
Aturan
- Output bisa, tetapi tidak terbatas pada:
- Gambar GIF.
- Animasi GUI (contoh saya).
- Animasi dalam konsol.
- Jujur saja, "animasi" apa saja yang Anda inginkan, asalkan mengikuti aturan di bawah ini.
- Saat mengeluarkan gambar Anda, Anda harus menghapus konsol sebelum menunjukkan bingkai berikutnya, Anda tidak bisa hanya mencetaknya secara berurutan.
- Meniru konsol "jelas" juga dapat diterima, asalkan terlihat seperti animasi yang mulus (lihat petunjuk di bawah contoh saya untuk informasi lebih lanjut tentang apa yang saya maksud).
- Terlepas dari implementasi, animasi Anda harus berulang selamanya, atau sampai berhenti.
- "Perulangan" dapat sesederhana
while(true){}
atau rekursi tak terbatas, Anda dapat menganggap pengguna ingin melihat karya besar ini sampai mereka menekan "ctrl + c".
- "Perulangan" dapat sesederhana
- Anda harus dapat menangani 'gambar' 2D ukuran apa pun, jika bahasa Anda dibatasi oleh ukuran buffer, ini dapat diterima dan Anda dapat menyatakan ini dalam penjelasan Anda.
- Celah standar tidak diijinkan.
Contoh I / O
Input (Array 3D, Tunda)
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)
Output (Contoh, 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("");
}
}
}
}
Ini menghasilkan GUI ayunan yang muncul, menganimasikan array:
PETUNJUK PETUNJUK: Gunakan bahasa yang memungkinkan pembersihan konsol, atau tentukan mengapa apa yang Anda lakukan akan berakhir dengan hasil yang terlihat seperti animasi dalam bahasa yang Anda pilih. Saya pikir beberapa bahasa memiliki ukuran buffer default pada konsol mereka, Anda dapat menggunakan ini untuk keuntungan Anda, tetapi saya mengharapkan penjelasan atau contoh. Hanya karena saya menampilkan animasi saya sebagai string, Anda tidak harus; Saya bisa saja dengan mudah menggunakan 0 untuk hitam dan 1 untuk putih dan membuat GIF nyata.
Menilai
Ini adalah kode-golf, kemenangan jumlah byte terendah (input tidak termasuk).
Saya akan memberi +1 kepada siapa saja yang menggunakan bahasa dengan cara yang keren atau tidak terduga.