アニメ化しよう!


8

チャレンジ

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がポップアップし、配列をアニメーション化します。

フレーム1 フレーム2 フレーム3

ヒントヒント:コンソールのクリアが可能な言語を使用するか、選択した言語のアニメーションのように見える結果となる理由を指定します。一部の言語ではコンソールにデフォルトのバッファサイズがあると思いますが、これを利用してメリットがありますが、説明または例を期待しています。アニメーションを文字列として出力したからといって、そうする必要はありません。黒に0、白に1を使用して、本物のGIFを作成することもできます。

審査

これはコードゴルフで、バイト数が最も少ない勝ちです(入力は除外されます)。
クールな、または予期しない方法で言語を使用している人も+1します。


「クリア」は何行の長さが必要ですか?1行あたりの文字数と同じですか?
ライリー

より厳格な入力と同様の挑戦:codegolf.stackexchange.com/questions/27101/...
luserのドローグ

@ライリー私はあなたが求めているものを私が手に入れるかどうかわかりません。明確にすることは、本質的に出力を同じ行に保つことです。あなたのコードは実際には何も「クリア」しないかもしれませんが、同様にインラインで置き換えます。アニメーションをどのように完成させるかは気にせず、本質的にはフレームを使用して機能します。
Magic Octopus Urn

@luserdroog私はそれを見ていませんでしたが、「雪景色を作成する」でも見ましたが、これを投稿しないことを保証するほど十分に近いとは思いません。
Magic Octopus Urn

1
@carusocomputing心配はいりません。文法チェックをするだけで十分です。ちなみに、アニメーションで使われている言語は、もう使われなくなったのではないですか?
Monomeeth 2016

回答:


3

MATL16 12 11バイト

`G@)D1Y.XxT

入力は2Dのセル配列です。例えば:

{[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コード内にあります。.5または `.2のような任意の実数に変更できます。

MATL Online試しください(それが機能しない場合は、ページを更新して「実行」を再度押してください。)

入力は、2D char配列のセル配列にすることもできます。例えば:

{['x...';'+...';'....';'....'] ['+x..';'....';'....';'....'] ['.+x.';'....';'....';'....'] ['..+x';'....';'....';'....'] ['...+';'...x';'....';'....'] ['....';'...+';'...x';'....'] ['....';'....';'...+';'...x'] ['....';'....';'....';'..x+'] ['....';'....';'....';'.x+.'] ['....';'....';'....';'x+..'] ['....';'....';'x...';'+...'] ['....';'x...';'+...';'....']}

こちらもお試しください!

説明

`       % Do...while
  G     %   Push input: cell array
  @     %   Push iteration index
  )     %   Index to obtain that cell. This uses modular indexing,
        %   so each cell is addressed cyclically
  D     %   Display
  1     %   Push 1: number of seconds to pause
  Y.    %   Pause for that many seconds
  Xx    %   Clear screen
  T     %   True. This is used as loop condition: infinite loop
        % End. Implicitly end do...while loop  

1
私のトリックを使用して数バイトを節約できますか?マトリックスを充填[0.2 0 0.2;0 0.2 0] ... し、したがって削減xxx、そして避ける1G2G?私はそれがルールを守っていると信じています。もちろん、ジャンプしたり、一時停止した値を保存したり0.2するの1でない限り、に変換するために数バイトを追加する必要があり0.2ます。私はそれでもバイト数を減らすことができると思います:)
Stewie Griffin

1
@Weeingitfirstありがとう!さて、チャレンジは2つの入力を指定します:配列と一時停止の両方なので、両方が必要だと思います。とにかく確認を待ちましょう
Luis Mendo

2
ワオ。入力に忠実であっても、ブリーフを完全にフォローしました。これは非常に印象的な答えです。間違いなく打ち勝つことは難しく、一時停止期間が含まれていない回答と比較すると、これは基本的に完璧であり、勇敢です。
Magic Octopus Urn

1
@carusocomputing素晴らしい!知らせてくれてありがとうございます。4バイトオフ!期間はまだそれがコードにかなり明白ですが、変更することができます
ルイスMendo

1
私は正直に言って、これが勝つとは思えないので、さらに投稿するまで、これをベストアンサーとしてマークします。
Magic Octopus Urn

2

オクターブ、56 54 47バイト

入力マトリックスの一部として休止時間を入力する可能性を削除しました。とても満足しているので、編集履歴をご覧になりたい方は是非ご覧ください。このソリューションは7バイト短くなっています。

n=input('');while(any(n=~n))spy(n);pause(1);end

n=input('');  % Takes input as a matrix of zeros and ones

k=n(1);       % maximum of the input matrix is the desired pause time. Have to store
              % this, because n is soon to be messed with
              % NOTE: k=n(1); is not needed anymore, since the pause time can be hardcoded!

any(n=~n)     % Check if there are any truthy values in `n` (there is), and at the 
              % same time negate it, thus creating a matrix where all elements
              % alternates between 1 and 0.
while(any(n=~n))   % Loop as long as there are any non-zero elements (always some)
spy(n)        % Create a spy-plot where all non-zero elements are shown as a dot
pause(1)      % Pauses for k seconds
end           % ends the loop (will never happen, since it's infinite).

入力は次のようになります:[4 0 0 4;0 4 4 0;4 0 0 0]、これは3x4の次元のマトリックスであり、必要な一時停止時間は4秒です。

以下のようなプロットが表示されますが、入力の真の値と偽の値が交互に表示されます。したがって、次の反復ではすべての青い点が白になり、すべての白が青になります。

以下のプロットでは、入力を使用しましたrand(10,10)>0.6*2。これは、サイズが10x10で、ランダムマトリックスの0.6より大きいすべての要素がtrueになることを意味します。その後、希望の一時停止時間である2秒を掛けます。ここではランダムマトリックスを使用しましたが、マトリックスを手動で作成することもできました。

このコンピューターにOctaveをインストールしていないので、MATLABでこれを機能させるために少し変更を加えました。これはまったく同じ原理ですがn=~n、MATLABでは機能しません。

ここに画像の説明を入力してください

ここに画像の説明を入力してください


2
@carusocomputing、一時停止時間を入力として使用する必要がありますか、それとも自分で選択できますか?たとえば、常に1秒ありますか?
Stewie Griffin

1
@carusocomputingも:ユーザーに一時停止時間を選択させてもかまいませんが、個別のパラメーターとして持っていませんか?私のそれほど控え目な意見ではないが、これは「クールな、または予期しない方法」と見なされる;-)
Stewie Griffin

1
ええ、私は完全に同意します、これは適格です。ユーザーが入力のパラメーターを指定できるようにし、それが完全にランダム化されていない限り、問題ないと思います。一時停止の要点はアニメーションを見ることができることでした。私は、人々が「まあ、あなたはそれを見ることができないが、それは間違いなくアニメーション化している」と述べているforループを望んでいませんでした。
Magic Octopus Urn

1
また、私はあなたの両方のアイデアが好きでした。「TV Static Generator」は、ランダム化を使用した非常にユニークな実装であり、私も考慮していませんでした。これはまた、最初のイテレーションを取り、ブリーフに近づくことができたという点でも印象的です。素晴らしい仕事人。
Magic Octopus Urn

2

sedの141 134 90

-51せしょうまらのおかげで

/^$/!{H;d}
:;/^$/g;s,^\n,,;s,$, ,;s,^,\d27[2J,p
:p;P;s,[^\n]*\n,,;/^ \n/!bp;N;s,[ \n]*,,;b

入力:最初に、1つのスペースを含む行で区切られた各フレームを取得し、各空白行を受信した後に次のフレームを表示します(フリップブックのように見えます)。最小3フレーム。

私のシステム(Windows 7)でデフォルトでcygwinを開くと、縦に24行あります。フレーム間では、常に少なくともその数の空白行が印刷されます。これにより、画面が効果的にクリアされます。

バイトの3分の1以上は、コンソールのクリアから発生します。もっと良い方法があると確信しています。


1
最初のpコマンドをの一部にすることで1バイトを減らすことができます。また、before s///pを削除することでさらに6バイト増やすことができます。これは不要だと思います。努力のために、+ 1、しかしより良い方法があると私は確信しています。/^\n/!P
seshoumara 2016

1
しばらくインターネットを閲覧した後、端末のカーソルを操作する簡単な方法を見つけたので、画面もクリアします。ANSIエスケープシーケンスを使用します。このメカニズムは、テキストをカラーで印刷するためにも使用されます。詳細と使用例については、私の回答をご覧ください。cygwinで動作するかどうかはわかりませんが、試すことができます。
seshoumara 2016

@seshoumara cygwinからの場合は機能しますsedが、何らかの理由でcator で機能しませんecho
ライリー

お試しくださいecho -e "\e[2Jtest"。catでは、エスケープ文字がファイル/入力に既に含まれている必要がありますecho -e "\e[2Jtest"|cat -n。上にスクロールしてみてください。
seshoumara 2016

@seshoumara私はそれがそのようなものでなければならないことを知っていました。ありがとう!
ライリー

2

GNU sed、88 84 + 1(nフラグ)= 85バイト

編集:ライリーのおかげで3バイト少ない

H;1h;${:
g;s:\n.*::;H;x;s:[^\n]*\n::;x;y:,:\n:;s:^:ESC[2J:;s:ESC:\d27:gp;esleep 1
b}

入力形式は、1行あたり1つのアニメーションフレームです。フレームに複数の出力行がある場合は、区切り文字としてカンマを使用します。私はLinuxコンソールでプログラムを実行しているため、使用可能な最大の画像サイズ(行と列で測定)は、ターミナルウィンドウのサイズによって異なります。2つのフレーム間の一時停止は、sleepシェルコマンドによって実行されます。アニメーション呼び出しを高速化するesleep 0.4(秒)。

100,000,000            # The timer could be read from the input as well, but that
000,010,000            #would require a lot more bytes and I understand I'm allowed
000,000,001            #to hardcode the value.

圧巻はカラーアニメ対応!これを行うために、私はいわゆるANSIエスケープシーケンスを使用して、テキストフォント、前景色、背景色、およびカーソルの位置を制御し、各フレーム(コードESC[2J)の前に画面をクリアできるようにしました。色情報を追加するには、入力で次の形式を使用します。これについては、こちらで詳しく説明しています

ESC[$FORMATm$textESC[0m     # 'ESC' is an actual string, it is then replaced
                            #in sed by the character with the ASCII value 27

実行:

sed -nf animate.sed input.txt

例:各テストで、2つのアニメーションサイクルがスクリーンキャプチャされ、画像GIF形式で保存されました(低解像度の謝罪)。

0.4秒の一時停止 お誕生日おめでとうございます!

デフォルトで1秒 「ピクセル」の動き

説明:

H;1h                           # read each line/frame and store them in hold space
${:                            # when the input was read, start a loop
   g                           # copy hold space to pattern space
   s:\n.*::                    # remove all except the first/current frame
   H                           # append frame to hold space
   x;s:[^\n]*\n::;x            # delete first frame from hold space
   y:,:\n:                     # replace all commas with a newline
   s:^:ESC[2J:;s:ESC:\d27:gp   # use an ANSI Escape Sequence to clear the screen
                               #and print frame in color
   esleep 1                    # wait 1 second
b}                             # repeat

置き換えること1h;1d;H;で数バイトを節約できますH;1h;
Riley

@Rileyありがとう、コードを更新しました。
seshoumara

うわー、これは他の多くのものよりも深かったです、私はカラーサポートが好きで、それがそれをする唯一の答えです:)。改行のかなりユニークな使い方も。+1は、色のサポートと回答自体の一意性を示します。自分で見ていなかったら、正直信じられなかっただろう!
Magic Octopus Urn 2016

1

Ruby、89 45バイト

f=->h,t{h.cycle{|x|puts"^[[2J",x.map(&:join)}}

^[エスケープ文字です。

Hexdump:

00000000: 663d 2d3e 682c 747b 682e 6379 636c 657b  f=->h,t{h.cycle{
00000010: 7c78 7c70 7574 7322 1b5b 324a 222c 782e  |x|puts".[2J",x.
00000020: 6d61 7028 263a 6a6f 696e 297d 7d         map(&:join)}}

保存された多くの @Jordanへの感謝のバイト


@DLoscああ、はい、修正
TuxCrafting

ここで多くのバイトを節約できます。->h,t{h.cycle{|x|puts"^[[2J",x.map(&:join)}}
ジョーダン

良い答えです。FYIのブリーフが変更されたため、入力される期間を遵守する必要がなくなりました。これにより、可能な言語が制限されます。アニメーションをはっきりさせるために一時停止する必要があります。
Magic Octopus Urn

1

Lua(LÖVE)、296 287バイト

c=0;f=1;t=10;l=love
function l.load()loadstring('i='..arg[2])()s=tonumber(arg[3])end
function l.update(d)if c>s then
c=0;f=f==#i and 1 or f+1
end;c=c+d;end
function l.draw()for K,V in pairs(i[f])do
for k,v in pairs(V)do if v>0 then l.graphics.rectangle('fill',k*t,K*t,t,t)end
end
end
end

使用例

love main.love '{{{1,0,0},{0,0,0},{0,0,0}},{{0,1,0},{0,0,0},{0,0,0}},{{0,0,1},{0,0,0},{0,0,0}},{{0,0,0},{0,0,1},{0,0,0}},{{0,0,0},{0,0,0},{0,0,1}},{{0,0,0},{0,0,0},{0,1,0}},{{0,0,0},{0,0,0},{1,0,0}},{{0,0,0},{1,0,0},{0,0,0}},{{1,0,0},{1,0,0},{0,0,0}},{{1,1,0},{1,0,0},{0,0,0}},{{1,1,1},{1,0,0},{0,0,0}},{{1,1,1},{1,0,1},{0,0,0}},{{1,1,1},{1,0,1},{0,0,1}},{{1,1,1},{1,0,1},{0,1,1}},{{1,1,1},{1,0,1},{1,1,1}},{{1,1,1},{1,1,1},{1,1,1}},{{0,0,0},{0,0,0},{0,0,0}}}' 1

出力https : //youtu.be/0kDhPbbyG9E


うーん、私はluaにそれほど触れたことはありませんでした。グラフィックサポートもあることを知りませんでしたが、優れたパフォーマンスがあることを知っていました。非常に興味深く予想外の答え。これはおそらく、渡された数値に基づいてカラー入力を許可することに最も近い答えです。また、バイト数が多いにも関わらず、ASCIIを使用しないという最初の答えは、一意性のために+1です。
Magic Octopus Urn

1
@carusocomputingありがとうございます!LÖVEは2Dゲームを作成するためのフレームワークです。あなたはそれをチェックアウトするべきです:-)
Master_ex

ああ、本当ですか?私をあなたの他の仕事人の誰かにリンクできますか?私は絶対にそれを見たいです。
Magic Octopus Urn

1

SmallBasic、167バイト

パラメータとして、グローバル変数i!を定義および設定します。残念なことに、SmallBasicは独自のサブルーチンのパラメーターをサポートしていません。

sub animate
for j=0 to Array.getItemCount(i)
for k=0 to Array.getItemCount(i[0])
TextWindow.writeLine(i[j][k])
endfor
Program.delay(9)
TextWindow.clear()
endfor
endsub
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.