Вступление
В этой задаче мы будем моделировать некоторый вероятностный клеточный автомат, используя очень плохие псевдослучайные числа. Клеточный автомат определяется на двоичных строках по следующему локальному правилу. Предположим, что левый сосед ячейки и сама ячейка имеют состояния a
и b
.
- Если
min(a,b) == 0
, то новое состояниеb
ISmax(a,b)
. - Если
min(a,b) == 1
, то новое состояниеb
выбирается случайным образом из{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]
Если мы прочитаем все биты, помеченные знаком 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 для второй строки)