Các thách thức
GIF là định dạng hình ảnh phổ biến nhất cho hoạt hình và được sử dụng khá nhiều trong phương tiện truyền thông xã hội ngày nay. Với mục đích của thử thách này, tôi sẽ định nghĩa lại GIF có thể là gì. Thử thách này sẽ yêu cầu bạn tham gia vào một mảng 3D có chứa một số loại hình đại diện của một "hình ảnh 2D" và lặp lại qua chúng, hiển thị một hình ảnh động. Hoạt hình này có thể được thực hiện ở bất cứ đâu, trong GIF, trong bảng điều khiển của bạn, trong GUI, v.v; việc giao hàng không thành vấn đề, miễn là nó hoạt hình.
Đầu vào
- Mảng 3D trong đó dữ liệu bên trong bằng cách nào đó đại diện cho hình ảnh 2D.
- Mảng có thể chứa dữ liệu RGB, dữ liệu đúng / sai hoặc bất kỳ thứ gì khác mà bạn thấy phù hợp.
- Tôi cũng ổn với bạn làm giảm nó xuống một chuỗi các chuỗi 2D hoặc một cái gì đó tương tự, nhưng hoạt hình phải là hoạt hình 2D .
- Thời gian giữa mỗi khung hình theo định dạng bạn chọn (Giây, mili giây, v.v ...).
- Mọi người đã hỏi tôi liệu họ CÓ bao gồm thời lượng hay không. Câu trả lời của tôi là "meh", miễn là bạn có thể hiển thị hình ảnh động. Tôi quan tâm hơn rằng bạn tuân thủ tham số "Mảng" hơn tham số này, nghĩa là không có hoạt ảnh ngẫu nhiên.
Đầu ra
- Một chuỗi đầu ra được lặp lại liền mạch trông giống như một hình ảnh động 2D với độ trễ chính xác trên mỗi lần chuyển đổi dựa trên đầu vào giá trị.
Những quy định
- Đầu ra có thể, nhưng không giới hạn:
- Ảnh GIF.
- GUI hoạt hình (ví dụ của tôi).
- Hoạt hình trong bàn điều khiển.
- Thành thật mà nói, bất kỳ "hoạt hình" nào bạn thấy phù hợp, miễn là nó tuân theo các quy tắc dưới đây.
- Khi xuất hình ảnh của bạn, bạn phải xóa bảng điều khiển trước khi hiển thị khung hình tiếp theo, bạn không thể chỉ in chúng liên tục.
- Việc mô phỏng một giao diện điều khiển "rõ ràng" cũng được chấp nhận, miễn là nó trông giống như một hình ảnh động liền mạch (xem gợi ý dưới ví dụ của tôi để biết thêm thông tin về ý tôi).
- Bất kể thực hiện, hoạt hình của bạn sẽ lặp đi lặp lại mãi mãi hoặc cho đến khi dừng lại.
- Việc "lặp" có thể đơn giản như
while(true){}
hoặc đệ quy vô hạn, bạn có thể cho rằng người dùng muốn xem kiệt tác này cho đến khi họ nhấn "ctrl + c".
- Việc "lặp" có thể đơn giản như
- Bạn phải có khả năng xử lý bất kỳ kích thước 2D 'hình ảnh' nào, nếu ngôn ngữ của bạn bị giới hạn bởi kích thước bộ đệm, điều này có thể chấp nhận được và bạn có thể nêu điều này trong phần giải thích của mình.
- Sơ hở tiêu chuẩn là không được phép.
Ví dụ I / O
Đầu vào (Mảng 3D, Độ trễ)
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)
Đầu ra (Ví dụ, 2020 Byte - 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("");
}
}
}
}
Điều này dẫn đến một GUI swing xuất hiện, tạo hiệu ứng cho mảng:
GỢI Ý: Sử dụng ngôn ngữ có thể xóa bảng điều khiển hoặc chỉ định lý do tại sao những gì bạn đang làm sẽ kết thúc với kết quả trông giống như một hình ảnh động trong ngôn ngữ bạn đã chọn. Tôi nghĩ rằng một số ngôn ngữ có kích thước bộ đệm mặc định trên bảng điều khiển của chúng, bạn có thể sử dụng điều này để lợi thế của bạn, nhưng tôi mong đợi một lời giải thích hoặc ví dụ. Chỉ vì tôi xuất hình ảnh động của mình dưới dạng chuỗi, bạn không phải; Tôi có thể dễ dàng sử dụng 0 cho màu đen và 1 cho màu trắng và tạo một GIF thực sự.
Đánh giá
Đây là mã golf, số byte thắng thấp nhất (loại trừ đầu vào).
Tôi sẽ +1 bất cứ ai sử dụng ngôn ngữ theo cách tuyệt vời hoặc bất ngờ.