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.
Jawaban:
MATL ,
161211 byteInput adalah array sel 2D. Sebagai contoh:
Waktu jeda adalah
1
dalam kode. Itu bisa diubah ke bilangan real apa saja, seperti.5
atau `.2.Cobalah di MATL Online! (Jika tidak berhasil, segarkan kembali halaman dan tekan "Run" lagi.)
Input juga bisa berupa larik sel array char 2D. Sebagai contoh:
Coba yang ini juga!
Penjelasan
sumber
[0.2 0 0.2;0 0.2 0] ...
, dan dengan demikian mengurangixx
untukx
, dan menghindari1G
dan2G
? Saya percaya itu mematuhi aturan. Anda perlu menambahkan beberapa byte untuk mengkonversi0.2
ke1
, kecuali jika Anda ingin0.2
melompat-lompat tentu saja, dan beberapa cara untuk menyimpan nilai menjeda. Saya masih berpikir itu bisa mengurangi hitungan byte :)Oktaf,
565447 byteMenghapus kemungkinan untuk memasukkan waktu jeda sebagai bagian dari matriks input. Saya sangat puas dengan itu, jadi lihatlah dalam riwayat edit jika Anda ingin melihatnya. Solusi ini lebih pendek 7 byte.
Input akan menjadi seperti ini:, di
[4 0 0 4;0 4 4 0;4 0 0 0]
mana ini akan menjadi matriks dimensi 3x4, dan waktu jeda yang diinginkan adalah 4 detik.Ini menampilkan plot seperti di bawah ini, tetapi bergantian antara menunjukkan nilai input benar dan salah. Jadi semua titik biru akan menjadi putih di iterasi berikutnya, dan semua putih akan menjadi biru.
Dalam plot di bawah ini, saya menggunakan input
rand(10,10)>0.6*2
. Ini berarti ia akan memiliki dimensi 10x10, dan semua elemen dari matriks acak yang lebih besar dari 0,6 akan benar. Setelah itu saya gandakan dengan waktu jeda yang diinginkan, 2 detik. Saya menggunakan matriks acak di sini, tapi saya bisa membuat matriks secara manual juga.Saya tidak memiliki Oktaf terinstal di komputer ini, jadi saya membuat perubahan kecil untuk membuat ini berfungsi di MATLAB. Ini prinsip yang sama persis, tetapi
n=~n
tidak berhasil di MATLAB.sumber
sed
141 13490-51 terima kasih kepada seshoumara
Input: Pertama-tama ambil setiap frame yang dipisahkan oleh garis dengan satu spasi kemudian tampilkan frame berikutnya setelah setiap baris kosong diterima (terlihat seperti flipbook). Minimal 3 frame.
Secara default pada sistem saya (Windows 7) ketika saya membuka cygwin memiliki 24 baris secara vertikal. Di antara frame, selalu ada setidaknya banyak garis kosong yang dicetak. Ini secara efektif membersihkan layar.
Lebih dari 1/3 byte berasal dari membersihkan konsol. Saya yakin ada cara yang lebih baik.
sumber
p
perintah pertama sebagai bagian daris///p
, ditambah 6 byte lebih banyak dengan menghapus/^\n/!
sebelumnyaP
, yang saya pikir tidak diperlukan. Untuk upaya ini, +1, meskipun saya juga yakin ada cara yang lebih baik.sed
, tetapi karena alasan tertentu ia tidak bekerja dengancat
atauecho
.echo -e "\e[2Jtest"
. Dengan cat, karakter escape harus sudah ada di file / input, cobaecho -e "\e[2Jtest"|cat -n
dan gulir ke atas.GNU sed,
8884 + 1 (n flag) = 85 byteSunting: 3 byte lebih sedikit berkat Riley
Format input adalah satu bingkai animasi per baris. Untuk beberapa garis keluaran dalam bingkai, gunakan koma sebagai pemisah. Karena saya menjalankan program di konsol Linux, ukuran gambar maksimum yang tersedia (diukur dalam baris dan kolom) tergantung pada ukuran jendela terminal. Jeda antara dua frame dilakukan oleh perintah sleep shell; untuk mendapatkan panggilan animasi yang lebih cepat
esleep 0.4
(detik).Bagian terbaiknya adalah saya mendukung animasi warna! Untuk melakukan ini, saya menggunakan Sequence Escape ANSI yang disebut untuk mengontrol font teks, warna latar depan dan latar belakang, ditambah posisi kursor, sehingga dapat menghapus layar sebelum setiap frame (kode
ESC[2J
). Untuk menambahkan informasi warna, gunakan format berikut dalam input, yang lebih baik dijelaskan di sini .Lari:
Contoh: untuk setiap tes, 2 siklus animasi ditangkap layar dan disimpan dalam format GIF gambar (permintaan maaf untuk resolusi rendah)
0,4 detik jeda
1 detik secara default
Penjelasan:
sumber
1h;1d;H;
denganH;1h;
Ruby,
8945 byteIni
^[
adalah karakter pelarian.Hexdump:
Menyelamatkan banyak byte berkat @Jordan
sumber
->h,t{h.cycle{|x|puts"^[[2J",x.map(&:join)}}
Lua ( LÖVE ),
296287 byteContoh Penggunaan
Output : https://youtu.be/0kDhPbbyG9E
sumber
SmallBasic, 167 byte
Sebagai parameter, tentukan dan atur global var i! Sayangnya, SmallBasic tidak mendukung parameter untuk Sub-rutin sendiri.
sumber