Yapışkan ışıklı süsleri canlandırın


22

Bu zorluk benim yasalarımdaki evimdeki yapışkan Noel ışıklarının onuruna.


Buradaki zorluk, dekorasyonu "gerçek zamanlı" olarak gösteren grafiksel bir çıktı oluşturmaktır.

Videoda (gif veya başka bir format), n-by-m dikey ve yatay “ışıklar” olacaktır. 5 <= m, n <= 40 . Çerçeve boyutu ve çözünürlüğü n ve m'ye bağlı olarak değişebilir , ancak n, m = 5 için en az 50x50 piksel olmalıdır (vektör grafikleri TAMAM). Ile bir resim ve şunun gibi görünecek:n=6m=5

görüntü tanımını buraya girin


Dekorasyon:

Renkler:

Tüm ışıklar Aşağıdaki 6 RGB-renklerden biri olacak {255,0,0}, {0,255,0}, {0,0,255}, {255,255,0}, {0,255,255}ve {255,0,255}.

Animasyon:

  • nve mmakul herhangi bir formatta ve istediğiniz sırayla girdi olarak alınacaktır
  • Görüntü her değişecek dt = 25 ms. Tercüman, yavaş bilgisayar vb. Sınırlamalar gibi "dış etkenler" nedeniyle sapmalar iyidir.
    • Zaman adımını manuel olarak ayarlamak mümkün değilse , varsayılan zaman adımı kabul edilir.
  • Tüm ışıklar kırmızı ( {255,0,0}) konumunda olacaktır t=0.
  • İlk ışığın (sol üstte) renk değiştirme olasılığı her zaman% 5'tir. Tüm renkler (şu anda sahip olduğu renkler hariç) eşit derecede muhtemel olmalıdır.
  • Her ışık (ilk hariç) ışığın rengini soluna getirir. Işık en uzaktaysa, yukarıdaki satırda en sağdaki ışığın rengini alır. Işıklar aşağıda gösterildiği gibi numaralandırılmıştır. Işık numarası kışık numarasının rengini alır k-1.

     1  2  3  4  5  6
     7  8  9 10 11 12
    13 14 15 16 17 18
    
  • Çıktı teoride sonsuza dek sürmelidir (dil / tercümanınız bunu önleyen bazı kısıtlamaları yoksa).

  • Lütfen cevapta en az 5 saniye, tercihen daha fazla bir örnek verin (bu bir zorunluluk değil, bir zorunluluktur). (TIO ya da benzeri bir bağlantı elbette ki tamam: D)
  • Çerçeveler, eksenler, ızgara çizgileri vb. Kabul edilir.

6-by-5

görüntü tanımını buraya girin

15-by-30

görüntü tanımını buraya girin


Tercüman yavaşsa, duraklama süresini, resim güncellemeleri arasındaki toplam sürenin örneklerde olduğu gibi olacak şekilde ayarlaması gerekir. Duraklatma gerekli değilse (kod zaten yeterince yavaş ise)? Bu, bayt'ı kurtarabilir, belki de mücadelenin ruhuna karşı
Luis Mendo

1
Uygulama kolaylığı için renkleri seçtiğinizden beri - sınırlı bir renk kümesi olan QBasic gibi dillerde, belirttiğiniz renklere en yakın renkleri kullanmak kabul edilebilir mi? (Kırmızı, yeşil, mavi, sarı, camgöbeği, macenta)
DLosc

Belirtilen renkleri kullanmak mümkün değilse, evet, en yakın alternatifleri kullanmak sorun değil. Sadece biraz daha uzunsa hayır. r,g,y,b,Vb birkaç dilde kısa.
Stewie Griffin,

@LuisMendo, geç cevap için özür dilerim. Cevabında yapma şeklini beğendim. Animasyonu yavaşlatsa bile, 25 ms kullanmak uygun olur. Ben kaçınılması drawnowsonuç çok yavaş beri, MATLAB'da bu uygulamaya ne zaman. Cevabın aşağıdaki gibi olması gerektiğini düşünüyorum: Tercümanın>> 25 msn sabit asgari zaman çözünürlüğüne sahip bir tasarım tercihi ise, tamam. Zayıf / basit bir uygulamadan kaynaklanıyorsa, aşırı yüklenmiş / yavaş vb. Bir çevrimiçi tercüman varsa, sorun değil.
Stewie Griffin

1
@Stewie Anladım, teşekkürler. Ve güzel bir meydan okuma!
Luis Mendo

Yanıtlar:


6

JavaScript / CSS / HTML, 436 bayt

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 bayt

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

açıklama

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

İlk tahtayı 1D'de, kırmızı ile doldurun. Onu sakla b.

Pause@.025

25ms için duraklat

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

Eğer (sözde) rastgele bir gerçek sayı 0.06'dan küçükse, ilk elemanını listenin brastgele örneklem uzunluğuyla değiştirin . (yani herhangi biri )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

Döngüsel sağa döner.

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

İlk hücre değerini ikinci hücre değerine değiştirin (yani ilk hücrenin kaydırmasını geri alın)

Partition[ ... ;b,#]

Bölünme b(yükseklik).

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

Bunu, genişliği 50 (genişlik) olan dinamik (sürekli güncellenen) bir görüntü haline getirin

Hücresel otomat versiyonu (186 bayt)

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

Numune Çıkışı (girişler: 16, 10)

görüntü tanımını buraya girin


6

MATLAB, 255 210 bayt

Bu benim ilk golfüm, bu yüzden muhtemelen yapılacak iyileştirmeler var.

Luis'e 45 bayt kurtarmama yardım ettiğin için teşekkürler :)

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

Açıklama:

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

Ne yazık ki, bu animasyonu kaydetmiyor, sadece çalıştırıyor. Kaydetmek için bir ekran yakalama programına ihtiyacım var ya da hepsini kullanarak yeniden yazmam gerekiyor imwrite. Bunun yerine, farklı zamanlar gösteren iki resim vereceğim n=15,m=30.

görüntü tanımını buraya girin

görüntü tanımını buraya girin


1
Bazı golf önerileri: dec2bin([4 2 1 6 3 5])-48yerine [1 0 0;0 1 0;0 0 1;1 1 0; 0 1 1;1 0 1]. .95yerine 0.95. Ayrıca değiştirebilir .95tarafından .94ve kurtulmak k=k(k~=r);(0.94 + 0.06 / 6 = 0.95 çünkü; daha ayrıntılı açıklama için benim cevap bakınız)
Luis Mendo

1
Daha da iyisi, c=dec2bin(1:6)-48sipariş önemli olmadığı için
Luis Mendo

Güzel ilk cevap! Ancak, korkarım sizi% 40 oranında aşmışımdır .
17'de Sanchises

Biraz aşağı Golf :) :) Yardımın için teşekkürler Luis. ! :) Aferin Sanchises!
CG.

4

MATL , 52 47 bayt

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

Giriş bir dizidir [ncols nrows]. Çıktı vektör grafikleri ile bir rakamdır.

15 satır × 10 satır için örnek çalıştırma:

görüntü tanımını buraya girin

Nasıl çalışır

İşleme süresini telafi etmek için duraklama süresi 15 ms (aynı bayt sayısı için 25 ms) olarak ayarlandı.

Rengi 19/20 olasılıkta tutmak (1/20 ile değiştirmek) için aşağıdakileri uygularız:

  • 47/50 olasılık ile rengi koruruz.
  • 3/50 olasılık ile 6 renk arasından eşit olarak seçilen yeni bir renk seçiyoruz. "Yeni" rengin eskisiyle aynı olduğu ve bunun 1/6 olasılıkla gerçekleştiği görülebilir.

Bu nedenle rengin korunma olası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 bayt

Not : Gösterilen GIF, eski bir sürümdür ve eksenleri görüntülememesi (düzenleme geçmişine bakınız) güzeldir ancak uygulamasından dolayı oldukça yavaştır imshow. Mevcut sürüm için, Chelsea G.'nin MATLAB cevabı veya Luis Mendo'nun MATL cevabı mevcut versiyonumla aynı sonucu göstermektedir.

Boyut bir 2x1vektör olarak alınır , bu nedenle örneğin:

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

Bu cevap MATLAB dilinin inceliklerini kullanır. Örneğin, sıfır matris xolarak m x nsıfırlanmıştır, ancak sözde doğrusal indeksleme , 1 boyutlu endekslerle dairesel kaymaya izin vermektedir. Zayıf yazma, mantıklarla çarpıma izin verir, böylece ififadelerden kaçınılır (programlama günlerinde yoğun bir şekilde TI-84 hesap makinesinde kullandığım bir numara). Bir renk haritası satır satır okunsa bile, MATLAB normal bir matris olarak değerlendirir, böylece eye(3)kırmızı, yeşil ve mavi ve 1-eye(3)diğer üç rengi oluşturmak için kullanılabilir . Bir basit reshape, doğrusal vektörü kullanarak istenen renklerle eşlenen matris biçimine geri getirir ind2rgb. En sonunda,imagesc, varsayılan şekil boyutunda (gereklilikler için yeterince büyük olan) gösterilen resmi gösterir. Şans bu ki, imagescbelirtilen aralığın dışında olmak değerlerini akıl almaz, bu nedenle eyeher iki yana matrisi başlatmak için kullanılabilir 1ve 0kırmızı olarak kabul edilir.

görüntü tanımını buraya girin


1
Maalesef, seni affetmeyi unuttum ... Tüm küçük numaralarını seviyorum :-)
CG.

Güncellenmiş sürümde rastgele rengin hiçbir zaman kırmızı olmadığı doğru mu? En azından Octave'de öyle görünüyor (MATLAB yok).
Stewie Griffin

@StewieGriffin Bunu yaparken uyuyor olmalıyım. Tabii ki kesinlikle haklısın - ve o da bana bir bayt kazandırdı ...
Sanchises

(bu iki baytı yapın)
17:37

2

Python 3.6 (316 Bayt)

ANSI renk kodları ve Python 3.6'nın ( PEP 489 ) ( f"{X}"sihir) yeni biçimlendirilmiş dize değişmezlerinin kullanılması .

Aksi takdirde, sadece oldukça basit, ama şaşkın python. Genişlik ve Yükseklik, komut satırında argüman olarak iletilir.

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)

görüntü tanımını buraya girin


6 bayt kullanarak w,h=map(int,sys.argv[1:]) , herhangi bir yinelenebilir (doğru boyutta) işleri açma, yedekleyebilirsiniz, listeye çağrı gereksiz.
Sebastian Riese,

Aşağıya bir kaç bayt daha: "\x1b[" => "\33["(onaltılık çıkışlar yerine octal kullanarak), sonra X kısaltması ve format dizeleri aslında daha uzun süre yapar (ve f""sizden kurtulmak için herhangi bir python3 ile uyumluluk elde edersiniz). (bu onu 301 bayta indirir).
Sebastian Riese,

Maalesef, bir {x}kere kullanıyorsun ... ama hala kurtularak kazanıyorsun X.
Sebastian Riese,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.