Из Википедии Теоретико-множественное определение натуральных чисел
Множество N натуральных чисел определяется как наименьшее множество, содержащее 0 и замкнутое по преемственной функции S, определенной как S (n) = n ∪ {n}.
Первые несколько чисел, определенных таким образом: 0 = {}, 1 = {0} = {{}}, 2 = {0,1} = {{}, {{}}}, 3 = {0,1,2 знак равно
Используя это определение натуральных чисел, посчитайте длину строки.
Введите строку символов из a-zA-Z любой длины
Вывести длину строки в заданной нотации без разделителей
Примеры
Введите пустую строку
Выход {}
Ввод
Выход {{}}
Вход аааа
Выходные данные {{} {{}} {{} {{}}} {{} {{}} {{} {{}}}}}
Для читабельности вывода «аааа» с разделителями
{
{}
{{}}
{{} {{}} }
{{} {{}} {{} {{} } } }
}
условия
- В коде не должно быть цифр от 0 до 9;
- Не использовать преобразование кодов символов для генерации чисел;
- Не использовать + - * / для арифметических вычислений, включая увеличение и уменьшение;
- Никаких математических операций, кроме логической логики;
- Входная строка не учитывается при определении длины байта;
Победитель Наименьшая длина кода в байтах.
Поскольку это мой первый вопрос, я надеюсь, что разъяснил его достаточно четко и строго. Дружеский совет принят.
f(n-1)
?Ответы:
GolfScript (
1817 байт)Принимает данные в стеке (поэтому, если запущен как программа, через stdin). Оставляет вывод в виде двух строк в стеке (поэтому при запуске в виде программы правильный вывод отправляется на стандартный вывод).
Чтобы оставить одну строку в стеке, либо добавьте
+
к concat, либо используйте альтернативныйрассечение
Альтернатива:
Влияние ограничений
Если бы было разрешено уменьшение, это позволило бы 15-байтовое решение
источник
Функция Haskell,
3534 персонажаПрограмма на Haskell с жестко закодированным вводом,
48 или 4947 или 48 символов(47 символов, если вы не возражаете против дополнительных кавычек вокруг вывода; если вы это делаете, используйте
putStr
вместоprint
48 символов)Программа на Haskell,
5150 персонажейисточник
Python 3 - 64
Если допускается вкладывание:
Python 2 - 54
источник
o[-1]
вместоo.pop()
o=[]
, которая делаетсяo=['{}']
после одного шага, и удлинение ввода на единицу путем замены его на'_'+input()
, сокращая пространство послеin
.Javascript 70 (символы)
Это было мое усилие, прежде чем задавать вопрос. Я предположил бы, что кто-то с большим знанием Javascript, чем я, вероятно, сможет победить его.
Спасибо Ян Дворак и Питер Тейлор за дальнейшие сокращения
сейчас 62
а сейчас 61
Объяснение оригинального кода
установить s, чтобы быть пустым
введите строку в c и разбить на массив
в то время как можно использовать pop () для символа c и сбросить s = s {s} в качестве преемника
выходной ток с, но нужно окружить с помощью установленных скобок.
источник
while
(сохраняет один символ).s='{'
и отбросьте два'{'+
. (Это ведет себя как мое решение GS). Существует еще одно сохранение в 1 символ с использованиемfor
вместоwhile
одной из двух инициализаций инициализации цикла for и ее вытягиванием.for(a;b;c){d}
прямо эквивалентноa;while(b){d;c}
большинству языков, которые имеют оба. Таким образом, хотя значениеfor(;b;)
идентичноwhile(b)
значению и количеству символов, оноfor(a;b;)
сохраняет один символa;while(b)
и фактически одинаково.J -
2220 символовКак это можно получить:
В качестве альтернативы, это может быть написано
'{','{'&(,,~)&'}'@#
, что означает то же самое.Использование:
источник
Хаскель - 35 символов
Решение под влиянием решения Яна Дворака, но без изменения порядка.
источник
Скала, 64 символа
Обратите внимание на двойные роли, которые и скобки и
s
играют в этом коде.РЕДАКТИРОВАТЬ: убрал цифру
источник
Питон 3 (44)
На каждом шаге
s
- строка, представляющая набор с}
удаленным финалом . Мы создаем набор, представляющийn+1
набор, представляющийn
через отношение f (n + 1) = f (n) ∪ {f (n)}. Чтобы реализовать объединение со строками, мы добавляем строку для {f (n)}, что в точности совпадаетs
с}
возвращенным финалом , и пренебрегаем включением финала}
в результат. Наконец, мы добавляем финал'}'
перед печатью.Если я могу жестко закодировать строку, количество символов сокращается до 35 символов, переключаясь на Python 2, чтобы сохранить парантезы в
print
.Может быть способ сэкономить место после
print
, выполнив что-то вродеprint'{'+s
обратногоs
, но это портит+=
добавление справа.источник
gs2, 12 байт
мнемоника:
источник
Mathematica, 115 знаков
Полный код, как показано, имеет 121 символ, но 6 из них используются для входной строки (
"test"
), которая, согласно правилам, не считается.Без требования об отсутствии разделителей длина кода может быть дополнительно уменьшена на 24 символа; без явного преобразования в строку можно удалить еще 9 символов.
источник
Руби, 27 лет, вид измены
Сомнительные вещи:
[[], [[]], [[], [[]]], [[], [[]], [[], [[]]]]]
источник
inspect
вручную массив иtr
результат.Чистый Баш, 54
Выход:
источник
Юлия 43
Конструкция {z ...} расширяет строку z в массив. Fold циклически перебирает все элементы массива, игнорируя его содержимое и собирая его из пустой строки. Функция сложения доступна в Julia 0.30.
Пример вывода
источник
Haskell, 31 байт
источник
Mathematica,
455748 байтов36-байтовое решение:
Тем не менее, он использует некоторые арифметические расчеты.
источник
Delphi XE3 (264)
Хорошо, я даже не подхожу близко к другому, но это было весело делать :)
Наверное, обдумывать это. Посмотрим, есть ли лучший способ сделать это.
Golfed
Ungolfed
Результаты тестирования
Протестированные строки длиной 0..10
источник
Perl 5: 33 персонажа
Не совсем понятно, какие символы я должен считать частью решения. Вероятно, не таecho ... |
часть, потому что она просто используется для подачи строки в stdin. Вероятно, не имя бинарного файла perl, потому что вы можете переименовать его как хотите.Итак, я посчитал, что переключатели командной строки переданы в perl, кавычки обернуты вокруг кода Perl и самого кода Perl.Также связанные .
источник
pl
стандартным, но вы получите-e
и кавычки вокруг кода бесплатно. СсылкаPerl 6: 37 символов
или из STDIN:
{"\{@_.join()\}"}...*
делает ленивый список установленных форм натуральных чисел, и мы просто берем тот, который нам нуженget.chars
.Ленивый список может быть написан более читабельно:
Который читается довольно похоже на определение.
источник
Дротик: 85 символов
(с дополнительной новой строкой для удобства чтения).
Требование не использовать «0» действительно кусает, иначе
.first
было бы[0]
и(..).isNegative
будет..<0
.источник
Pyth, 13 байт
Это гольф-эквивалент Pyth ответа @ xnor's Python. Обратите внимание, что Pyth новее, чем этот вопрос, поэтому этот ответ не имеет права выиграть этот вызов.
Демонстрация.
источник
u+G]GlQY
Javascript,
171149147142 байта(Скорее всего будет дальше в гольфе)
источник