Задача проста: написать программу или функцию, которая при задании конечного неотрицательного целого числа выводит вложенный массив.
Правила
- Ваш код должен создавать уникальный действительный вложенный массив для каждого целого числа 0 ≤ n <2 31 .
- Каждый возможный вложенный массив с до 16 открытых скобок должен быть выведен в этом диапазоне. (Это не означает, что ваш код никогда не сможет вывести вложенный массив с более чем 16 открытыми скобками.)
- Ваш код может выводить строковое представление вложенного массива вместо фактического массива (с запятыми или без них).
Одно из возможных сопоставлений:
0 -> []
1 -> [[]]
2 -> [[[]]]
3 -> [[], []]
4 -> [[[[]]]]
5 -> [[[], []]]
6 -> [[[]], []]
7 -> [[], [[]]]
8 -> [[], [], []]
9 -> [[[[[]]]]]
etc.
счет
Это код-гольф , поэтому выигрывает самый короткий код в байтах.
code-golf
array-manipulation
balanced-string
ETHproductions
источник
источник
Ответы:
Python 2,7,
172 149 124118 байтОбъяснение:
Определите биекцию с помощью
[
↔1
и]
↔0
. Любое расположение скобок может быть записано в виде двоичного числа и наоборот, например,[][]
↔1010
(10) и[[][]]
↔110100
(52). Все действительные схемы, содержащие до 15 открытых скобок (всего 30 скобок), охватываются числами до 30 разрядов (без учета начальных нулей), которые в точности равны числам, меньшим 2 31 .Первый цикл for дает обратное значение этой биекции, преобразуя число в расположение скобок, одновременно проверяя, является ли это расположение действительным.
Недопустимые размещения заменяются в операторе печати длинными последовательностями скобок, чтобы избежать коллизий. Например,
11
(3) ↔[[
недопустимо, поэтому вместо этого мы объединяем 3 + 16 скобок. Это гарантирует, что все договоренности являются уникальными.Результирующее расположение помещается в пару скобок, чтобы создать вложенный массив, так что
1010
(10) становится[[][]]
и110100
(52) становится[[[][]]]
. Дополнительная открытая скобка означает, что теперь мы закрыли все массивы 16 открытыми скобками.Следующая программа может быть использована для определения числа для данного массива до 16 скобок.
источник
Python,
153128 байтМы отображаем число n во вложенный список, просматривая его двоичные цифры слева направо. Этот алгоритм работает для любого числа, а не только до 2 32 .
[
.][
.][
.]
.Наконец, мы закрываем все открытые скобки.
источник
Ложка , 63 байта (501 бит)
Это следующая программа BrainFuck, преобразованная в ложку:
Читает целое число в двоичном формате на стандартный ввод и выводит вложенный список на стандартный вывод. Требуется 0 для ввода в качестве пустой строки (без цифр), а также требуется интерпретатор мозгового штурма с 8-битными ячейками. Тот же алгоритм, что и мой ответ на Python.
Читаемая версия:
источник
Желе , 28 байт
Это перебирает все строки символов
[
и]
которые начинаются с[
и заканчивается]
, проверяет , если скобки совпадают, и печатают п - й матч.Попробуйте онлайн!
источник
Perl,
8079 байтовСнова использует алгоритм orlp , но на этот раз я впервые проверил, работает ли он ...
Включает +1 для
-p
Дайте номер ввода на STDIN
nest.pl
:Решение Линуса составляет 64 байта в perl:
Решение Денниса составляет 59 байтов в perl (для больших чисел все медленнее):
источник
-p
считается 1 дополнительный байтPython 3,
120114 байтПроверьте это на Ideone .
Как это работает
Определенная функция f принимает входные данные n и инициализирует k как 0 . Мы будем увеличивать k до тех пор, пока n + 1 значений k не приведет к правильному выводу. Каждый раз, когда мы находим такое значение k , n уменьшается при достижении -1 ,
~n
возвращает 0 и печатается список r, который соответствует последнему значению k .Частичное отображение из натуральных чисел во вложенные списки (т. Е. K k r ) должно быть биективным, но других ограничений нет. Тот, который используется в этом ответе, работает следующим образом.
Преобразовать k в двоичное строковое представление, начиная с 0b .
Например, 44 ↦ "0b101100" .
Замените все 0 (кодовая точка 48 ) в строковом представлении на строку "], а все 1 (кодовая точка 49 ) на [ .
Например, "0b101100" ↦ "], b [], [[],]," .
Удалите первые три символа (они соответствуют "0b" ) и завершающий символ (возможно, запятую).
Например, "], b [], [[],]," ↦ "[], [[],]" .
Попробуйте оценить сгенерированный код. Если это приводит к ошибке, k не отображается ни в один список.
Например, «[], [[],]» ↦ ([], [[]]) .
Объединить результат (если есть) с пустым списком. Если это приводит к ошибке, k не отображается ни в один список.
Например, ([], [[]]) + [] ошибки, поскольку + не может объединять списки и кортежи.
источник
Haskell, 71 байт
Основная функция в последней строке индексирует в список всех вложенных массивов, отсортированных по размеру (количеству открытых скобок). Итак, все массивы размером не более 16 перечислены первыми.
Давайте сначала посмотрим на код, который приятнее и короче, но проверка типов в Haskell отказывается его принимать.
Функция
p
на входеn
дает список всех вложенных массивов размераn
(открытые скобки). Это делается рекурсивно. Каждый такой массив состоит из некоторой головыh
(первого члена) размераk
и некоторого хвостаt
(других членов)n-k
, причем оба размера отличны от нуля. Или это пустой массив для размераn==1
.Выражение
p=<<[1..]
затем выравниваетсяp(1), p(2), ...
в один бесконечный список всех массивов, отсортированных по размеру.и главная функция указывает на это.
... Или, если бы Хаскелл не скулил о "построении бесконечного типа: t ~ [t]". Haskell не может представлять бесконечный список, над элементами которого являются произвольно вложенные массивы. Все его элементы должны иметь одинаковый тип, но тип t не может совпадать со списком t. На самом деле, функция
p
нельзя присвоить согласованный тип без зависимой типизации, чего нет у Haskell.Таким образом, вместо этого мы работаем со строками скобок, моделируя операцию cons, воздействуя на символы
[
и]
символы. Это занимает дополнительные 9 байтов. Опасности игры в гольф на безопасном языке.источник
Haskell,
8782 байтаВыводит элементы массива. Пример использования:
(([0..]>>= \y->y#y)!!) 3
->"[][]"
.Функция
#
строит все вложенные массивы как строки дляn
открытых иm
закрытых скобок, отслеживая, сколько из них осталось. Всегда начинается сn == m
. Основная функция вызываетy # y
для каждогоy <- [0,1,...]
и выбирает элемент по индексу, указанному на входе.источник
MATL , 31 байт
Попробуйте онлайн! Или проверьте первые несколько тестовых случаев (занимает несколько секунд).
Произведенное отображение:
объяснение
Код продолжает тестировать увеличивающиеся двоичные числа, с
0
заменой цифры на-1
; то есть используя1
и-1
как цифры. Цифра1
будет представлять'['
и-1
будет представлять']'
.Программа считает до n +1 действительных чисел. Номер действителен, если выполняются следующие два условия:
1
и-1
)1
цифр всегда превышает цифру-1
), кроме как в конце (где она равна нулю по условию 1).После получения n +1 действительных чисел последнее транслитерируется путем перехода
1
в[
и-1
в]
, а затем отображается.Код:
источник