Animer des décorations lumineuses collantes

22

Ce défi est en l'honneur des lumières de Noël collantes chez mes beaux-parents.


L'enjeu est de créer une sortie graphique montrant la décoration en "temps réel".

La vidéo (gif ou autre format) aura des "lumières" verticales et horizontales n par m . 5 <= m, n <= 40 . La taille et la résolution du cadre peuvent varier en fonction de n et m , mais doivent être d'au moins 50x50 pixels pour n, m = 5 (les graphiques vectoriels sont OK). Une image avec n=6et m=5ressemblera à ceci:

entrez la description de l'image ici


La décoration:

Couleurs:

Toutes les lumières auront l' un des 6 couleurs RGB suivantes {255,0,0}, {0,255,0}, {0,0,255}, {255,255,0}, {0,255,255}et {255,0,255}.

Animation:

  • net mseront prises en entrée sur n'importe quel format raisonnable et dans l'ordre que vous aimez
  • L'image changera à chaque fois dt = 25 ms. Les écarts sont OK s'ils sont dus à des "facteurs extérieurs" tels que la limitation de l'interpréteur, un ordinateur lent, etc.
    • S'il est impossible de définir le pas de temps manuellement, le pas de temps par défaut est accepté.
  • Tous les voyants seront rouges ( {255,0,0}) à t=0.
  • Il y a toujours 5% de chances que la première lumière (en haut à gauche) change de couleur. Toutes les couleurs (à l'exception de la couleur actuelle) devraient être tout aussi probables.
  • Chaque lumière (sauf la première) aura la couleur de la lumière à sa gauche. Si la lumière est à l'extrême gauche, elle obtiendra la couleur de la lumière à l'extrême droite dans la rangée ci-dessus. Les lumières sont numérotées comme indiqué ci-dessous. Le numéro de lumière kaura la couleur du numéro de lumière k-1.

     1  2  3  4  5  6
     7  8  9 10 11 12
    13 14 15 16 17 18
    
  • La sortie devrait en théorie fonctionner pour toujours (sauf si votre langue / interprète a une limitation qui l'empêche).

  • Veuillez fournir un échantillon d'au moins 5 secondes, de préférence plus dans la réponse (c'est un encouragement, pas une exigence). (Un lien vers TIO ou similaire est bien sûr OK aussi: D)
  • Les cadres, axes, lignes de grille, etc. sont acceptés.

6 par 5

entrez la description de l'image ici

15 par 30

entrez la description de l'image ici

Stewie Griffin
la source
Si l'interpréteur est lent, devrait être ajuster le temps de pause afin que le temps total entre les mises à jour d'image soit similaire à celui des exemples? Et si la pause n'est pas nécessaire (le code est déjà suffisamment lent)? Cela économiserait des octets, peut-être contre l'esprit du défi
Luis Mendo
1
Puisque vous avez choisi les couleurs pour faciliter la mise en œuvre - dans des langages comme QBasic qui ont un jeu de couleurs intégré limité, est-il acceptable d'utiliser les couleurs disponibles les plus proches de celles que vous avez spécifiées? (Rouge, vert, bleu, jaune, cyan, magenta)
DLosc
S'il est impossible d'utiliser les couleurs spécifiées, alors oui, vous pouvez utiliser les alternatives les plus proches. Si c'est juste un peu plus, alors non. r,g,y,b,etc sont plus courts en plusieurs langues.
Stewie Griffin
@LuisMendo, excuses pour la réponse tardive. J'aime la façon dont vous l'avez fait dans votre réponse. Ce serait bien d'utiliser 25 ms, même si cela ralentissait l'animation. J'ai évité drawnowquand j'ai implémenté ceci dans MATLAB, car le résultat était trop lent. Je pense que la réponse doit être: si c'est un choix de conception que l'interprète a une résolution temporelle minimale fixe de> = 25 ms, alors c'est OK. Si cela est dû à une implémentation médiocre / simple, à un interpréteur en ligne surchargé / lent, etc., ce n'est pas OK.
Stewie Griffin
1
@Stewie J'ai compris, merci. Et beau défi!
Luis Mendo

Réponses:

6

JavaScript / CSS / HTML, 436 octets

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>

Neil
la source
6

Mathematica, 186 161 158 octets

(b=Table[{1,0,0},1##];Dynamic@Image[Partition[[email protected];If[Random[]<.06,b[[1]]={1,1,0,0}~RandomSample~3];b=RotateRight@b;b[[1]]=b[[2]];b,#],ImageSize->50#])&

Explication

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

Créez le tableau initial en 1D, rempli de rouge. Conservez-le dans b.

[email protected]

Pause de 25 ms

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

Si un nombre réel (pseudo-) aléatoire est inférieur à 0,06, remplacez le premier élément de bpar une longueur d'échantillonnage aléatoire 3de la liste {1,1,0,0}. (c'est-à-dire n'importe lequel de {1, 1, 0}, {1, 0, 1}, {1, 0, 0}, {0, 1, 1}, {0, 1, 0}, {0, 0, 1})

b=RotateRight@b

Cyclique tourner à droite.

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

Remplacez la première valeur de cellule par la deuxième valeur de cellule (c.-à-d. Annulez le décalage de la première cellule)

Partition[ ... ;b,#]

Partition ben (hauteur).

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

Faites-en une image dynamique (constamment mise à jour), dont la largeur est de 50 (largeur)

Version automate cellulaire (186 octets)

(b=Table[{1,0,0},1##];Dynamic@Image[Partition[[email protected];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#])&

Exemple de sortie (entrées: 16, 10)

entrez la description de l'image ici

JungHwan Min
la source
6

MATLAB, 255 210 octets

C'est mon premier golf, donc il y a probablement des améliorations à apporter.

Merci à Luis de m'avoir aidé à économiser 45 octets :)

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

Explication:

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

Malheureusement, cela ne sauvegarde pas l'animation, il l'exécute simplement. Afin de le sauvegarder, j'ai besoin d'un programme de capture d'écran ou tout réécrire à l'aide imwrite. Au lieu de cela, je fournirai deux images montrant des heures différentes, pour n=15,m=30.

entrez la description de l'image ici

entrez la description de l'image ici

CG.
la source
1
Quelques suggestions de golf: dec2bin([4 2 1 6 3 5])-48au lieu de [1 0 0;0 1 0;0 0 1;1 1 0; 0 1 1;1 0 1]. .95au lieu de 0.95. Vous pouvez également remplacer .95par .94et se débarrasser de k=k(k~=r);(parce que 0,94 + 0,06 / 6 = 0,95, voir ma réponse pour une explication plus détaillée)
Luis Mendo
1
Mieux encore, c=dec2bin(1:6)-48car l'ordre n'a pas d'importance
Luis Mendo
Belle première réponse! Cependant, je crains de vous avoir dépassé de 40% .
Sanchises
Golfé un peu :) Merci pour l'aide Luis. ! :) Bien joué Sanchises!
CG.
4

MATL , 52 47 octets

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

L'entrée est un tableau [ncols nrows]. La sortie est une figure avec des graphiques vectoriels.

Exemple exécuté pour 15 colonnes × 10 lignes:

entrez la description de l'image ici

Comment ça marche

Le temps de pause a été défini sur 15 ms (pour le même nombre d'octets que 25 ms) pour essayer de compenser le temps de traitement.

Pour conserver la couleur avec une probabilité de 19/20 (changez-la avec 1/20), nous procédons comme suit:

  • Avec une probabilité de 47/50, nous gardons la couleur.
  • Avec une probabilité de 3/50, nous choisissons une nouvelle couleur choisie uniformément parmi les 6 couleurs. Il peut arriver que la "nouvelle" couleur soit la même que l'ancienne, et cela se produit avec une probabilité 1/6.

Ainsi, la probabilité de conserver la couleur est de 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
Luis Mendo
la source
3

MATLAB, 153 147 octets

Remarque : Le GIF montré est de l'ancienne version, ce qui est agréable car il n'affiche pas les axes (voir l'historique des modifications), mais était extrêmement lent en raison de la mise en œuvre de imshow. Pour la version actuelle, la réponse MATLAB de Chelsea G. ou la réponse MATL de Luis Mendo montrent le même résultat que ma version actuelle.

La taille est considérée comme un 2x1vecteur, alors appelez par exemple:

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

Cette réponse exploite les subtilités du langage MATLAB. Par exemple, xest initalisé comme une m x nmatrice nulle, mais l'indexation dite linéaire permet un décalage circulaire avec des indices unidimensionnels. Un typage faible permet une multiplication avec des logiques, de sorte que les ifinstructions sont évitées (une astuce que j'ai beaucoup utilisée à l'époque de la programmation sur une calculatrice TI-84). Même si une palette de couleurs est lue par ligne, MATLAB la traite comme une matrice normale, de sorte qu'elle eye(3)peut être utilisée pour créer du rouge, du vert et du bleu, et 1-eye(3)les trois autres couleurs. Un simple reshaperamène le vecteur linéaire sous forme matricielle, qui est mappé aux couleurs souhaitées à l'aide ind2rgb. Finalement,imagesc, montre l'image, montrée à la taille de figure par défaut (qui est assez grande pour les exigences). Comme par hasard aurait-il, imagescne me dérange pas les valeurs étant en dehors de la plage spécifiée, donc eyepeut être utilisé pour initialiser la matrice puisque les deux 1et 0sont considérés comme rouge.

entrez la description de l'image ici

Sanchises
la source
1
Oups, j'ai oublié de vous voter ... J'adore tous vos petits trucs :-)
CG.
Est-il exact que la couleur aléatoire n'est jamais rouge dans la version mise à jour? Cela apparaît de cette façon dans Octave au moins (ne pas avoir MATLAB).
Stewie Griffin
@StewieGriffin J'ai dû dormir quand j'ai fait ça. Vous avez bien sûr parfaitement raison - et cela m'a également fait gagner un octet ...
Sanchises
(faites deux octets)
Sanchises
2

Python 3.6 (316 octets)

Utilisation des codes de couleurs ANSI et des nouveaux littéraux de chaîne formatés de Python 3.6 ( PEP 489 ) (la f"{X}"magie).

Sinon, c'est juste assez basique, mais du python obscurci. La largeur et la hauteur sont transmises comme arguments sur la ligne de commande.

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)

entrez la description de l'image ici

Jonas Schäfer
la source
Vous pouvez épargner 6 octets en utilisant w,h=map(int,sys.argv[1:]), le déballage fonctionne avec n'importe quel itérable (de la bonne taille), l'appel à la liste est superflu.
Sebastian Riese
Encore quelques octets vers le bas: "\x1b["=> "\33["(en utilisant octal au lieu des échappements hexadécimaux), puis l'abréviation X et les chaînes de formatage le rendent réellement plus long (et en vous débarrassant de f""vous, vous obtenez la compatibilité avec n'importe quel python3). (cela le ramènera à 301 octets).
Sebastian Riese
Oups, vous utilisez {x}une fois ... mais vous gagnez toujours en vous débarrassant X.
Sebastian Riese