チャレンジ
GIFはアニメーションの最も一般的な画像形式であり、今日のソーシャルメディアでかなり頻繁に使用されています。この課題のために、GIFが何であるかを再定義します。この課題では、2Dの「画像」のある種の表現を含む3D配列を取り込み、それらを反復してアニメーションを表示する必要があります。このアニメーションは、GIF、コンソール、GUIなどのどこでも実行できます。アニメーション化されている限り、配信は問題ではありません。
入力
- 内部のデータが何らかの形で2D画像を表す3D配列。
- 配列には、RGBデータ、true / falseデータ、またはその他の適切なデータを含めることができます。
- また、文字列の2D配列または同様のものにそれを調整することもできますが、アニメーションは2Dアニメーションである必要があります。
- 選択した形式(秒、ミリ秒など)の各フレーム間の時間。
- 期間の長さを含める必要があるかどうか、人々は私に尋ねてきました。あなたがアニメーションを表示できる限り、私の答えは「まあ」です。私はあなたがこれよりも「配列」パラメータを順守することをより心配しています。つまり、ランダムなアニメーションはありません。
出力
- 値の入力に基づいて、各遷移で適切な遅延を持つ2Dアニメーションのように見えるシームレスに反復された出力シーケンス。
ルール
- 出力は次のいずれかですが、これらに限定されません。
- GIF画像。
- GUIアニメーション(私の例)。
- コンソール内アニメーション。
- 正直なところ、以下のルールに従う限り、あなたが合うと思う「アニメーション」。
- 画像を出力するときは、次のフレームを表示する前にコンソールをクリアする必要があります。それらを順番に印刷することはできません。
- シームレスなアニメーションのように見える限り、コンソールを「クリア」にエミュレートすることも可能です(私の意味の詳細については、私の例の下のヒントを参照してください)。
- 実装に関係なく、アニメーションは永久に、または停止するまでループする必要があります。
- 「ループ」は単純な
while(true){}
場合も無限再帰の場合もあり、ユーザーが「ctrl + c」を押すまでこの傑作を表示したいと思うかもしれません。
- 「ループ」は単純な
- 任意のサイズの2D「画像」を処理できる必要があります。言語がバッファサイズによって制限されている場合、これは許容範囲であり、説明でこれを述べることができます。
- 標準の抜け穴は許可されていません。
I / Oの例
入力(3D配列、遅延)
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)
出力(例、2020バイト-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("");
}
}
}
}
これにより、スイングGUIがポップアップし、配列をアニメーション化します。
ヒントヒント:コンソールのクリアが可能な言語を使用するか、選択した言語のアニメーションのように見える結果となる理由を指定します。一部の言語ではコンソールにデフォルトのバッファサイズがあると思いますが、これを利用してメリットがありますが、説明または例を期待しています。アニメーションを文字列として出力したからといって、そうする必要はありません。黒に0、白に1を使用して、本物のGIFを作成することもできます。
審査
これはコードゴルフで、バイト数が最も少ない勝ちです(入力は除外されます)。
クールな、または予期しない方法で言語を使用している人も+1します。