Вступление
В этой задаче мы будем моделировать некоторый вероятностный клеточный автомат, используя очень плохие псевдослучайные числа. Клеточный автомат определяется на двоичных строках по следующему локальному правилу. Предположим, что левый сосед ячейки и сама ячейка имеют состояния aи b.
- Если
min(a,b) == 0, то новое состояниеbISmax(a,b). - Если
min(a,b) == 1, то новое состояниеbвыбирается случайным образом из{0,1}.
Следующая картина показывает одну возможную 10-ступенчатую эволюцию сингла 1.
1
11
101
1111
11001
101011
1111111
10001001
110011011
1010111101
Обратите внимание, как два соседних 1s иногда эволюционируют 1, а иногда 0и биты 1с наибольшей границей всегда равны s. Ваша задача - создать клеточный автомат эволюции этой формы.
входные
Ваши входные данные представляют собой положительное целое число n, обозначающее количество отображаемых строк, и непустой список битов L, который мы используем в качестве источника случайности.
Выход
Ваш вывод представляет собой список списков или двумерный массив битов, изображающий эволюцию одного 1за nвременные шаги, как показано на рисунке выше. Вы можете дополнить вывод 0s, чтобы получить строки равной длины, если это необходимо, но не должно быть начальных 0s.
Случайные выборы в клеточном автомате должны быть взяты из списка 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 для второй строки)