introduzione
In questa sfida, simuleremo un certo automa cellulare probabilistico usando numeri pseudocasuali pessimi. L'automa cellulare è definito su stringhe binarie dalla seguente regola locale. Supponiamo che il vicino di sinistra di una cella e la cella stessa abbiano stati a
e b
.
- Se
min(a,b) == 0
, allora il nuovo stato dib
èmax(a,b)
. - Se
min(a,b) == 1
, allora il nuovo stato dib
viene scelto casualmente da{0,1}
.
La seguente immagine mostra una possibile evoluzione in 10 passaggi di un singolo 1
.
1
11
101
1111
11001
101011
1111111
10001001
110011011
1010111101
Nota come a 1
volte due s adiacenti si evolvono in 1
, e talvolta in 0
, e i bit più bordi sono sempre 1
s. Il tuo compito è quello di produrre un'evoluzione automa cellulare di questa forma.
ingressi
I tuoi input sono un numero intero positivo n
, che indica il numero di righe da visualizzare e un elenco non vuoto di bit L
, che utilizziamo come fonte di casualità.
Produzione
L'output è un elenco di elenchi o array 2D di bit, che rappresentano l'evoluzione di un singolo 1
per i n
passi temporali, come nella figura sopra. 0
Se lo si desidera, è possibile riempire l'output di s per ottenere file di uguale lunghezza, ma non devono essere presenti 0
s iniziali .
Le scelte casuali nell'automa cellulare devono essere disegnate dall'elenco L
, tornando all'inizio quando è esaurito. Più esplicitamente, se l'output viene attraversato una riga alla volta dall'alto verso il basso, da sinistra a destra, le scelte casuali successive formano l'elenco L
ripetuto tutte le volte necessarie.
Esempio
Supponiamo che gli input siano n = 7
e L = [0,1,0]
. Quindi l'automa cellulare si evolve come segue durante i 7 passaggi, dove abbiamo posto un v
diritto sopra ogni scelta casuale:
[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]
Se leggiamo tutti i bit contrassegnati con a v
, otteniamo 01001001
, che viene L
ripetuto 2,66 volte. Il prossimo bit casuale sarebbe 0
.
Regole e punteggio
È possibile scrivere un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard. Il formato esatto degli ingressi e delle uscite non è importante (entro limiti ragionevoli).
Casi test
Versione deterministica, ogni bit casuale è 0
:
Inputs: 10 [0]
Output:
1
11
101
1111
10001
110011
1010101
11111111
100000001
1100000011
Ogni bit casuale è 1
:
Inputs: 6 [1,1]
Output:
1
11
111
1111
11111
111111
Versioni pseudocasuali:
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
emax(a,b)
cona+b
? Mi rendo conto che probabilmente dovresti fare qualcosa per gestire il primo caso di1
->11
(penso che potresti fareL=[1]+f()...
, o trovare un modo per inserire 1 nella parte anterioreL
perché ciò farebbe sempre apparire 1 per la seconda riga)