Вдохновленный найти «развернутый размер» списка .
Определите Рекурсивный размер RS
списка, не содержащего списков, в качестве его длины (количество содержащихся элементов) и Рекурсивный размер списка, содержащего любые списки, в виде суммы его длины и Рекурсивного размера этих списков.
Вызов
Напишите программу или функцию, которая выводит Рекурсивный Размер любого заданного списка в минимально возможном количестве байтов.
Входные данные являются списком и могут содержать числа, строки (если они есть на вашем языке) и аналогичные списки.
Например:
RS([]) = 0
RS([[]]) = 1
RS([4, 5, 6]) = 3
RS(["four", "five", "six"]) = 3
RS(["[[[[]]]]", "[][][][][]", "][][[[]]][]["]) = 3
RS([[4, 5, 6]]) = 4
RS([["four", "five", "six"]]) = 4
RS([["[[[[]]]]", "[][][][][]", "][][[[]]][]["]]) = 4
RS([[4], [5], [6]]) = 6
RS([["four"], ["five"], ["six"]]) = 6
RS([["[[[[]]]]"], ["[][][][][]"], ["][][[[]]][]["]]) = 6
RS([[[[[[[[[]]]]]]]]]) = 8
RS([[],[],[],[],[],[],[],[]]) = 8
RS([[],[],[[]],[[[[]]]]]) = 8
RS([0,[-1],[2.3,-4.3],[5,[6]],[7,[8,9,[10,11,[12,13,14]]]]]) = 22
Обратите внимание, что если в вашем языке нет строк, но есть списки символов, приведенные "strings"
выше примеры могут фактически быть списками символов и иметь большие результаты. В качестве примера:
RS([['f','o','u','r'], ['f','i','v','e'], ['s','i','x']]) = 14
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах; без смешных дел, как всегда.
Не входящий в список ввод может привести к любому выводу.
Ввод / вывод такой же гибкий, как обычно .
источник
Ответы:
Желе , 8 байт
Попробуйте онлайн!
Как это устроено
источник
Python, 42 байта
Для не-списка выведите 0. Для списка выведите его длину плюс сумму рекурсивных выходов для его элементов.
Списки располагаются над числами и под строками в порядке Python 2, требуя
[]<=x<''
. Вместо этого мы проверяемx*0==[]
, тогда как результат0
для числа или''
для строки.источник
JavaScript (ES6),
3937 байтСохранено 2 байта благодаря @ edc65
источник
f=a=>a.map?a.reduce((s,x)=>s+f(x),0):0
1
туда где-нибудь.f=a=>a.map&&a.map(x=>a-=~f(x),a=0)&&a
.-=~
на 1 символ меньше,+=1+
и, преобразуя логическое значение в целое число, вырезает еще один символ. Повторное использование,a
чтобы избежать глобальной переменнойt
Mathematica, 20 байтов
Анонимная функция. Принимает выражение в качестве ввода и возвращает число в качестве вывода. Символ Unicode имеет значение U + 221E INFINITY для
\[Infinity]
.Level[#,∞]
дает список подвыражений ввода иLength@
считает их.источник
Mathematica, 14 байтов
Незначительная модификация моего предыдущего ответа . Как я объяснил там, он
LeafCount
уже заботится о вложенных атомарных значениях, но он также учитывает самый внешний список, который нам нужно вычесть из результата.источник
Perl, 34 байта
Рекурсивная функция! Да, в Perl есть не только регулярные выражения, но и функции!
Если вы хотите проверить это, вы можете запустить что-то вроде:
источник
Mathematica, 32 байта
Безымянная рекурсивная функция. Отрывок
#0/@#~Select~ListQ
снова вызывает функцию для каждого элемента ввода, являющегося списком, иTr
суммирует эти значения. К счастью, Mathematica хорошо берет длину пустого списка и ищет подходящие элементы из пустого списка, поэтому базовый случай не требуется.источник
Haskell, 52 байта
Пример использования:
Haskell не поддерживает смешанные списки (например, Int и список Int), поэтому я использую пользовательский тип списка,
L
который является элементом некоторого типа a (->E a
) или списком других Ls (->N[L a]
). Вычисление RS представляет собой простую рекурсию, в которойE
счетчик1
иN
единица плюс сумма рекурсивных размеров его элементов. Вся сумма на 1, поэтому я вычитаю ее черезpred
.Примечание: точные типы и значения элементов не важны для алгоритма, поэтому мы можем удалить полиморфизм, заключив сделку только с абстрактными элементами, и продолжить
data L=E|N[L]
.источник
Фактор, 105 байт
Рекурсивная функция g.
Ungolfed (вроде):
Вы обнаружите, что здесь нет вызовов,
length
потому что вместо встроенной длины он реализованdrop 1
для строк и непоследовательностей.источник
Mathematica, 18 байт
Еще один подход Mathematica. Не так коротко, как при использовании встроенного,
LeafCount
но все же довольно лаконично. Это используетMapAll
оператор,//@
который вызывает функцию на каждом узле выражения, и мы используем эту функцию для увеличения счетчикаc
. Как и вLeafCount
случае, это дает на один больше, чем нам нужно, потому что он также считает внешний список, поэтому мы начинаем счетчик с-1
.источник
C # (интерактивный компилятор Visual C #) , 50 байтов
Попробуйте онлайн!
Использует ту же технику, что и ранее представленный ответ Java , но использует LINQ для уменьшения длины ответа.
Объяснение:
источник
05AB1E (наследие),
2217 байтПопробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Эта проблема ставит множество проблем, которые необходимо преодолеть в 05AB1E:
λ
), она полезна только для целочисленных последовательностей. Вот мой ответ в качестве примера рекурсивной функции 05AB1E. Из-за этого мне пришлось найти альтернативу для выполнения рекурсивных вызовов, что я сделал, поместив часть кода в строку, и рекурсивно выполнил эту строку как код 05AB1E.isList
05AB1E также нет команды, поэтому мне пришлось использовать некоторые обходные пути, чтобы проверить это, используя перенос в список, глубокое выравнивание и проверку на равенство.˜
- это функция глубокого сглаживания, которая удаляет все слои и делает многомерный список одним списком со всеми самыми внутренними значениями. (то есть[[1,2],[[[3]],4]]
становится[1,2,3,4]
).Я закончил с кодом наверху, чтобы преодолеть все три вышеупомянутых проблемы. Он разделен на три основные части. Сначала мы имеем следующее:
Строка содержит следующий код:
Карта используется вместо цикла foreach, потому что карта имеет неявный
y
, а цикл foreach требует явногоy
. Мы заботимся только оcounter_variable
.И, наконец, после того, как все карты и внутренние карты будут готовы, мы:
источник
R 65 байт
Попробуйте онлайн!
Очевидная рекурсивная реализация спец.
источник
C
174167152 байтаРекурсивная функция с
f
утечкой памяти ( 152 ):Рекурсив,
f
который не пропускает, используя ссылки, на 167 :Ungolfed:
«Но как, - спросите вы, - можно ли ответить на это в C? Конечно, в C нет управляемых массивов, и вы не можете иметь гетерогенные массивы…?»
«Ага, - отвечаю я, - потому что я работал над простой системой« объектов »для (GNU-ish) C11 и ISO C ++ 11».
Полная демонстрационная программа для этой функции:
Прямо сейчас, он живет здесь, и вам понадобится репо, чтобы использовать это.
Вам также понадобится хеш-библиотека Fowler-Noll-Vo,
libfnv
скомпилированная для вашей платформы. Он находится в этом хранилище, и вы также можете получить его здесь .Тогда вы можете сделать
cc -DNODEBUG size.c path/to/libfnv.a -o size
.Реализация не обязательно эффективна:
Но это работает! Последний коммит на мастере (на котором скомпилирована эта программа) был 2 дня назад, что означает, что это утверждение действительно.
источник
Аксиома 118 байт
ungolfed
Результаты
источник
APL (NARS), 24 символа, 48 байтов
Это было бы буквальным переводом ответа «моя» Аксиома здесь ... В APL список недействительности будет «Zilde», который вы укажете с помощью ´ [] ´, ´ is´ is ´ [[]] ´, ´ 1 2 3´ is ´ [1,2,3] ´ ecc Некоторые тесты:
для печати результатов другого типа, предложенных в упражнении, нам нужна еще одна функция (обе функции RS и R должны быть в порядке для упражнения)
чтобы увидеть, как появляются некоторые входные данные, мы используем функцию o:
это печать Zilde и один список 8 Zilde:
источник
Java, 96 байт
Попробуйте онлайн.
Объяснение:
источник
Атташе , 21 байт
Попробуйте онлайн!
Оказывается, подход C # довольно короток в Attache.
альтернативы
25 байт
f[x]:=#x+Sum!f=>IsArray\x
26 байт
f[x]:=#x+Sum[f=>IsArray\x]
35 байт
f:=Sum##{If[IsArray@_,1+f@_,1]}=>Id
35 байт
f:=Sum@Map[{If[IsArray@_,1+f@_,1]}]
37 байт
f[x]:=Sum[{If[IsArray@_,1+f@_,1]}=>x]
источник
Clojure,
797751 байтВходные данные должны быть списком, а не вектором. Оба будут поддерживаться с помощью
sequential?
.Предыдущая:
источник
Python, 72 байта
источник
0
иif
,0
иelse
, и)
иfor
.