Вступ
У цьому виклику ми будемо моделювати певний імовірнісний стільниковий автомат, використовуючи дуже погані псевдовипадкові числа. Стільниковий автомат визначається на двійкових рядках за наступним локальним правилом. Припустимо, що лівий сусід клітини і сама клітина мають стани a
і b
.
- Якщо
min(a,b) == 0
, то новий стан Росіїb
єmax(a,b)
. - Якщо
min(a,b) == 1
, то новий станb
A вибирається випадковим чином{0,1}
.
На наступному малюнку показана одна можлива 10-ступінчаста еволюція синглу 1
.
1
11
101
1111
11001
101011
1111111
10001001
110011011
1010111101
Зверніть увагу, як два суміжних 1
s іноді еволюціонують до 1
, а іноді до 0
, і найбільш бітові біти завжди є 1
s. Ваше завдання - створити еволюцію стільникового автомата цієї форми.
Вхідні дані
Ваші вхідні дані - це натуральне число n
, що позначає кількість рядків для відображення, і не порожній список бітів L
, який ми використовуємо як джерело випадковості.
Вихідні дані
Вихід - це список списків або двовимірний масив бітів, що зображує еволюцію одиничного 1
для n
часових кроків, як на малюнку вище. Ви можете накласти на висновок 0
s, щоб отримати рядки однакової довжини, за бажанням, але не повинно бути провідних 0
s.
Випадкові вибори в стільниковому автоматі повинні бути зроблені зі списку L
, відскакуючи на початок, коли він вичерпаний. Більш чітко, якщо результат проходить по одному рядку за часом у формі зверху вниз, зліва направо, то послідовні випадкові вибори формують список, L
повторюваний стільки разів, скільки потрібно.
Приклад
Припустимо, входи є n = 7
і L = [0,1,0]
. Тоді стільниковий автомат розвивається наступним чином протягом 7 кроків, де ми поставили v
право над кожним випадковим вибором:
[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]
Якщо ми прочитаємо всі біти, позначені символом a v
, отримаємо 01001001
, що L
повторюється 2,66 рази. Наступний випадковий біт був би 0
.
Правила та підрахунок балів
Ви можете написати повну програму або функцію. Виграє найменший байт, а стандартні лазівки заборонені. Точний формат входів і виходів є неважливим (в межах причини).
Випробування
Детермінована версія, кожен випадковий біт 0
:
Inputs: 10 [0]
Output:
1
11
101
1111
10001
110011
1010101
11111111
100000001
1100000011
Кожен випадковий біт 1
:
Inputs: 6 [1,1]
Output:
1
11
111
1111
11111
111111
Псевдовипадкові версії:
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)
зa+b>1
іmax(a,b)
зa+b
? Я усвідомлюю, що вам, мабуть, доведеться щось зробити, щоб впоратися з першим випадком1
->11
(я думаю, ви могли б це зробитиL=[1]+f()...
, або знайти якийсь спосіб вставити 1 в передній частині,L
тому що це завжди з'явиться 1 для другого рядка)