Эта конструкция является способом представления натуральных чисел.
В этом представлении 0 определяется как пустое множество, а для всех остальных чисел n является объединением {0} и {n-1}.
Например, чтобы построить 3 мы можем следовать алгоритму:
3 =
{ø, 2} =
{ø, {ø, 1}} =
{ø, {ø, {ø}}}
задача
Как вы уже догадались, ваша задача - взять натуральное число (включая ноль) и вывести его конструкцию.
Вы можете выводить как строку или как набор объектов, если ваш язык поддерживает такие объекты.
Если вы решили вывести в виде строки, вы должны представить набор с помощью фигурных скобок ( {}
). При желании вы можете представить пустой набор как ø
(иначе это должен быть набор без записей {}
). Вы также можете добавить запятые и пробелы между и после записей в наборе.
Порядок не важен, однако у вас может не быть повторяющихся элементов в наборе, который вы выводите (например {ø,ø}
)
Это код-гольф, поэтому цель состоит в том, чтобы иметь наименьшее количество байтов
Контрольные примеры
Вот несколько тестовых примеров с некоторыми примерами выходных данных.
0 -> {}
1 -> {{}}
2 -> {{}{{}}}
3 -> {{}{{}{{}}}}
4 -> {{}{{}{{}{{}}}}}
источник
Ответы:
Python , 28 байт
Попробуйте онлайн!
Это довольно мягкое решение проблемы. Для чисел больше нуля вы можете получить представление с помощью строковой формулы
"{{}"*x+"}"*x
. Однако это не работает для нуля, где это пустая строка. Мы можем использовать этот факт для короткого замыкания иor
возврата пустого набора.Я хотел использовать встроенные объекты Python для решения этой проблемы, но, к сожалению:
Вы не можете поместить наборы внутри наборов в Python.
источник
x
к"{{}"*x+x*"}"or
сохранению байтаf=
может быть удаленfrozenset
не получил байты за это ...Haskell , 37 байт
Попробуйте онлайн!
До 10 минут назад такой ответ не имел для меня никакого смысла. Все кредиты перейдите к этому совету ответа .
По сути, мы используем
>>
какconcat $ replicate
(но передавая ему список из n элементов вместо просто n) и=<<
какconcatMap
, затем реплицируем затем n раз каждую строку в списке и объединяем результат в одну строку.0
Случай рассматривается отдельно , как это будет возвращать пустую строку.источник
f 1
чтобы он работал правильноJavaScript, 28 байт
Представляет наборы с использованием массивов. 38-байтовое нерекурсивное решение:
Возвращает пример выходных строк.
источник
Mathematica, 27 байт
У меня есть два решения на этот счет байтов:
источник
#//.{1->{{}},x_/;x>1->{{},x-1}}&
. Хотя я предполагаю, что этоPerl 6 , 37 байт
Попытайся
Expanded:
источник
:
или это что-то новое для Perl 6?05AB1E ,
65 байтКод
Использует кодировку CP-1252 . Попробуйте онлайн! или проверьте все контрольные примеры! ,
объяснение
источник
F¯)
разве это не работает?n=0
, так как вывод пустой (не пустой набор).Сетчатка , 22 байта
Попробуйте онлайн!
объяснение
Преобразовать ввод в унарный.
Замените все одинарные цифры на
{{}
и напечатайте результат без завершающего перевода строки (\
).Удалите отверстия
{
s, чтобы оставшиеся}
были именно теми, которые нам еще нужно распечатать, чтобы закрыть все наборы. Однако вышеприведенная процедура не подходит для ввода0
, где мы ничего не печатали бы. Так...Если строка пуста, замените ее пустым набором.
источник
n
времени в сетчатке ...Brain-Flak , 135 байтов
Включает +1 для
-A
Попробуйте онлайн!
источник
Рёда , 37 байт
источник
CJam , 11 байт
Печатает подобный множеству объект, состоящий из списков списков. CJam печатает пустые списки как пустые строки, так как списки и строки почти взаимозаменяемы.
Попробуйте онлайн!
объяснение
Старый ответ,
2118 байтЭто было до того, как было подтверждено, что можно распечатать структуру вложенного списка. Использует алгоритм повторения строк.
Сохранено 3 байта благодаря Мартину Эндеру!
объяснение
источник
Желе , 6 байт
Это нильадная ссылка, которая читает целое число из STDIN и возвращает рваный массив.
Попробуйте онлайн!
Как это устроено
источник
Python 3 , 32 байта
Не самый короткий путь, но я просто должен был сделать это с помощью рекурсии.
Попробуйте онлайн!
источник
Кардинал ,
5150 байтПопробуйте онлайн!
объяснение
Получите ввод и отправьте вниз и влево от #
Выведите «{» один раз, затем выведите «{} {» n-1 раз, если n> 1, затем выведите «{}», если n> 0
Удерживайте входное значение до завершения первого цикла
Выведите «}» один раз, затем повторите n-1 раз, если n> 1
источник
AHK, 55 байт
Это не самый короткий ответ, но мне понравилось, потому что особенности AutoHotkey заставляют этот метод рекурсии выглядеть супер неправильно.
If
иLoop
операторы предполагают, что следующая строка - единственное, что включено, если скобки не используются. Вьющиеся скобки - это экранирующие символы, поэтому вы должны избегать их с другими вьющимися скобками, чтобы использовать их в качестве текста. Кроме того, переменная1
является первым переданным аргументом. Когда я читаю код, не зная этих лакомых кусочков, логика выглядит так:s
равным неправильный ответБез всех escape-символов в скобках это будет выглядеть так:
источник
JavaScript 50 байт
источник
тинилисп , 52 байта
Попробуйте онлайн! (испытательный жгут).
объяснение
Обратите внимание, что
(cons x (cons y nil))
именно так вы строите список, содержащийx
иy
в Лиспе.источник
C (gcc) , 52 байта
Воспользовавшись некоторой оценкой короткого замыкания и рекурсией.
Попробуйте онлайн!
источник
Pure Bash ,
494841 байтПопробуйте онлайн!
источник
постоянный ток , 46 байт
Попробуйте онлайн!
Вход на стандартный вывод, вывод на стандартный вывод.
Это работает путем вычисления формулы для желаемого выхода в виде числа 256. Затем команда P в dc используется для вывода числа base-256 в виде строки.
Дальнейшее объяснение:
Пусть n будет входом n. Программа dc вычисляет сумму
A = floor (256 ^ n / 255) * 125 (BF интерпретируется dc как 11 * 10 + 15 = 125)
и
B = этаж ((256 ^ n) ^ 3 / (8 ^ 8-1)) * 8092541 * (256 ^ n).
Для:
Заметьте, что 1 + 256 + 256 ^ 2 + ... + 256 ^ (n-1) равно (256 ^ n-1) / 255 по формуле геометрической прогрессии, и это равно полу (256 ^ n / 255 ). Так что это число, состоящее из n 1 в базе 256.
Когда вы умножаете его на 125, чтобы получить A, результатом является число, состоящее из n 125 в базе 256 (конечно, 125 - это одна цифра в базе 256). Вероятно, лучше записать цифры в базе 256 в виде шестнадцатеричных чисел; 125 - это шестнадцатеричное 7D, поэтому A - это число 256, состоящее из n 7D в ряду.
B похож:
На этот раз обратите внимание, что 1 + 16777216 + 16777216 ^ 2 + ... + 16777216 ^ (n-1) равно (16777216 ^ n - 1) / 16777215, и это равно полу (16777216 ^ n / 16777215).
Теперь 256 ^ 3 = 16777216 и 8 ^ 8-1 = 16777215, так что это то, что мы вычисляем как пол ((256 ^ n) ^ 3 / (8 ^ 8-1)).
Из представления геометрической серии это число в базе 256 равно 100100100 ... 1001, где n цифр равно 1, а остальные цифры равны 0.
Это умножается на 8092541, то есть 7B7B7D в шестнадцатеричном формате. В базе 256 это трехзначное число, состоящее из цифр 7B, 7B и 7D (для удобства записи эти цифры в шестнадцатеричном формате).
Отсюда следует, что произведение, записанное в базе 256, представляет собой 3-значное число, состоящее из 3 цифр 7B, 7B, 7D, повторенных n раз.
Это умножается на 256 ^ n, в результате получается 4-значное число с 256-значным числом, состоящее из 3 цифр 7B 7B 7D, повторенных n раз, за которыми следуют n 0. Это Б.
Добавление A + B теперь приводит к получению 4-значного числа Base-256, состоящего из 3 цифр 7B 7B 7D, повторенных n раз, за которыми следуют n 7D. Поскольку 7B и 7D являются кодами ASCII для
{
и}
, соответственно, это строка, состоящая из n копий, за{{}
которыми следуют n копий}
, что в точности соответствует тому, что мы хотим при n> 0. Команда P в dc печатает число base-256 как строка, так же, как нам нужно.К сожалению, n = 0 следует рассматривать как особый случай. Вышеприведенные вычисления дают результат 0 при n = 0; в этом случае я просто жестко запрограммировал печать строки
{}
.источник
Java 7, 61 байт
Попробуйте онлайн!
источник
Пакетная, 88 байтов
источник
Brainf *** , 99 байт
(новая строка для эстетики) Поскольку это brainf ***, он принимает ввод в виде кодов символов ascii (ввод "a" соответствует 96)
Braineasy, 60 байт
Кроме того, на моем собственном языке (на основе brainf **, переводчик здесь ):
Вы должны жестко закодировать ввод программы в интерпретатор, потому что я ленивый.
источник
[]
? Кажется, что его можно удалить05AB1E ,
53 байтаПопробуйте онлайн!
Эта версия после того, как он уточнил, что наборы в порядке.
Старая версия (которая использует ø):
05AB1E ,
54 байтаПопробуйте онлайн!
Где
1
эквивалентноø
.источник