Пустой список - это список, который ни на каком уровне не содержит объектов, не входящих в список. Или, если вы предпочитаете рекурсивное определение
Пустой список недействителен
Список, содержащий только другие пустые списки, является недействительным
Все списки пустот имеют конечную глубину.
Вот несколько примеров списков пустот (с использованием синтаксиса Python):
[]
[[]]
[[],[]]
[[[]]]
[[[]],[]]
[[],[[]]]
Вот несколько примеров того, что не является списком пустот:
["a"]
[[...]]
[1]
2
[[],([],[])]
задача
Напишите две отдельные функции (или программы, если вы предпочитаете). Один должен взять положительное целое число (вы также можете включить ноль, если хотите) в качестве аргумента и вернуть список пустот, другой должен взять список пустот и вернуть ему целое число. Эти две функции всегда должны быть противоположны друг другу. То есть, если вы передадите вывод f
в, g
вы должны получить исходный результат f
как результат g
. Это означает, что отображение должно быть 1: 1, т. Е. Для каждого целого числа может существовать только один список пустот, для которого g
дается это целое число, а для каждого списка пустот должно быть ровно одно целое число, для которого f
этот список пустот.
Вы по сути создаете Биекцию
Вы можете использовать строковое представление списка пустот (с запятыми или без пробелов) вместо родного типа списка ваших языков.
счет
Ваша оценка будет длина ваших двух функций вместе. Это код-гольф, поэтому вы должны стремиться минимизировать эту сумму.
Ответы:
Pyth, 27 + 29 = 56 байт
f
:Тестирование
g
:Тестирование
Система очень проста: я генерирую все возможные списки с не более чем определенным числом
[
. Затем я сортирую их так, чтобы списки, которые я еще не создал, были ближе к концу. Все это делает функцияy
, идентичная в обеих программах. Написано какЗатем я включаю в этот список
f
и ищу егоg
.Количество сгенерированных мной списков выбрано достаточно большим, чтобы я сгенерировал все возможные списки, которые должны появиться в или перед желаемым местом в бесконечном отсортированном списке.
Программы позволяют / возвращают 0 в качестве опции.
источник
Python 2 , 96 байт
Попробуйте онлайн! проверить биекцию.
Принимает пустые списки с неотрицательными целыми числами. 42 байта.
Принимает неотрицательные целые числа для аннулирования списков. 54 байта. Более рекурсивная попытка дала такую же длину.
источник
Java 7, 725 байт
f(int)
( 325 байт ):g(String)
( 75 + 325 байт ):Так как метод
g
использует методf
для вычисления своего результата, перебирая возможный список пустот, пока не найдет тот, который равен введенному, байтыf
считаются дважды (так как оба метода должны иметь возможность работать без другого для этой задачи).Объяснение:
В общем случае метод
f
просто перебирает все двоичные String-представления целых чисел и увеличивает счетчик каждый раз, когда найден действительный. Допустимые двоичные строки для этой задачи соответствуют следующим правилам: они начинаются с a1
и заканчиваются a0
; они имеют равное количество единиц и нулей; и каждый раз, когда вы удаляете первое1
и0
снова проверяете то, что осталось, эти два правила все еще применяются. После того, как счетчик равен входному значению, он преобразует эту двоичную строку в список пустых строк, заменяя все1
на[
и все0
на]
.Что касается метода
g
: мы начинаем с"[]"
(представляющего void-list0
), а затем продолжаем использовать методf
, увеличивая целое число, пока оно не будет соответствовать input-String.Примеры случаев ввода и вывода:
Попробуй это здесь. (ПРИМЕЧАНИЕ. В последние несколько тестов это происходит довольно медленно. На все это уйдет около 10-15 секунд.)
источник
[][]
это список. Возможно, я неправильно понимаю, как Java делает что угодно. Добавление[...]
вокруг всех из них и наличие 0 карты[]
должно сделать свое дело.K (нгн / к) , 49 байтов
Попробуйте онлайн!
использует формулу из примера в Bijection: древовидные списки - натуральные числа
источник
JavaScript (Node.js) , 82 байта
Попробуйте онлайн!
идея кснора
источник
Python 3 - знак / абс, 73 байта
Попробуйте онлайн!
Прямая реализация, поддерживает отрицательные числа.
Целое число
i
закодировано[sign(i), abs(i)]
, гдеsign(i)=[] if i > 0 else [[]]
иabs(i)=[[]] * i
, т.е. список пустых списков с длиной abs (i).Python 3 - двоичный файл, 126 байт
Это более сложная версия (и намного длиннее ...), где абсолютное значение кодируется в виде двоичного списка.
Попробуйте онлайн!
источник
Stax , всего 33 байта
Эти программы противоположны друг другу. Они преобразуются в и из всех списков пустот и всех неотрицательных целых чисел, так что они включают 0. Кажется, что это может быть известная функция из какой-то алгебры, которую я не знаю. Чтобы обернуть голову вокруг этого, я сначала реализовал программы как функции в python.
Программы Stax ведут себя одинаково.
Неотрицательное целое число → Список пустот, 15 байт
Запустите и отладьте его
Список пустот → неотрицательное целое число, 18 байт
Запустите и отладьте его
источник