粘着性のある軽い装飾をアニメーション化する


22

この挑戦は、私の家の法廷での粘着性のあるクリスマスライトに敬意を表します。


課題は、「リアルタイム」で装飾を示すグラフィカルな出力を作成することです。

ビデオ(gifまたはその他の形式)には、n行m列の垂直および水平の「ライト」があります。5 <= m、n <= 40。フレームのサイズと解像度はnmによって異なる場合がありますが、n、m = 5の場合は少なくとも50x50ピクセルである必要があります(ベクトルグラフィックは問題ありません)。絵とは次のようになります。n=6m=5

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


装飾:

色:

すべてのライトは以下の6 RGB-色のいずれかを持っています{255,0,0}{0,255,0}{0,0,255}{255,255,0}{0,255,255}{255,0,255}

アニメーション:

  • nそしてm任意の合理的な形式にし、あなたが好きな順に入力とさせていただきます
  • 画像は毎回変更されdt = 25 msます。インタープリターの制限、コンピューターの速度低下などの「外部要因」が原因である場合、偏差は問題ありません。
    • タイムステップを手動で設定できない場合は、デフォルトのタイムステップが受け入れられます。
  • すべてのライトはで赤({255,0,0})になりt=0ます。
  • 最初のライト(左上)の色が変わる可能性は常に5%です。すべての色(現在持っている色を除く)は同じように見えるはずです。
  • 各ライト(最初のライトを除く)は、その左側のライトの色を取得します。ライトが左端にある場合、上の行の右端にあるライトの色を取得します。ライトには、下図のように番号が付けられています。ライト番号kは、ライト番号の色を取得しk-1ます。

     1  2  3  4  5  6
     7  8  9 10 11 12
    13 14 15 16 17 18
    
  • 理論的には、出力は永遠に実行されるはずです(ただし、言語/インタープリターにこれを妨げる制限がある場合を除く)。

  • 少なくとも5秒、できればそれ以上の回答のサンプルを提供してください(これは推奨事項であり、要件ではありません)。(TIOまたは同様のものへのリンクももちろんOKです:D)
  • フレーム、軸、グリッド線などが受け入れられます。

6行5列

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

15行30列

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


インタプリタが遅い場合、画像更新間の合計時間がサンプルのそれと同じになるように、一時停止時間を調整する必要がありますか?一時停止が必要ない場合はどうでしょうか(コードはすでに十分に遅くなっています)。それは多分挑戦の精神に反する、バイトを救う
ルイスMendo

1
実装を簡単にするために色を選択したため、組み込みの色のセットが制限されているQBasicのような言語では、指定した色に最も近い色を使用しても問題ありませんか?(赤、緑、青、黄色、シアン、マゼンタ)
DLosc

指定した色を使用できない場合は、はい、最も近い代替色を使用してもかまいません。それがほんの少し長い場合はノーです。r,g,y,b,などはいくつかの言語で短くなっています。
スチューウィーグリフィン

@LuisMendo、返信が遅くなって申し訳ありません。私はあなたの答えであなたがそれをした方法が好きです。25ミリ秒を使用しても、アニメーションが遅くなる場合があります。drawnow結果が遅すぎるため、MATLABでこれを実装することを避けました。答えは次のとおりだと思います:インタプリタが25 ms以上の固定最小時間分解能を持っているのが設計上の選択であれば、それは問題ありません。貧弱で単純な実装、過負荷/低速なオンラインインタープリターなどが原因である場合は、問題ありません。
スチューウィーグリフィン

1
@Stewieわかった、ありがとう。そして素敵な挑戦!
ルイスメンドー

回答:


6

JavaScript / CSS / HTML、436バイト

b="red"
f=_=>{o.textContent='';o.style.width=w.value*10+"px";o.style.height=h.value*10+"px"}
setInterval(_=>o.insertBefore(document.createElement("s"),o.firstChild).style.background=b=["red","yellow","lime","aqua","blue","fuchsia"][Math.random()*100|0]||b,25)
#o{overflow:hidden;background:red}s{display:block;float:left;width:10px;height:10px}
<div oninput=f()><input id=h type=number min=1><input id=w type=number min=1></div><div id=o>


6

Mathematicaの、186の 161 158バイト

(b=Table[{1,0,0},1##];Dynamic@Image[Partition[Pause@.025;If[Random[]<.06,b[[1]]={1,1,0,0}~RandomSample~3];b=RotateRight@b;b[[1]]=b[[2]];b,#],ImageSize->50#])&

説明

b=Table[{1,0,0},1##];

赤で塗りつぶされた最初のボードを1Dで作成します。に保存しbます。

Pause@.025

25msの一時停止

If[Random[]<.06,b[[1]]={1,1,0,0}~RandomSample~3]

(擬似)乱数の実数が0.06より小さい場合、の最初の要素をリストのbランダムなサンプル長3に置き換えます{1,1,0,0}。(つまりのいずれか{1, 1, 0}, {1, 0, 1}, {1, 0, 0}, {0, 1, 1}, {0, 1, 0}, {0, 0, 1}

b=RotateRight@b

右に回転します。

b[[1]]=b[[2]]

最初のセル値を2番目のセル値に変更します(つまり、最初のセルのシフトを元に戻します)

Partition[ ... ;b,#]

b(高さ)に分割します。

Dynamic@Image[ ... ,ImageSize->50#]

それを、幅が50(幅)の動的(常時更新)画像にします。

セルラオートマトンバージョン(186バイト)

(b=Table[{1,0,0},1##];Dynamic@Image[Partition[Pause@.025;If[Random[]<.06,b[[1]]={1,1,0,0}~RandomSample~3];i=2;b={#[[2-Boole[i--<0],2]]&,{},{1,1}}~CellularAutomaton~b,#],ImageSize->50#])&

サンプル出力(入力:16、10)

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


6

MATLAB、255 210バイト

これは私の最初のゴルフなので、おそらく改善が必要です。

45バイトの節約を助けてくれたLuisに感謝します:)

function f(n,m)
c=dec2bin(1:6)-48;r=1;p=c(r,:);x=zeros(1,n*m,3);x(:,:,1)=1;while 1
x=circshift(x,[0,1,0]);if rand>0.94;r=randi(6);end
x(1,1,:) = c(r,:);imagesc(permute(reshape(x,n,m,3),[2 1 3]));pause(1/40);end

説明:

c=dec2bin(1:6)-48  % c is the colormap
r=1;p=c(r,:);                % p is color number r (starting at 1) from the colormap c
x=zeros(1,n*m,3);x(:,:,1)=1; % 2D matrix in the third dimension. The first layer is 1
while 1                      % while true
x=circshift(x,[0,1,0]);      % shift the vector horizontally along the second dimension
if rand()>0.94;              % 5 percent chance of changing color
k=randperm(6);k=k(k~=r);r=k(1); % Create a vector with color numbers 1..6. Discard the current color, and choose the first color
x(1,1,:) = c(r,:);           % The first light gets color number r
imagesc(permute(reshape(x,n,m,3),[2 1 3]));  % Reshape the vector so that it's a 3D matrix
% Permute it so that the dimensions are correct
% Use imagesc to display
pause(1/40)  % 0.025 seconds pause

残念ながら、これはアニメーションを保存せず、実行するだけです。保存するには、スクリーンキャプチャプログラムが必要か、を使用してすべてを書き換えimwriteます。代わりに、異なる時間を示す2つの写真を提供しますn=15,m=30

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

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


1
ゴルフの提案:のdec2bin([4 2 1 6 3 5])-48代わりに[1 0 0;0 1 0;0 0 1;1 1 0; 0 1 1;1 0 1].95の代わりに0.95。置き換え.95.94取り除くこともできますk=k(k~=r);(0.94 + 0.06 / 6 = 0.95であるため、詳細な説明については私の回答をご覧ください)
ルイスメンドー

1
いっそのこと、c=dec2bin(1:6)-48、順序は重要ではありませんとして
ルイスMendo

素敵な最初の答え!しかし、私はあなたを40%オーバーゴルフしているのではないかと心配しています
-Sanchises

少しそれをゴルフ:)ルイスの助けをありがとう。!:)よくやったSanchises!
CG。

4

MATL52 47バイト

6:BoHZGKipY"`tGe!2YG50Yr3>?t1)}6Yr]0(1YS.015Y.T

入力は配列[ncols nrows]です。出力は、ベクトルグラフィックスを含む図です。

15列×10行の実行例:

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

使い方

処理時間の補正を試みるために、一時停止時間は15ミリ秒(25ミリ秒と同じバイト数)に設定されています。

色を19/20の確率で保持する(1/20で変更する)には、次の手順に従います。

  • 47/50の確率で、色を維持します。
  • 3/50の確率で、6色の中から均一に選択された新しい色を選択します。「新しい」色が古い色と同じである可能性があり、これは確率1/6で発生します。

したがって、色が維持される確率は47/50 + 3 /(50 * 6)= 19/20です。

6:        % Push [1 2 3 4 5 6]
B         % Convert to binary. This gives a 6×3 matrix, where each row 
          % corresponds to a number. First row is [0 0 1] (blue), second is
          % [0 1 0] (green), etc
o         % Convert to double
HZG       % Set as colormap (creates a figure)
K         % Push 4
i         % Take input array
p         % Product of array. This gives the total number of squares
Y"        % Repeat 4 that many times. This gives a row vector representing the
          % image. The initial value, 4, corresponds to red in the colormap
`         % Do...while
  t       %   Duplicate
  Ge      %   Reshape to size given by the input. Gives a matrix where each
          %   entry  will be interpreted as a pointer to the colormap
  !       %   Transpose. This is required because the color shifting will be
          %   done in column-major order: down, then across; whereas we want
          %   the opposite
  2YG     %   Show matrix as image using the defined colormap
  50Yr    %   Push a uniformly distributed random integer between 1 and 50
  3>      %   True if greater than 3. This happens with probability 47/50
  ?       %   If true
    t1)   %     Duplicate and get first entry (to repeat the first color)
  }       %   Else
    6Yr   %     Push a uniformly distributed random integer between 1 and 6.
          %     This is the new color (possibly the same as the old)
  ]       %   End
  0(      %   Assign that color (repeated or new) to the last entry of the row
          %   vector representing the image
  1YS     %   Circularly shift to the right. The last value becomes the first
 .015Y.   %   Pause 0.015 ms
 T        %   Push true
          % End (implicit). Since the top of the stack is true, this creates
          % an infinite loop

3

MATLAB、153 147バイト

:表示されているGIFは古いバージョンのもので、Axesを表示しないので便利ですが(編集履歴を参照)、の実装により非常に遅くなりましたimshow。現在のバージョンでは、チェルシーG.のMATLAB回答またはルイスメンドーのMATL回答は、現在のバージョンと同じ結果を示しています。

サイズは2x1ベクトルとして取得されるため、たとえば次のように呼び出します。

>> l([5 5])

function l(s)
c=eye(3);x=eye(s);while 1
a=rand>.94;x=[a*randi(6)+~a*x(1),x(1:end-1)];imagesc(reshape(x,s)',[1,6]);colormap([c;1-c])
pause(.025)
end

この答えは、MATLAB言語の微妙さを利用しています。たとえば、xm x nゼロマトリックスとして初期化されますが、いわゆる線形インデックス付けにより、1次元インデックスでの循環シフトが可能になります。弱いタイピングにより、論理式との乗算が可能になるため、ifステートメントが回避されます(TI-84計算機でのプログラミングの時代によく使用したトリック)。カラーマップは行ごとに読み取られますが、MATLABはそれを通常のマトリックスとして扱い、eye(3)赤、緑、青、および1-eye(3)他の3色を作成するために使用できます。simple reshapeは、線形ベクトルを行列形式に戻しind2rgbます。これは、を使用して目的の色にマッピングされます。最後に、imagesc、デフォルトのフィギュアサイズで表示される画像を表示します(これは要件を満たすのに十分な大きさです)。運が良ければimagesc、指定された範囲外の値を気にしません。eye両方とも赤10見なされるため、マトリックスの初期化に使用できます。

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


1
おっと、あなたを賛成するのを忘れました...私はあなたのすべての小さなトリックが大好きです:-)
CG。

更新されたバージョンでランダムな色が赤にならないことは正しいですか?少なくともOctaveではそのように見えます(MATLABはありません)。
Stewie Griffin

@StewieGriffinこれを作ったときは寝ていたに違いない。...そしてそれは同様に私のバイトを保存-あなたはもちろん完全に右である
Sanchises

(その2バイトを作成)
Sanchises

2

Python 3.6(316バイト)

ANSIカラーコードとPython 3.6PEP 489)の新しいフォーマットされた文字列リテラルの使用(f"{X}"魔法)。

それ以外の場合は非常に基本的ですが、Pythonを難読化しています。幅と高さは、コマンドラインで引数として渡されます。

import random as n,time,sys
r=range
X="\x1b["
C=[f"{X}1;4{x}m " for x in r(1,7)]
w,h=list(map(int,sys.argv[1:]))
a=[C[0]for i in r(w*h)]
while 1:
 print(f"{X}0m{X}2J{X}f");f=a[0];a.pop();a[:0]=n.choice([x for x in C if x!=f])if n.random()<=.05 else f,
 for i in r(0,h*w,w):print(*a[i:i+w],sep="")
 time.sleep(.025)

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


を使用することで6バイトをw,h=map(int,sys.argv[1:])節約できます。アンパックは(適切なサイズの)任意の反復可能オブジェクトで機能します。リストの呼び出しは不要です。
セバスチャンリース

もう1つ下のバイト:"\x1b["=> "\33["(16進エスケープの代わりに8進を使用)、Xの省略形とフォーマット文字列により実際に長くなります(そして、f""削除することでpython3との互換性が得られます)。(これにより、301バイトになります)。
セバスチャンリース

おっと、あなたは{x}一度使用します...しかし、あなたはまだそれを取り除くことで勝ちますX
セバスチャンリース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.