Общеизвестно, что человек, находящийся на сетке под воздействием алкоголя, имеет равные шансы на движение в любых доступных направлениях. Тем не менее, это утверждение здравого смысла не распространяется на очень маленьких пьяниц, чье поведение очень похоже на то, как если бы они выбирали все доступные пути одновременно, и возможные пути, которые они выбирают, могут мешать друг другу. Ваша задача - отобразить возможные позиции такого квантового пьяницы после n
шагов.
Спецификация
Рассматриваемый пьяница занимает квадратную сетку и может рассматриваться как клеточный автомат с 3 состояниями, использующий окрестность фон Неймана (в форме плюса), которая следует этим простым правилам:
Empty
идет к тому,Awake
если он находится рядом с ровно однимAwake
, а в противном случае идет кEmpty
Awake
идет кSleeping
Sleeping
идет кSleeping
Начальное состояние доски - это одно Awake
окружение, окруженное бесконечным полем Empty
s.
Вызов
Учитывая неотрицательное целое число n
, создайте представление ASCII пьяницы после n
шагов. Каждое состояние должно быть представлено другим символом, и в решениях должно быть указано, какой символ означает какое состояние. Если вы используете пробелы для Empty
, вам не нужно включать их в конце строки.
Это код-гольф , поэтому выигрывает самый короткий ответ. Применяются стандартные лазейки , разрешены пробелы в начале и в конце, разрешен вывод строкового массива / двумерного массива и т. Д.
Примеры
Эти примеры используют для
Empty
, @
для Awake
и #
для Sleeping
.
n=0
@
n = 1
@
@#@
@
n = 2
@
#
@###@
#
@
n = 3
@
@#@
@ # @
@#####@
@ # @
@#@
@
n=6
@
#
@###@
@#@
@ ### @
#@# # #@#
@###########@
#@# # #@#
@ ### @
@#@
@###@
#
@
n=10
@
#
@###@
@#@
###
# # #
#######
# ### #
@ ## ### ## @
#@# ### # ### #@#
@###################@
#@# ### # ### #@#
@ ## ### ## @
# ### #
#######
# # #
###
@#@
@###@
#
@
Интересная заметка
Посмотрев последовательность числа занятых клеток в OEIS, я обнаружил, что квантовый пьяница изоморфен гораздо лучше изученной последовательности зубочисток . Если вы сможете использовать эти знания в лучшем гольфе, я буду приятно удивлен.
источник
n=10
правильно? Я попробовал несколько подходов, и все они получают один и тот же (неправильный) ответ, поэтому я просто хочу убедиться. Это выглядит немного странно, но я не знаю.Ответы:
Wolfram Language (Mathematica) ,
9291 байтИдеальный вызов, чтобы использовать встроенную Mathematica
CellularAutomaton
!Попробуйте онлайн!
Пустой = 0, Пробужденный = 1, Спящий = 2
Анимация первых 256 итераций (белый = пустой, серый = активный, черный = спящий):
объяснение
Запустите
CellularAutomaton
со спецификациями ...Примените трехцветное тоталистическое правило 7049487784884 с окрестностью фон Неймана ...
На доске с одним 1 посередине, с фоном 0s ...
Повторите
<input>
раз ({j#}
оценивает{{{#}}}
). Массив автоматически расширяется, если ячейка за пределами границы не совпадает с фономЭто правило взято из числа base-3
220221220221220221220221220
, что означает «изменить все1
или2
на2
и изменить0
на1
тогда и только тогда, когда1
вокруг него нечетное число s».Распечатать массив.
Полу-доказательство «нечетного
1
» эквивалентно «ровно одному1
»:Рассмотрим эту 5x5 сетку пикселей. Белый - это
0
или2
ячейка (не пробужденные пиксели), а серый - это1
ячейка.Если
1
ячейка была сгенерирована вокруг трех0
ячеек, то сетка должна выглядеть следующим образом: она имеет три1
s, расположенных в форме буквы U (или повернутую версию), следующим образом:Из-за самоподобия этого клеточного автомата любая фигура, которая появляется в клеточном автомате, должна появляться на диагонали (по индукции). Однако этот рисунок не является диагонально симметричным. то есть это не может произойти по диагонали и не может появиться где-нибудь на клеточном автомате.
Пробуждение / Спящий эквивалент
Обратите внимание, что
0
ячейка не может быть окружена ровно одной или тремя2
ячейками и остальными0
ячейками, поскольку это подразумевало бы, что за несколько шагов до этого ячейка имела соседа из одной или трех1
ячеек - и, должно быть, уже превратилась в1
(противоречие). Следовательно, можно игнорировать различие между1
и2
и состоянием «измените все1
на1
, и a0
на a,1
если и только если у него нечетное число ненулевых соседей».Получающийся в результате клеточный автомат действительно идентичен оригиналу, единственное отличие состоит в том, что нет различий между «проснувшимися» и «спящими» пьяницами. Этот шаблон описан в OEIS A169707 .
Попробуйте онлайн!
Параллельное сравнение первых 16 итераций:
Добавление двух последовательных итераций дает результат, соответствующий спецификациям вызова (94 байта):
Попробуйте онлайн!
источник
Python 2 , 192 байта
Попробуйте онлайн!
-17 байт благодаря Mr. Xcoder
-9 байт с использованием выходного формата Джонатана
-11 байт благодаря Lynn
-3 байт благодаря ovs
источник
exec
сохраняет 9 байтов и…for k in 0,1,2,3for…
сохраняет еще один: Ссылкаn=[C+k for k in-1j,1j,-1,1for C in c]
сохраняет еще один байт!X+Y*1jin
, что я действительно не думал, что это возможно: PС
360354343319Символы новой
#define
строки после строк не предназначены для представления здесь, поэтому они не учитываются. Я включил функцию-обертку, так что это −6 (313), если функция не считается, и вы предполагаете, что онаn
пришла откуда-то еще.q(10)
выходы:Использование
для пустых,
"
для сна и!
для бодрствования.Это работает так:
A(i,b,e)
«∀i∈ [b, e).»,B(b,e)
«∈r∈ [b, e) .∀c∈ [b, e).»Обратите внимание, что после n поколений, доска составляет 2 n + 1 квадрат.
Из-за симметрии доски это нужно только для имитации нижнего правого квадранта, поэтому мы выделяем n + 1 квадратную матрицу с 1 строкой и столбцом заполнения для последующего поиска соседей (так что n + 2).
Выделение с помощью
calloc
позволяет нам одновременно умножить ширину на высоту и очистить доску до0
(пусто).При поиске ячейки по ее координатам (
C
иD
) она использует абсолютное значение строки и столбца (W
) для автоматического отражения координат.Доска хранится в виде массива пар целых чисел, представляющих текущее и предыдущее поколения. Рассматриваемые целые числа таковы,
char
что мы можем избежатьsizeof
.Поколение, которое чаще всего просматривалось (по тесту соседей), относится к прошлому, поэтому оно помещается в индекс 0 в паре, поэтому к нему можно получить доступ
*
.При каждом поколении (
g
) текущее поколение копируется поверх предыдущего поколения с использованиемB
цикла, затем новое поколение генерируется из старого.Каждая ячейка представлена как
0
для пустой,1
для бодрствования, так и2
для сна. Подсчет соседей первоначально был вычислением количества битов, установленных в младших 4 битах ячейки, когда эти 4 соседа сдвинуты и ИЛИ вместе как flags (N
), используя16
для ожидания. Но с учетом того, что нечетное число соседей эквивалентно ровно одному соседу, мы можем сохранить несколько символов, просто используя маску с 1.В конце доска печатается полностью путем итерации по нижнему правому квадранту, используя тот же трюк координат абсолютного значения, минус отступы, поэтому мы не печатаем внешние отступы на доске. Именно поэтому
B
цикл включает в себя открывающую фигурную скобку, потому что у нас есть дополнительный оператор новой строки во внешнем цикле.Коды ASCII удобно отображают 0 + 32 (пусто) в пробел, 2 + 32 (спит) в
"
и 1 + 32 (в пробуждении) в!
.В общем, я думаю, что это удивительно читаемый гольф из-за хорошей структуры проблемы.
источник
putchar(10)
сputs("")
&~
это не NAND, я имел в виду, что иногда я думаю о!(a &~ b)
терминахa NAND (NOT b)
, хотя в данном случае логика!
не совпадает с побитовой,~
потому что мы полагаемся на результат0
или1
результат!
.MATL , 39 байт
Это отображает
Empty
как(пробел)
Awake
как#
Sleeping
как!
.Попробуйте онлайн! Вы также можете наблюдать рост рисункав ASCII-графике или графически (измененный код).
объяснение
Код использует комплексные числа
0
,1
,j
чтобы представить три состояния: пустые, поминки, спать соответственно.источник
Befunge,
384304 байтаПопробуйте онлайн!
Проблема с попыткой реализации такого рода вещей в Befunge заключается в ограниченном объеме памяти (2000 байтов как для данных, так и для кода). Поэтому мне пришлось использовать алгоритм, который вычисляет правильный символ для любой заданной координаты без ссылки на предыдущие вычисления. Это достигается путем рекурсивного оглядывания во времени всех возможных путей, которыми пьяница, возможно, следовал, чтобы достичь этой точки.
К сожалению, это не очень эффективное решение. Это работает, но невероятно медленно, и становится экспоненциально медленнее, чем больше значение n . Таким образом, хотя он потенциально может работать для любого n, вплоть до 127 (предел ячейки памяти 7-битной памяти Befunge), на практике вы неизбежно потеряете интерес в ожидании результата. На TIO тайм-аут на 60 секунд превысит 6 (в лучшем случае). Компилятор будет работать намного лучше, но даже тогда вы, вероятно, не захотите идти намного выше 10.
Тем не менее, я подумал, что это стоило представить, потому что это действительно хорошая демонстрация рекурсивной «функции» в Befunge.
источник
Python 2 , 214 байтов
Попробуйте онлайн!
объяснение
Использует
0
дляempty
,1
дляsleeping
и2
дляawake
. Распечатывает список двумерных символов (строки одной длины).Определяет функцию, которая принимает неотрицательное целое число
n
. Успешно продвигает клеточный автомат, пока не будет достигнуто желаемое состояние. Наконец, выполняется преобразование между внутренними целочисленными значениями и фактическими символами.источник
Lua ,
251242239238 байт-8 байт за счет упрощения инициализатора массива за счет дополнительных начальных пробелов.
-1 байт, переходя
c=i==2+...and print(s)
вc=i~=2+...or print(s)
.-3 байта, сначала собрав полную строку и напечатав один раз в конце.
-1 байт благодаря Джонатану Фреху , переписав
or(g(...)==1 and
какor(1==g(...)and
.Попробуйте онлайн!
Пусто =
Пробуждение =
1
Спящий =
0
Принимает ввод из командной строки и печатает на стандартный вывод.
Представляя состояния , как
false
/nil
,1
и0
внутренне, обнаруживая «пустой» не нуждается в какой - либо код , и «точно один бодрствует» проверка может быть сделано только с добавлением.источник
or(g(...)==1 and
может бытьor(1==g(...)and
.APL (Dyalog) , 38 байт
Попробуйте онлайн!
-4 спасибо Адаму .
-8 благодаря нгн .
источник
Желе ,
3929 байтПопробуйте онлайн!
Использует
0
,1
и2
для пустой бодрствует и спит. Сноска в ссылке преобразует это,
@
и#
.ṬŒḄ
вместоḤḶ=¹
.-
вместо1N
. Также делает¤
ненужным.S
вместо+/
.Ḃ+Ḃ+
вместо%3=1+=1Ḥ$+
. Теперь использует2
для сна вместо3
.Объяснение идет ...
источник
APL (Dyalog Classic) , 38 байт
Попробуйте онлайн!
на основе решения Эрика Аутгольфера
⍪1
матрица 1x1, содержащая 1⎕
проверенный ввод( )⍣⎕
применять это много раз(⌽0,⍉)⍣4
окружить 0, то есть 4 раза: transpose (⍉
), добавить 0 слева (0,
), повернуть по горизонтали (⌽
)g←3+/0,,∘0
функция, которая суммирует горизонтальные тройки, назовите ееg
⍉∘g∘⍉
функция, которая суммирует вертикальные тройки - этоg
под транспозицией2 | ⍉∘g∘⍉ + g←3+/0,,∘0
сумма двух сумм по модулю 2⌈
чем больше между этим и ...2∘∧
LCM 2 и исходная матрица - это превращает 1 с в 2 с, сохраняя 0 и 2источник
Perl 5 , 192 + 1 (
-n
) = 193 байтаПопробуйте онлайн!
Использует 0 для пустого, 1 для бодрствующего и 2 для спящего.
источник
Рубин ,
164153 байтаПопробуйте онлайн!
Использует "" для пустого, "@" для пробуждения и "#" для сна (как в примере). Полагаю, я мог бы сэкономить 6 байтов, используя вместо этого числа, но это выглядит лучше.
источник
Пип ,
6961 байт60 байтов кода, +1 за
-l
флаг.Принимает
n
в качестве аргумента командной строки. Используется0
для пустых,1
для бодрствования и2
для сна. (Чтобы получить более качественный ASCII-арт, как в примерах задания, замените финалy
на" @#"@y
.)Попробуйте онлайн!
объяснение
Настроить:
Основной цикл:
где тело функции:
После цикла мы просто автопечать
y
.-l
Флаг означает , что вложенный список печатается путем конкатенации содержимого каждой строки и разделяя строки с символами новой строки.источник
Java (OpenJDK 8) , 220 байт
Попробуйте онлайн!
Примечание: возвращаемый массив содержит границу или
'\0'
символы. Поскольку предполагается, что плоскость бесконечна, используется только не граница.Отображение символов:
(пробел)
=
0
Сохраняет
источник
@
проверку, и вы нашли ключ! Приятно.char
Литой был полный контроль со мной.Python,
199192 байтаЭтот код работает как на Python 2, так и на Python 3, но он использует популярную стороннюю библиотеку Numpy для обработки массива.
print(f(6))
выходыЕсли вы хотите более красивую печать, вы можете назвать это так:
который печатает, используя те же символы, что и в вопросе.
источник
[e]ach state should be represented by a different character
(я интерпретируюcharacter
как фактический символ ASCII, а не как целое число).