Animate tacky trang trí ánh sáng


22

Thử thách này là để tôn vinh ánh sáng Giáng sinh tẻ nhạt tại nhà của tôi.


Thách thức là tạo ra một đầu ra đồ họa hiển thị trang trí trong "thời gian thực".

Video (định dạng gif hoặc định dạng khác) sẽ có "đèn" dọc và ngang n-by-m . 5 <= m, n <= 40 . Kích thước và độ phân giải khung hình có thể thay đổi tùy thuộc vào nm , nhưng phải có ít nhất 50x50 pixel cho n, m = 5 (đồ họa vector là OK). Một hình ảnh với n=6m=5sẽ trông giống như thế này:

nhập mô tả hình ảnh ở đây


Trang trí:

Màu sắc:

Tất cả các đèn sẽ có một trong 6 RGB-màu sắc sau đây {255,0,0}, {0,255,0}, {0,0,255}, {255,255,0}, {0,255,255}{255,0,255}.

Hoạt hình:

  • nmsẽ được lấy làm đầu vào trên bất kỳ định dạng hợp lý nào và theo thứ tự bạn muốn
  • Hình ảnh sẽ thay đổi mọi dt = 25 ms. Sai lệch là ổn nếu đó là do "các yếu tố bên ngoài" như giới hạn trong trình thông dịch, máy tính chậm, v.v.
    • Nếu không thể đặt bước thời gian theo cách thủ công, thì bước thời gian mặc định được chấp nhận.
  • Tất cả các đèn sẽ có màu đỏ ( {255,0,0}) tại t=0.
  • Luôn có 5% cơ hội rằng ánh sáng đầu tiên (trên cùng bên trái) sẽ thay đổi màu sắc. Tất cả các màu (ngoại trừ màu hiện có) nên có khả năng như nhau.
  • Mỗi ánh sáng (trừ cái đầu tiên) sẽ có màu của ánh sáng bên trái. Nếu ánh sáng ở phía xa bên trái thì nó sẽ có được màu của ánh sáng ở phía xa bên phải trên hàng phía trên. Các đèn được đánh số như hình dưới đây. Số ánh sáng ksẽ có được màu của số ánh sáng k-1.

     1  2  3  4  5  6
     7  8  9 10 11 12
    13 14 15 16 17 18
    
  • Về lý thuyết, đầu ra sẽ chạy mãi mãi (trừ khi ngôn ngữ / trình thông dịch của bạn có một số hạn chế ngăn cản điều này).

  • Vui lòng cung cấp một mẫu ít nhất 5 giây, tốt nhất là nhiều hơn trong câu trả lời (đây là một sự khích lệ, không phải là một yêu cầu). (Tất nhiên, một liên kết đến TIO hoặc tương tự cũng vậy: D)
  • Khung, trục, đường lưới vv được chấp nhận.

6 giờ 5

nhập mô tả hình ảnh ở đây

15 giờ 30

nhập mô tả hình ảnh ở đây


Nếu trình thông dịch chậm, có nên điều chỉnh thời gian tạm dừng để tổng thời gian giữa các lần cập nhật hình ảnh tương tự như trong các ví dụ không? Điều gì về nếu không cần tạm dừng (mã đã đủ chậm)? Điều đó sẽ tiết kiệm byte, có thể chống lại tinh thần của thử thách
Luis Mendo

1
Vì bạn đã chọn các màu để dễ thực hiện - trong các ngôn ngữ như QBasic có bộ màu dựng sẵn có giới hạn, bạn có thể chấp nhận sử dụng các màu có sẵn gần nhất với các màu bạn đã chỉ định không? (Đỏ, xanh lá cây, xanh dương, vàng, lục lam, đỏ tươi)
DLosc

Nếu không thể sử dụng các màu được chỉ định thì có, bạn có thể sử dụng các lựa chọn thay thế gần nhất. Nếu nó chỉ dài hơn một chút thì không. r,g,y,b,vv ngắn hơn trong một số ngôn ngữ.
Stewie Griffin

@LuisMendo, xin lỗi vì đã trả lời trễ. Tôi thích cách bạn đã làm nó trong câu trả lời của bạn. Sẽ ổn khi sử dụng 25 ms, ngay cả khi điều đó sẽ làm cho hình ảnh động chậm hơn. Tôi đã tránh drawnowkhi tôi thực hiện điều này trong MATLAB, vì kết quả quá chậm. Tôi nghĩ câu trả lời phải là: Nếu đó là một lựa chọn thiết kế mà trình thông dịch có độ phân giải thời gian tối thiểu cố định> = 25 ms thì không sao. Nếu đó là do triển khai kém / đơn giản, một trình thông dịch trực tuyến bị quá tải / chậm, v.v. thì không ổn.
Stewie Griffin

1
@Stewie Hiểu rồi, cảm ơn. Và thử thách tốt đẹp!
Luis Mendo

Câu trả lời:


6

JavaScript / CSS / HTML, 436 byte

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

Toán học, 186 161 158 byte

(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#])&

Giải trình

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

Tạo bảng ban đầu trong 1D, chứa đầy màu đỏ. Lưu trữ mà trong b.

Pause@.025

Tạm dừng trong 25ms

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

Nếu số thực ngẫu nhiên (giả) nhỏ hơn 0,06, hãy thay thế phần tử đầu tiên bbằng độ dài mẫu ngẫu nhiên 3của danh sách {1,1,0,0}. (tức là bất kỳ một trong số {1, 1, 0}, {1, 0, 1}, {1, 0, 0}, {0, 1, 1}, {0, 1, 0}, {0, 0, 1})

b=RotateRight@b

Xoay vòng phải.

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

Thay đổi giá trị ô đầu tiên thành giá trị ô thứ hai (nghĩa là hoàn tác dịch chuyển của ô thứ nhất)

Partition[ ... ;b,#]

Phân vùng bthành (chiều cao).

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

Biến nó thành một hình ảnh động (liên tục cập nhật), có chiều rộng là 50 (chiều rộng)

Phiên bản tự động di động (186 byte)

(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#])&

Đầu ra mẫu (đầu vào: 16, 10)

nhập mô tả hình ảnh ở đây


6

MATLAB, 255 210 byte

Đây là sân golf đầu tiên của tôi, vì vậy có thể có những cải tiến được thực hiện.

Cảm ơn Luis đã giúp tôi tiết kiệm 45 byte :)

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

Giải trình:

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

Thật không may, điều này không lưu hình ảnh động, nó chỉ chạy nó. Để lưu nó, tôi cần một chương trình chụp màn hình hoặc viết lại tất cả bằng cách sử dụng imwrite. Thay vào đó, tôi sẽ cung cấp hai hình ảnh hiển thị thời gian khác nhau n=15,m=30.

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


1
Một số gợi ý chơi golf: dec2bin([4 2 1 6 3 5])-48thay vì [1 0 0;0 1 0;0 0 1;1 1 0; 0 1 1;1 0 1]. .95thay vì 0.95. Bạn cũng có thể thay thế .95bằng .94và thoát khỏi k=k(k~=r);(vì 0,94 + 0,06 / 6 = 0,95; xem câu trả lời của tôi cho một lời giải thích chi tiết hơn)
Luis Mendo

1
Tốt hơn nữa, c=dec2bin(1:6)-48vì thứ tự không thành vấn đề
Luis Mendo

Câu trả lời đầu tiên tốt đẹp! Tuy nhiên, tôi sợ rằng tôi đã vượt xa bạn 40% .
Sanchise

Đánh gôn xuống một chút :) Cảm ơn vì sự giúp đỡ của Luis. ! :) Làm tốt lắm!
CG.

4

MATL , 52 47 byte

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

Đầu vào là một mảng [ncols nrows]. Đầu ra là một con số với đồ họa vector.

Ví dụ chạy cho 15 cols × 10 hàng:

nhập mô tả hình ảnh ở đây

Làm thế nào nó hoạt động

Thời gian tạm dừng đã được đặt thành 15 ms (với cùng số byte là 25 ms) để thử bù thời gian xử lý.

Để giữ màu với xác suất 19/20 (thay đổi bằng 1/20), chúng tôi tiến hành như sau:

  • Với xác suất 47/50 chúng tôi giữ màu.
  • Với xác suất 3/50, chúng tôi chọn một màu mới được chọn đồng nhất trong số 6 màu. Có thể xảy ra màu "mới" giống với màu cũ và điều này xảy ra với xác suất 1/6.

Do đó xác suất giữ màu là 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 byte

Lưu ý : GIF hiển thị là phiên bản cũ hơn, rất đẹp vì nó không hiển thị các trục (xem lịch sử chỉnh sửa), nhưng cực kỳ chậm do việc triển khai imshow. Đối với phiên bản hiện tại, câu trả lời MATLAB của Chelsea G. hoặc câu trả lời MATL của Luis Mendo cho thấy kết quả tương tự như phiên bản hiện tại của tôi.

Kích thước được lấy dưới dạng 2x1vector, vì vậy hãy gọi như:

>> 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

Câu trả lời này khai thác sự tinh tế của ngôn ngữ MATLAB. Ví dụ, xđược kích hoạt dưới dạng m x nma trận bằng 0, nhưng cái gọi là lập chỉ mục tuyến tính cho phép dịch chuyển vòng tròn với các chỉ số 1 chiều. Gõ yếu cho phép nhân với logic, để iftránh các câu lệnh (một mẹo mà tôi đã sử dụng rất nhiều trong những ngày lập trình trên máy tính TI-84). Mặc dù một bản đồ màu được đọc theo hàng, MATLAB coi nó như một ma trận bình thường, do đó eye(3)có thể được sử dụng để tạo ra màu đỏ, xanh lá cây và xanh lam và 1-eye(3)ba màu còn lại. Một đơn giản reshapeđưa vectơ tuyến tính trở lại dạng ma trận, được ánh xạ tới các màu mong muốn bằng cách sử dụng ind2rgb. Cuối cùng,imagesc, hiển thị hình ảnh, được hiển thị ở kích thước hình mặc định (đủ lớn cho các yêu cầu). Vì may mắn sẽ có nó, imagesckhông quan tâm đến các giá trị nằm ngoài phạm vi được chỉ định, vì vậy eyecó thể được sử dụng để khởi tạo ma trận vì cả hai 10được coi là màu đỏ.

nhập mô tả hình ảnh ở đây


1
Rất tiếc, đã quên nâng cấp bạn ... Tôi yêu tất cả các thủ thuật nhỏ của bạn :-)
CG.

Có đúng là màu ngẫu nhiên không bao giờ là màu đỏ trong phiên bản cập nhật? Nó xuất hiện theo cách đó trong Octave ít nhất (không có MATLAB).
Stewie Griffin

@StewieGriffin Tôi phải ngủ khi tôi làm điều này. Bạn tất nhiên là hoàn toàn đúng - và nó cũng tiết kiệm cho tôi một byte ...
Sanchise

(làm cho hai byte đó)
Sanchise

2

Python 3.6 (316 byte)

Sử dụng mã màu ANSI và chuỗi ký tự chuỗi được định dạng mới của Python 3.6 ( PEP 489 ) ( f"{X}"ma thuật).

Mặt khác, nó chỉ khá cơ bản, nhưng trăn bị xáo trộn. Chiều rộng và chiều cao được truyền dưới dạng đối số trên dòng lệnh.

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)

nhập mô tả hình ảnh ở đây


Bạn có thể dự phòng 6 byte bằng cách sử dụng w,h=map(int,sys.argv[1:]), giải nén hoạt động với bất kỳ lần lặp nào (có kích thước phù hợp), cuộc gọi đến danh sách là không cần thiết.
Sebastian Riese

Một vài byte nữa: "\x1b["=> "\33["(sử dụng bát phân thay vì thoát hex), sau đó chữ viết tắt X và chuỗi định dạng thực sự làm cho nó dài hơn (và bằng cách loại bỏ f""bạn có thể tương thích với bất kỳ python3 nào). (điều này sẽ đưa nó xuống 301 byte).
Sebastian Riese

Rất tiếc, bạn sử dụng {x}một lần ... nhưng bạn vẫn chiến thắng khi thoát khỏi X.
Sebastian Riese
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.