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