Este desafío es en honor a las horteras luces navideñas en la casa de mis suegros.
El desafío es crear una salida gráfica que muestre la decoración en "tiempo real".
El video (gif u otro formato) tendrá "luces" verticales y horizontales n-por-m . 5 <= m, n <= 40 . El tamaño de imagen y resolución pueden variar dependiendo de n y m , pero deben ser al menos de 50x50 píxeles para n, m = 5 (gráficos vectoriales es OK). Una imagen con n=6
y m=5
se verá más o menos así:
La decoración:
Colores:
Todas las luces tendrán una de las siguientes 6-colores RGB {255,0,0}
, {0,255,0}
, {0,0,255}
, {255,255,0}
, {0,255,255}
y {255,0,255}
.
Animación:
n
ym
se tomará como entrada en cualquier formato razonable y en el orden que desee- La imagen cambiará cada
dt = 25 ms
. Las desviaciones están bien si se debe a "factores externos" como la limitación en el intérprete, la computadora lenta, etc.- Si es imposible establecer el paso de tiempo manualmente, entonces se acepta el paso de tiempo predeterminado.
- Todas las luces serán rojas (
{255,0,0}
) ent=0
. - Siempre hay un 5% de posibilidades de que la primera luz (arriba a la izquierda) cambie de color. Todos los colores (excepto el color que tiene actualmente) deberían ser igualmente probables.
Cada luz (excepto la primera) obtendrá el color de la luz a su izquierda. Si la luz está en el extremo izquierdo, obtendrá el color de la luz en el extremo derecho en la fila de arriba. Las luces están numeradas como se muestra a continuación. El número de luz
k
obtendrá el color del número de luzk-1
.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
En teoría, el resultado debería ejecutarse para siempre (a menos que su idioma / intérprete tenga alguna limitación que lo impida).
- Proporcione una muestra de al menos 5 segundos, preferiblemente más en la respuesta (esto es un estímulo, no un requisito). (Un enlace a TIO o similar, por supuesto, también está bien: D)
- Se aceptan marcos, ejes, líneas de cuadrícula, etc.
6 por 5
15 por 30
r,g,y,b,
etc son más cortos en varios idiomas.drawnow
cuando implementé esto en MATLAB, ya que el resultado fue demasiado lento. Creo que la respuesta debe ser: si es una elección de diseño que el intérprete tenga una resolución de tiempo mínima fija de> = 25 ms, entonces está bien. Si se debe a una implementación pobre / simple, un intérprete en línea que está sobrecargado / lento, etc., entonces no está bien.Respuestas:
JavaScript / CSS / HTML, 436 bytes
fuente
Mathematica,
186161158 bytesExplicación
Crea el tablero inicial en 1D, lleno de rojo. Almacene eso en
b
.Pausa de 25 ms
Si un número real (pseudo-) aleatorio es menor que 0.06, reemplace el primer elemento de
b
con una longitud3
de muestra aleatoria de la lista{1,1,0,0}
. (es decir, cualquiera de{1, 1, 0}, {1, 0, 1}, {1, 0, 0}, {0, 1, 1}, {0, 1, 0}, {0, 0, 1}
)Cíclico rotar a la derecha.
Cambie el valor de la primera celda al valor de la segunda celda (es decir, deshaga el desplazamiento de la primera celda)
Partición
b
en (altura).Conviértalo en una imagen dinámica (en constante actualización), cuyo ancho es 50 (ancho)
Versión de autómata celular (186 bytes)
Salida de muestra (entradas: 16, 10)
fuente
MATLAB,
255210 bytesEste es mi primer golf, por lo que probablemente haya mejoras por hacer.
Gracias a Luis por ayudarme a ahorrar 45 bytes :)
Explicación:
Desafortunadamente, esto no guarda la animación, solo la ejecuta. Para guardarlo, necesito un programa de captura de pantalla o lo reescribo todo usando
imwrite
. En cambio, proporcionaré dos imágenes que muestran tiempos diferentes, paran=15,m=30
.fuente
dec2bin([4 2 1 6 3 5])-48
lugar de[1 0 0;0 1 0;0 0 1;1 1 0; 0 1 1;1 0 1]
..95
en lugar de0.95
. También puede reemplazar.95
por.94
y deshacerse dek=k(k~=r);
(0,94 + 0,06 porque / 6 = 0,95; ver mi respuesta para una explicación más detallada)c=dec2bin(1:6)-48
como el orden no importaMATL ,
5247 bytesLa entrada es una matriz
[ncols nrows]
. La salida es una figura con gráficos vectoriales.Ejemplo ejecutado para 15 cols × 10 filas:
Cómo funciona
El tiempo de pausa se ha establecido en 15 ms (para el mismo número de bytes que 25 ms) para intentar compensar el tiempo de procesamiento.
Para mantener el color con una probabilidad de 19/20 (cámbielo con 1/20), procedemos de la siguiente manera:
Por lo tanto, la probabilidad de mantener el color es 47/50 + 3 / (50 * 6) = 19/20.
fuente
MATLAB,
153147 bytesNota : El GIF que se muestra es de la versión anterior, lo cual es bueno ya que no muestra ejes (ver el historial de edición), pero fue extremadamente lento debido a la implementación de
imshow
. Para la versión actual, la respuesta MATLAB de Chelsea G. o la respuesta MATLAB de Luis Mendo muestran el mismo resultado que mi versión actual.El tamaño se toma como un
2x1
vector, así que llame como, por ejemplo:Esta respuesta explota las sutilezas del lenguaje MATLAB. Por ejemplo,
x
se inicializa como unam x n
matriz cero, pero la denominada indexación lineal permite el desplazamiento circular con índices unidimensionales. La escritura débil permite la multiplicación con lógica, por lo queif
se evitan las declaraciones (un truco que utilicé mucho en los días de programación en una calculadora TI-84). Aunque un mapa de colores se lee en hileras, MATLAB lo trata como una matriz normal, de modo queeye(3)
se puede usar para crear rojo, verde y azul, y1-eye(3)
los otros tres colores. Un simplereshape
devuelve el vector lineal a la forma de matriz, que se asigna a los colores deseados utilizandoind2rgb
. Finalmente,imagesc
, muestra la imagen, que se muestra con el tamaño de figura predeterminado (que es lo suficientemente grande para los requisitos). La suerte quiso queimagesc
no le importa valores que se están fuera del rango especificado, por lo queeye
se puede utilizar para inicializar la matriz, ya que ambos1
y0
son considerados rojo.fuente
Python 3.6 (316 Bytes)
Usando códigos de color ANSI y los nuevos literales de cadena formateados de Python 3.6 ( PEP 489 ) (la
f"{X}"
magia).De lo contrario, es bastante básico, pero Python ofuscado. Ancho y Altura se pasan como argumentos en la línea de comando.
fuente
w,h=map(int,sys.argv[1:])
, desempaquetar funciona con cualquier iterable (del tamaño correcto), la llamada a la lista es superflua."\x1b["
=>"\33["
(usando escapes octales en lugar de hexadecimales), luego la abreviatura X y las cadenas de formato en realidad lo hacen más largo (y al deshacerse def""
usted obtendrá compatibilidad con cualquier python3). (Esto lo reducirá a 301 bytes).{x}
una vez ... pero aún así ganas al deshacerte de élX
.