Вступление
В этой задаче мы будем моделировать некоторый вероятностный клеточный автомат, используя очень плохие псевдослучайные числа. Клеточный автомат определяется на двоичных строках по следующему локальному правилу. Предположим, что левый сосед ячейки и сама ячейка имеют состояния 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 для второй строки)r[x-1]&r[x] else
:)MATLAB,
146143138(Также работает в Octave онлайн, но вам необходимо войти в систему, чтобы сохранить функцию в файле).
Функция принимает входные данные
n
иL
и возвращает массив,o
который содержит выходные данные.Для входных значений
n
- скаляр иL
вектор-столбец, который можно указывать в формате[;;;]
. Не совсем то, что вы показываете, но вы говорите, что оно гибкое в разумных пределах, и это кажется так.Вывод форматируется как
n x n
массив, содержащий 0 и 1.И объяснение:
Обновление: мне удалось оптимизировать оператор if-else, чтобы сэкономить несколько байтов. Формат ввода снова изменился на вектор столбцов.
источник
Хаскелл,
153149 байт%
возвращает список битовых списков. Пример использования:О, Боже! Нести случайный список
L
вокруг - это чистая боль. Давайте посмотрим, может ли это быть короче.источник
C #, 152 байта
Здесь нет ничего особенного. Функция возвращает двумерный массив, где первый ранг - это строка, а второй - столбец.
Отступы и новые строки для ясности:
источник
TI-BASIC,
10694878687 байтовУ TI-BASIC нет оператора приращения, верно? Ну, вроде как. Переменная уравнения
u
, обычно используемая с последовательностями, имеет неясную особенность: когдаu
вызывается с аргументом, переменная𝑛
устанавливается на единицу больше, чем этот аргумент. Условное приращение зависит от этого. (Я ждал, чтобы использовать его в течение длительного времени.)Для правильной работы индексации
𝑛
должно быть значение по умолчанию 0, и𝑛Min
умолчанию 1, поэтому либо очистите ОЗУ вашего калькулятора, либо установите эти значения вручную перед запуском.augment({0},Ans)+augment(Ans,{0
вычисляет список сумм двух соседних элементов, поэтому он возвращает список 0, 1 и 2. Тогда магия на этой линии:Результатом этой строки будет то, что элементы списка будут 0, если они были 0 или если они были 2, а считанный бит был 0.
Прецедент:
источник