Introducción
En este desafío, simularemos un cierto autómata celular probabilístico usando números pseudoaleatorios muy malos. El autómata celular se define en cadenas binarias mediante la siguiente regla local. Suponga que el vecino izquierdo de una celda y la celda misma tienen estados a
y b
.
- Si
min(a,b) == 0
, entonces el nuevo estado deb
esmax(a,b)
. - Si
min(a,b) == 1
, entonces el nuevo estado deb
se elige aleatoriamente{0,1}
.
La siguiente imagen muestra una posible evolución de 10 pasos de un solo 1
.
1
11
101
1111
11001
101011
1111111
10001001
110011011
1010111101
Tenga en cuenta cómo dos 1
s adyacentes a veces evolucionan hacia 1
, y a veces hacia 0
, y los bits más al borde siempre son 1
s. Su tarea es producir una evolución del autómata celular de esta forma.
Entradas
Sus entradas son un número entero positivo n
, que denota el número de filas para mostrar, y una lista no vacía de bits L
, que utilizamos como fuente de aleatoriedad.
Salida
Su salida es una lista de listas o una matriz de bits 2D, que representa la evolución de un solo paso 1
de n
tiempo, como en la figura anterior. Puede rellenar la salida con 0
s para obtener filas de igual longitud, si lo desea, pero no debe haber 0
s iniciales .
Las elecciones aleatorias en el autómata celular se deben extraer de la lista L
, volviendo al principio cuando se agota. Más explícitamente, si la salida se recorre de una fila a la vez de arriba a abajo, de izquierda a derecha, las sucesivas elecciones aleatorias formarán la lista L
repetida tantas veces como sea necesario.
Ejemplo
Supongamos que las entradas son n = 7
y L = [0,1,0]
. Luego, el autómata celular evoluciona de la siguiente manera durante los 7 pasos, donde hemos puesto un v
derecho sobre cada elección aleatoria:
[1]
[1,1]
v
[1,0,1]
[1,1,1,1]
v v v
[1,1,0,0,1]
v
[1,1,1,0,1,1]
v v v
[1,0,0,1,1,1,1]
Si leemos todos los bits marcados con a v
, obtenemos 01001001
, que se L
repite 2,66 veces. El siguiente bit aleatorio sería 0
.
Reglas y puntuación
Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten. El formato exacto de las entradas y salidas no es importante (dentro de lo razonable).
Casos de prueba
Versión determinista, cada bit aleatorio es 0
:
Inputs: 10 [0]
Output:
1
11
101
1111
10001
110011
1010101
11111111
100000001
1100000011
Cada bit aleatorio es 1
:
Inputs: 6 [1,1]
Output:
1
11
111
1111
11111
111111
Versiones pseudoaleatorias:
Inputs: 10 [0,0,1]
Output:
1
11
101
1111
10101
111111
1010011
11110101
101011111
1111101001
Inputs: 10 [1,0,0,1]
Output:
1
11
111
1001
11011
111111
1001101
11010111
111111101
1011001111
Inputs: 15 [1,1,1,0,0,0]
Output:
1
11
111
1111
10001
110011
1110111
11011001
111111011
1100011111
11100100011
111101100101
1001111101111
11011000111111
101101001011101
fuente
min(a,b)
cona+b>1
ymax(a,b)
cona+b
? Me doy cuenta de que probablemente tengas que hacer algo para manejar el primer caso de1
->11
(creo que podrías hacerloL=[1]+f()...
, o encontrar alguna forma de insertar 1 en la parte delanteraL
porque eso siempre aparecería 1 para la segunda línea)r[x-1]&r[x] else
:)MATLAB,
146143138(También funciona en Octave en línea, pero debe iniciar sesión para guardar la función en un archivo).
La función toma una entrada
n
yL
, y devuelve una matrizo
que contiene la salida.Para los valores de entrada,
n
es un escalar yL
es un vector de columna, que puede especificarse en el formato[;;;]
. No es exactamente lo que muestra, pero dice que es flexible dentro de lo razonable y esto parece ser así.La salida está formateada como una
n x n
matriz que contiene 0 y 1.Y una explicación:
Actualización: He logrado optimizar la declaración if-else para guardar algunos bytes. El formato de entrada ha vuelto a cambiar al vector de columna.
fuente
Haskell,
153149 bytes%
devuelve una lista de listas de bits. Ejemplo de uso:¡Oh querido! Llevar la lista al azar
L
es puro dolor. Veamos si esto puede ser más corto.fuente
C #, 152 bytes
No hay nada especial aquí. La función devuelve una matriz 2D donde el primer rango es la línea y el segundo es la columna.
Sangrado y nuevas líneas para mayor claridad:
fuente
TI-BASIC,
10694878687 bytesTI-BASIC no tiene un operador de incremento, ¿verdad? Bueno, más o menos. La variable de ecuación
u
, normalmente utilizada con secuencias, tiene una característica oscura: cuandou
se llama con un argumento, la variable𝑛
se establece en uno mayor que ese argumento. El incremento condicional depende de esto. (He estado esperando para usarlo durante mucho tiempo).Para que la indexación de listas funcione correctamente,
𝑛
debe ser su valor predeterminado de 0, y𝑛Min
debe ser su valor predeterminado de 1, por lo tanto, borre la RAM de su calculadora o establezca esos valores manualmente antes de ejecutar esto.augment({0},Ans)+augment(Ans,{0
calcula una lista de sumas de dos elementos adyacentes, por lo que devolverá una lista de 0s, 1s y 2s. Entonces la magia está en esta línea:El resultado de esta línea será que los elementos de la lista son 0 si eran 0 o si fueran 2 y el bit leído era 0.
Caso de prueba:
fuente