끈적 끈적한 조명 장식 애니메이션


22

이 도전은 법률가의 집에서 볼품없는 크리스마스 조명을 기리는 것입니다.


과제는 "실시간"으로 장식을 보여주는 그래픽 출력을 만드는 것입니다.

비디오 (gif 또는 기타 형식)에는 nxm 세로 및 가로 "조명"이 있습니다. 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}.

생기:

  • nm합리적인 형식과 당신이 좋아하는 순서대로 입력으로 이동합니다
  • 이미지가 매번 바뀝니다 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)
  • 프레임, 축, 그리드 선 등이 허용됩니다.

6x5

여기에 이미지 설명을 입력하십시오

15x30

여기에 이미지 설명을 입력하십시오


인터프리터가 느린 경우 이미지 업데이트 사이의 총 시간이 예제의 시간과 비슷하도록 일시 정지 시간을 조정해야합니까? 일시 정지가 필요하지 않은 경우 (코드가 이미 느려짐) 어떻습니까? 그것은 도전 정신에 어긋나는 바이트를 절약 할 수 있습니다.
Luis Mendo

1
QBasic과 같은 내장 색상 세트가 제한된 언어에서 구현하기 쉽도록 색상을 선택 했으므로 지정한 색상에 가장 가까운 색상을 사용할 수 있습니까? (빨강, 녹색, 파랑, 노랑, 녹청, 마젠타)
DLosc

지정된 색상을 사용할 수 없다면 가장 가까운 대안을 사용하는 것이 좋습니다. 조금 더 길다면 그렇지 않습니다. r,g,y,b,여러 언어에서 더 짧습니다.
Stewie Griffin

@LuisMendo, 늦은 답변에 대해 사과드립니다. 나는 당신이 당신의 대답에서 그것을했던 방식을 좋아합니다. 애니메이션이 느려질지라도 25ms를 사용하는 것이 좋습니다. drawnow결과가 너무 느리기 때문에 MATLAB에서 이것을 구현할 때 피했습니다 . 대답은 다음과 같아야합니다. 인터프리터의 고정 최소 시간 분해능이> = 25 ms 인 디자인 선택이라면 괜찮습니다. 오버로드 / 슬로우 등 온라인 인터프리터가 잘못 / 간단한 구현으로 인해 문제가있는 경우에는 정상이 아닙니다.
Stewie Griffin

1
@Stewie 감사합니다. 그리고 좋은 도전!
Luis Mendo

답변:


6

자바 스크립트 / 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##];

빨간색으로 채워진 초기 보드를 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]]

첫 번째 셀 값을 두 번째 셀 값으로 변경하십시오 (즉, 첫 번째 셀의 이동을 취소하십시오).

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 바이트

이것은 나의 첫 번째 골프이므로 개선이 필요할 것입니다.

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. 대신에 다른 시간을 보여주는 두 개의 그림을 제공하겠습니다 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가 있기 때문에, 더 자세한 설명은 내 대답 참조)
루이스 Mendo

1
c=dec2bin(1:6)-48질서가 중요하지 않기 때문에
Luis Mendo

좋은 첫 대답! 그러나, 내가 당신을 40 %능가하는 것을 두려워 합니다.
Sanchises

약간 아래로 골프 :) 도움 루이스 감사합니다. ! :) 잘 했어요 Sanchises!
CG.

4

MATL , 52 47 바이트

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

입력은 배열 [ncols nrows]입니다. 출력은 벡터 그래픽이있는 그림입니다.

열 15 개 × 행 10 개에 대한 예제 실행 :

여기에 이미지 설명을 입력하십시오

작동 원리

처리 시간을 보정하기 위해 일시 ​​정지 시간이 15ms (25ms와 동일한 바이트 수)로 설정되었습니다.

색상을 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 언어의 미묘함을 악용합니다. 예를 들어, 0 행렬 x로 초기화 m x n되지만 소위 선형 인덱싱을 사용하면 1 차원 인덱스를 사용한 순환 이동이 가능합니다. 약한 타이핑은 논리와의 곱셈을 허용하므로 if문장을 피할 수 있습니다 (TI-84 계산기에서 프로그래밍 할 때 많이 사용했던 트릭). 컬러 맵을 행 단위로 읽더라도 MATLAB은이를 일반 행렬로 취급하므로 eye(3)빨강, 녹색 및 파랑 및 1-eye(3)다른 3 가지 색상 을 만드는 데 사용할 수 있습니다 . 간단한 reshape것은 선형 벡터를 행렬 형태로 다시 가져 오며,이를 사용하여 원하는 색상에 매핑됩니다.ind2rgb . 마지막으로imagesc, 기본 그림 크기로 표시된 이미지를 표시합니다 (요구 사항에 충분히 큼). 운에는 그것이 있기 때문에, imagesc지정된 범위 밖에있는 값을 신경 쓰지 않기 때문에 eye모두 이후 매트릭스를 초기화 할 수 있습니다 10빨간색 간주됩니다.

여기에 이미지 설명을 입력하십시오


1
죄송합니다, 귀하를 찬성하는 것을 잊었습니다 ... 나는 당신의 모든 작은 트릭을 좋아합니다 :-)
CG.

업데이트 된 버전에서 임의의 색이 절대 빨간색이 아닌 것이 맞습니까? 그것은 적어도 Octave에서 그런 식으로 나타납니다 (MATLAB이 없습니다).
Stewie Griffin

@StewieGriffin 나는 이것을 만들 때 자고 있어야합니다. 당신은 물론 완벽하게 맞습니다-그리고 그것은 또한 한 바이트를 절약했습니다 ...
Sanchises

(즉, 2 바이트를 만들)
Sanchises

2

파이썬 3.6 (316 바이트)

ANSI 색상 코드와 Python 3.6 ( PEP 489 ) 의 새로운 형식의 문자열 리터럴 ( f"{X}"마법)을 사용합니다.

그렇지 않으면 꽤 기본이지만 난독 화 된 파이썬입니다. 너비와 높이는 명령 행에서 인수로 전달됩니다.

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 바이트를 절약 할 수 있습니다 . 목록에 대한 호출은 불필요합니다.
Sebastian Riese

또 다른 몇 바이트 다운 : "\x1b["=> "\33["(16 진수 이스케이프 대신 8 진수 사용), X 약어 및 형식 문자열은 실제로 더 길어집니다 (그리고 제거 f""하면 python3과 호환됩니다). (이것은 301 바이트로 떨어질 것입니다).
Sebastian Riese

죄송합니다. {x}한 번만 사용 하지만을 제거하면 승리 X합니다.
Sebastian Riese
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.