Фон
Случайный Domino Automaton игрушки модель для землетрясений, вдохновленная клеточными автоматами. В этой задаче ваша задача - смоделировать упрощенную версию этой модели и собрать из нее данные.
Автомат задается на массив A
из k
битов, представляющих собой линии разлома , на котором может произойти землетрясения. Массив оборачивается на своих границах. В состоянии A[i] = 0
означает , что позиция i
является расслаблена , и A[i] = 1
означает , что она возбуждается , или содержат запас энергии. На каждом временном шаге одна позиция массива выбирается случайным образом равномерно. Если это положение расслаблено, оно становится возбужденным (потенциальная энергия добавляется в систему). Если эта позиция уже взволнована, она вызывает землетрясение, и выбранная позиция и все связанные с ней возбужденные позиции снова ослабляются. Количество возбужденных позиций, которые становятся расслабленными, является величиной землетрясения.
пример
Рассмотрим массив
100101110111
длины 12. Если случайный процесс выбирает второй бит слева, массив обновляется до
110101110111
^
так как выбранный бит (отмечен ^
) был 0
. Если мы затем выберем четвертый бит слева, который является изолированным 1
, землетрясение магнитудой 1 сработает, и бит будет установлен 0
снова:
110001110111
^
Затем мы можем выбрать второй бит справа, который вызовет землетрясение магнитудой 5:
000001110000
^
Обратите внимание, что все находящиеся 1
в том же «кластере», что и выбранный, были частью землетрясения, и массив обвивается вокруг границы.
Задание
Вы должны взять в качестве входных данных два натуральных числа k
и t
, и ваша задача - моделировать случайный автомат домино для t
временных шагов, начиная с начального k
массива длины всех 0
s. Ваш вывод должен быть список L
из k
целых чисел, где L[i]
(с индексацией с 1) содержит число землетрясений величины , i
которые имели место во время моделирования. Вам разрешено отбрасывать конечные нули с выхода.
Для входов k = 15
и t = 1000
некоторые репрезентативные выходы
[117, 97, 45, 26, 10, 5, 3, 1, 3, 0, 0, 0, 0, 0, 0]
[135, 91, 58, 21, 8, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0]
[142, 63, 51, 31, 17, 4, 2, 1, 1, 0, 0, 0, 0, 0, 0]
[106, 75, 45, 30, 16, 8, 5, 2, 2, 0, 0, 0, 0, 0, 0]
[111, 96, 61, 22, 3, 8, 3, 2, 0, 0, 0, 1, 0, 0, 0]
правила
Разрешены как полные программы, так и функции. Самый короткий счет байтов побеждает, и стандартные лазейки запрещены.
Обратите внимание, что вам не требуется моделировать автомат с использованием какой-либо конкретной реализации, важен только вывод.
Ответы:
Pyth, 48 байтов
Получил немного вдохновения от объяснения @ Денниса. Вчера у меня были похожие мысли, но они не следовали им.
Попробуйте онлайн: демонстрация
Объяснение:
источник
CJam,
5755 байтЭто анонимная функция, которая извлекает k и t из стека ( k сверху t ) и оставляет желаемый массив взамен.
Попробуйте онлайн в интерпретаторе CJam .
Как это устроено
источник
Python 2, 153 байта
Оказывается, у меня было почти то же самое решение, что и у Фрая , но с немного большим возня.
источник
randrange
, но я не понимал, что это работает только с одним аргументом. Хорошо сделано!Ява,
278272 байтаЯва не лучший язык гольфа, и я не лучший игрок в гольф, но было очень весело писать, так что вот оно! Дайте мне знать об ошибках и улучшениях! (Я решил повторно представить как просто функцию.)
И файл с пробелами и комментариями:
источник
Alt+09
илиd[q]+=1;
это может привести к тому, чтоd[q]++;
вы можете увеличивать значения непосредственно в массивах вместо использования + = везде. Это должно спасти кучу персонажей.for(;t>0;t--){
можно изменить наfor(;t-->0;){
: DPython 2,
174170Спасибо @Vioz за то, что нашли более короткий способ заработать
D
и еще раз доказали, чтоnot
это, как правило, игра в гольф. А также для написания объяснения.Я пытался создать подобную программу на Pyth, но, похоже, проблема в том, что я пытался сделать. Это довольно наивно реализует домино, а функция
U
распространяет землетрясения. Направление вычитания вU
не нуждается в моде, потому что оно будет естественным. Последний элементE
подсчитывает, сколько раз ноль превращается в единицу, поэтому в конце он не печатается.Ungolfed + Объяснение:
источник
D[r]=not e
кD[r]=e<1
сохраняет 2 байта, аE=[0]*-~k
дляE=D+[0]
экономит еще 2, чтобы получить вас вниз до 170.ES6,
224196189179172Легкие вещи были в гольфе, но все еще есть над чем поработать. Я напишу объяснение позже. Кроме того, если кто-то скажет мне, почему короткая
new Date%k
вещь не работает так хорошо, это было бы здорово.Использование
источник
new
. Вам не нужно этоt
в цикле for, нет необходимости в последних двух;
a[r]^=1
будет Defs работы , если начальное значение либо1
или0
Perl, 212
Предыдущая версия, которую я поставил, была неправильно упакована, и для ее реализации потребовалась определенная работа.
Вероятно, это не правильный алгоритм для этого, но я не могу сейчас думать. Развернутая версия ниже.
Ungolfed:
источник
CJam, 76 байт
Ну, это не очень конкурентоспособно. Но так как это заняло у меня достаточно много времени, я все равно решил написать.
Попробуйте онлайн
источник