动画俗气的灯光装饰


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或类似的链接当然也可以:D)
  • 可以接受框架,轴,网格线等。

6乘5

在此处输入图片说明

15乘30

在此处输入图片说明


如果解释器运行缓慢,是否应该调整暂停时间,以使图像更新之间的总时间与示例中的时间相似?如果不需要暂停(代码已经足够慢了)怎么办?这样可以节省字节,也许违背了挑战的精神
Luis Mendo

1
由于您选择了易于实现的颜色-在诸如QBasic之类的内置颜色有限的语言中,使用与您指定的颜色最接近的可用颜色是否可以接受?(红色,绿色,蓝色,黄色,青色,洋红色)
DLosc

如果无法使用指定的颜色,则可以,可以使用最接近的替代颜色。如果只是更长一点,那就没有。r,g,y,b,等在几种语言中更短。
Stewie Griffin

@LuisMendo,对于延迟的回复表示歉意。我喜欢您的回答方式。可以使用25毫秒,即使这样会使动画变慢。drawnow当我在MATLAB中实现此功能时,我避免了,因为结果太慢了。我认为答案必须是:如果解释器的固定最小时间分辨率为> = 25 ms,这是设计选择,那么可以。如果是由于实施不佳/简单,在线解释器超载/缓慢等原因,那是不对的。
Stewie Griffin

1
@Stewie知道了,谢谢。很好的挑战!
路易斯·门多

Answers:


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

数学,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##];

用一维创建初始板,并用红色填充。将其存储在中b

Pause@.025

暂停25毫秒

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

如果(伪)随机实数小于0.06,则用list 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]]

将第一个单元格值更改为第二个单元格值(即撤消第一个单元格的移位)

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,255210字节

这是我的第一次高尔夫,所以可能需要改进。

感谢路易斯帮助我节省了45个字节:)

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。取而代之的是,我将提供两张显示不同时间的图片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;请参阅我的答案以获取更详细的说明)
Luis Mendo

1
更好的是,c=dec2bin(1:6)-48顺序无关紧要
Luis Mendo

不错的第一答案!但是,恐怕我已经超出您40%了
桑奇斯

打了一下球:)谢谢路易斯的帮助。!:)干得好Sanchises!
CG。

4

MATL52 47字节

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

输入是一个数组[ncols nrows]。输出是带有矢量图形的图形。

运行15列×10行的示例:

在此处输入图片说明

怎么运行的

暂停时间已设置为15 ms(与25 ms相同的字节数)以尝试补偿处理时间。

为了使颜色保持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是较旧的版本,很好,因为它不显示轴(请参阅编辑历史记录),但是由于实现了而非常imshow。对于当前版本,Chelsea G.的MATLAB答案Luis Mendo的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语言的精妙之处。例如,x被初始化m x n为零矩阵,但是所谓的线性索引允许使用一维索进行圆形移位。弱类型输入允许与逻辑相乘,从而if避免使用语句(这是我在TI-84计算器上进行编程时经常使用的技巧)。即使按行读取颜色图,MATLAB也会将其视为普通矩阵,因此eye(3)可用于创建红色,绿色和蓝色以及1-eye(3)其他三种颜色。一个简单的方法reshape将线性向量重新转换为矩阵形式,然后使用将其映射到所需的颜色ind2rgb。最后,imagesc,显示图片,以默认图形尺寸显示(该尺寸足以满足要求)。由于幸运的是,imagesc不介意被值超出规定范围,因此eye可以用来初始化因为两个矩阵10被认为是红色。

在此处输入图片说明


1
糟糕,忘记为您投票...我喜欢您的所有小技巧:-)
CG。

在更新的版本中随机颜色永远不会是红色是否正确?至少在Octave中看起来是这样(没有MATLAB)。
Stewie Griffin

@StewieGriffin做这个的时候我一定在睡觉。您当然是完全正确的-它也为我节省了一个字节……
Sanchises

(制作两个字节)
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)

在此处输入图片说明


您可以通过使用来w,h=map(int,sys.argv[1:])保留6个字节,使用任何可迭代(正确大小)的拆包均可,对list的调用是多余的。
塞巴斯蒂安·里斯

再往下移几个字节:"\x1b["=> "\33["(使用八进制而不是十六进制转义),然后X缩写和格式字符串实际上使它变长(并且摆脱了f""与任何python3的兼容性)。(这将减少到301个字节)。
塞巴斯蒂安·里斯

糟糕,您只使用{x}过一次...但是您仍然会因为摆脱赢得胜利X
塞巴斯蒂安·里斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.