Анімовані липкі легкі прикраси


22

Цей виклик - на честь ліпких різдвяних вогнів у моєму будинку законів.


Завдання полягає у створенні графічного виводу, що відображатиме прикрасу в режимі реального часу.

Відео (gif чи інший формат) матиме n-by-m вертикальні та горизонтальні "вогні". 5 <= m, n <= 40 . Розмір та роздільна здатність кадру можуть змінюватись залежно від n та m , але повинні бути не менше 50x50 пікселів для n, m = 5 (векторна графіка нормальна). Зображення з n=6і m=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

введіть тут опис зображення


Якщо інтерпретатор повільний, чи слід відрегулювати час паузи, щоб загальний час між оновленнями зображення був аналогічним, як у прикладах? Що робити, якщо пауза не потрібна (код уже досить повільний)? Це врятувало б байтів, можливо, проти духу виклику
Луїс Мендо

1
Оскільки ви вибрали кольори для зручності реалізації - на таких мовах, як QBasic, які мають обмежений набір кольорів, чи допустимо використовувати найближчі доступні кольори до тих, які ви вказали? (Червоний, зелений, синій, жовтий, блакитний, пурпурний)
DLosc

Якщо неможливо використовувати вказані кольори, то так, нормально використовувати найближчі альтернативи. Якщо це трохи більше, то ні. r,g,y,b,тощо коротше на декількох мовах.
Стюі Гріффін

@LuisMendo, вибачте за пізню відповідь. Мені подобається, як ти це зробив у своїй відповіді. Було б нормально використовувати 25 мс, навіть якщо це зробить анімацію повільнішою. Я уникав цього, drawnowколи впроваджував це в MATLAB, оскільки результат був занадто повільним. Я думаю, що відповідь повинна бути: Якщо це вибір проекту, що інтерпретатор має фіксовану мінімальну роздільну здатність часу> = 25 мс, тоді це нормально. Якщо це пов’язано з поганою / простою реалізацією, інтерпретатором, який перевантажений / повільним і т.д., тоді це не нормально.
Стюі Гріффін

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

Математика, 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

Пауза на 25 мс

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

МАТЛАБ, 255 210 байт

Це мій перший гольф, тому, мабуть, слід вдосконалити.

Дякую Луїсу за допомогу мені зберегти 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,06 0,94 / 6 = 0,95; див моя відповідь для більш докладного пояснення)
Луїс Mendo

1
А ще краще c=dec2bin(1:6)-48, оскільки порядок не має значення
Луїс Мендо

Приємна перша відповідь! Однак я боюся, що я перемогла вас на 40% .
Санчіз

Гольфували його трохи :) Дякую за допомогу Луїсу. ! :) Молодці Санчісе!
КГ.

4

MATL , 52 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 є старшою версією, що приємно, оскільки він не відображає осі (див. Історію редагування), але був надзвичайно повільним завдяки впровадженню imshow. Для поточної версії відповідь MATLAB Челсі Г. або відповідь Луїса Мендо показує такий же результат, як і моя поточна версія.

Розмір приймається як 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може використовуватися для ініціалізації матриці, оскільки обидва 1і 0вважаються червоними.

введіть тут опис зображення


1
На жаль, забув вас підтримати ... Я люблю всі ваші маленькі хитрощі :-)
CG.

Чи правильно, що в оновленій версії випадковий колір ніколи не червоний? Так виглядає в Октаві принаймні (не майте MATLAB).
Стюі Гріффін

@StewieGriffin Я, мабуть, спав, коли робив це. Ви, звичайно, абсолютно праві - і це також врятувало мені байт ...
Санчіз

(зробіть це два байти)
Санчіз

2

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

введіть тут опис зображення


Ви можете зекономити 6 байт, використовуючи w,h=map(int,sys.argv[1:]), розпаковуючи роботи з будь-яким ітерабельним (потрібного розміру), дзвінок до списку є зайвим.
Себастьян Різе

Ще кілька байтів вниз: "\x1b["=> "\33["(використовуючи восьмигранник замість шістнадцяткових біг), тоді абревіатура X і рядки формату насправді роблять її довшою (і, позбувшись, f""ви отримаєте сумісність з будь-яким python3). (це знизить його до 301 байта).
Себастьян Різе

На жаль, ви використовуєте {x}один раз ... але ви все одно перемагаєте, позбувшись X.
Себастьян Різе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.