Давайте определим функцию «развернутого размера» u
вложенного списка l
(содержащего только списки) по следующим правилам:
- Если
l
пусто, тоu(l)
1. - Если
l
не пусто,u(l)
равно сумме развернутых размеров каждого элемента вl
плюс один.
Ваша задача - написать программу (или функцию), которая принимает список в качестве входных данных и выводит (или возвращает) развернутый размер списка.
Тестовые случаи:
[] -> 1
[[[]],[]] -> 4
[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]] -> 19
[[[[]]]] -> 4
Это код-гольф , поэтому выигрывает самая короткая (в байтах) программа.
code-golf
string
array-manipulation
counting
Esolanging Fruit
источник
источник
()
вместо[]
?[[[]][]]
вместо этого[[[]],[]]
во втором примере?["This is some text [with square brackets in] ...[& maybe more than one pair]"]
?]
действительно кажется самым коротким решением во многих языках, есть также много ответов, которые фактически решают эту проблему посредством манипулирования списком, и, по крайней мере, в esolangs подсчет вхождений фиксированного символа также весьма отличается от подсчета вхождения входного символа.Ответы:
Сетчатка , 1 байт
Попробуйте онлайн! (Первая строка включает набор тестов, разделенных переводом строки.)
По умолчанию Retina подсчитывает количество совпадений данного регулярного выражения во входных данных. Развернутый размер просто равен количеству
[]
пар на входе и, следовательно, количеству]
.источник
Mathematica, 9 байт
Оказывается, есть встроенный для этого ...
Обратите внимание, что это не сработает, если списки на самом деле содержат не-списочные элементы. Что на
LeafCount
самом деле делает, так это подсчитывает количество атомных подвыражений. Для ввода{{}, {{}}}
выражение фактически читает:Здесь атомные подвыражения на самом деле являются главами
List
.источник
Brainfuck,
716159 байтПринимает входные данные из STDIN в формате, указанном в вопросе, и выводит символ, код ASCII которого является «развернутым размером» списка.
Я все еще начинающий любитель в Brainfuck, так что, скорее всего, еще можно сделать много оптимизаций.
Попробуйте онлайн!
Ungolfed:
источник
JavaScript (ES6),
2927 байтЯ люблю это, когда рекурсия получается так чисто. Это в основном поиск ввода в глубину, добавление 1 при достижении конца массива.
Если пустой массив был ложным в JS, это может быть 24 байта:
Но, увы, это не так. Другие попытки:
источник
f=a=>a[0]?f(a.pop())+f(a):1
работать? (Число байтов одинаковое.)f=a=>a.reduce((n,a)=>n+f(a),1)
. Сейчасf=(n,a)=>n+a.reduce(f,1)
всего 24 байта, но, к сожалению, параметры в неправильном порядке.)f=a=>a.map(a=>n+=f(a),n=1)&&n
Perl,
987 + 1 = 8 байтТребуется
-p
флагСпасибо @Dada за двухбайтовое сохранение (кстати, мне нравится эта точка с запятой)
источник
-p
сохранить 1 байт;)y;[;
чтобы сохранить еще один байтCJam ,
75 байтовСпасибо Питеру Тейлору за удаление 2 байтов! (
e=
вместоf=:+
)Попробуйте онлайн!
источник
05AB1E , 4 байта
Попробуйте онлайн!
Я думаю, что это может быть больше, но «I» является обязательным, в противном случае ввод считается фактическим массивом, а не строкой
источник
"[[[]],[[[[]],[]]],[[[]],[[[[]],[[],[[]]]]]]]"
во входных данных удаляет этоI
требование, хотя я не знаю, разрешено ли это.Лабиринт , 8 байт
Попробуйте онлайн!
объяснение
Это считает открывающие скобки с помощью немного побитовой магии. Если мы рассмотрим результаты кодов символов побитового И
[
,,
и]
с2
, мы получим:Таким образом, если мы просто суммируем результат этой операции для каждого символа, мы получим вдвое большее значение, которое нам нужно.
Что касается самого кода, блок 2x2 в начале представляет собой небольшой цикл. На первой итерации
&-
ничего не делаем, за исключением того, что они ставят явный ноль поверх неявных в нижней части стека. Это будет промежуточный итог (и он будет отрицательным при сохранении байта позже). Тогда цикл идет следующим образом:Как только мы покидаем цикл, выполняется следующий линейный бит:
IP тогда поражает мертвецов и оборачивается. Когда он пытается выполнить
/
снова, программа завершается из-за попытки деления на ноль.источник
Python
32,3623 байтаЯ заметил, что
u(l)
это равно числу[
в строковом представленииl
, поэтому эта программа пытается это сделать. Вероятно, это может быть дальше, найдя другой способ сделать это, хотя ...источник
lambda x:`x`.count("[")
Python, 26 байт
Простая рекурсивная формула.
источник
C #,
4641 байтl строка вложенного списка. Проверьте это здесь .
источник
return
с помощью функции выражения тела. Такжеchar
косвенно ставит наint
так что вы можете использовать91
вместо'['
:int u(string l)=>l.Count(c=>c==91);
Кроме того, вы можете отказаться от функции подписи и использовать метод лямбды:l=>l.Count(c=>c==91);
.Желе , 4 байта
Не использует манипуляции со строками. Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
Рубин, 13 (+1) байт
Вызывается с
-n
аргументом:РЕДАКТИРОВАТЬ: Изменено на самом деле распечатать ответ
источник
->s{s.count ?[}
будет правильным представлением.Регулярное выражение, 1 байт
Попробуйте онлайн!
источник
Brain-Flak ,
63, 61 байтПопробуйте онлайн! 58 байт кода и +3 для
-a
флага, разрешающего ввод ASCII.Читаемая версия / объяснение:
источник
Befunge ,
221816 байтTryItOnline!
Изменить: Спасибо Мартину Эндеру за то, что он сбрил 4 байта!
Edit2: Благодарим Дэвида Холдернесса за оптимизацию еще двух
источник
///, 13 байт
Выход в одинарный.
Попробуйте онлайн!
Объяснение:
источник
///
?PHP, 35 байт
preg_match_all
находит все совпадающие экземпляры регулярного выражения и возвращает число, поэтому нужны короткие теги эха.Как и большинство ответов, он считает количество
[
на входе и выводит это числоисточник
]
вместо[
, вам не придется избегать его.count_chars()[91];
делает то же самое, но короче.Ракетка 82 байта
Ungolfed:
Тестирование:
Выход:
источник
V , 10 байт
Попробуйте онлайн!
Это содержит некоторые непечатаемые символы, вот читаемая версия:
<C-a>
представляет "ctrl-a" (ASCII0x01
) и<esc>
представляет управляющий ключ (ASCII0x1b
).Более веселая, менее гольфовая версия:
Попробуйте онлайн!
источник
Скала, 15 байт
Ungolfed:
count
подсчитывает , сколько элементов удовлетворяют предикат, в этом случае92<
, что метод<
из92
.источник
O , 15 байт
Попробуй это здесь!
Во входных данных любые запятые должны быть удалены или заменены пробелами.
объяснение
Если нам разрешено работать над строкой: 10 байтов
источник
> <> ,
212018 байтИзменить: 1 балл за goto заявления!
Редактировать 2: Видимо> <> отличается от Befunge тем, что допускает ненулевое смещение IP после переноса (другими словами, используя инструкцию батута, я могу переносить в (1, 0) вместо (0, 0)). Интересный.
TryItOnline!
источник
Brainfuck, 28 байт
Попробуйте онлайн.
Это подсчитывает количество входных символов, делимых на 3, то есть количество
]
символов.Альтернативное 34-байтовое решение, которое подсчитывает
[
символы напрямую и полагается на 8-битные ячейки:источник
С,
4846 BytesСохранено два байта благодаря kirbyfan64sos
Тестовый код
Контрольные примеры
источник
*v++^91?0:i++
чтобыi+=*v==91
сохранить 3 байта.i+=*v++==91
чтобы сохранить два байта.тинилисп репл , 39 байт
Определяет функцию,
u
которая может быть вызвана как(u (q ((())()) ))
(для второго контрольного примера). Выполнение этого в repl экономит 4 байта из-за автоматически закрытых скобок.объяснение
x-(0-y)
Конструкция является необходимой , поскольку tinylisp не имеет встроенные функции сложения, только вычитания.источник
Befunge-98 ,
1211109 байтTryItOnline!
Редактировать: Спасибо Мартину Эндеру за побриться
источник
Haskell,
20 1917 байтПопробуйте онлайн!
Принимает список как строку и помещает
1
в список для каждого]
, а затем суммирует все1
s.Pointfree версия: (19 байт)
Предполагается
, [ ]
, что единственные символы в строке. Фильтрует список, чтобы получить все символы больше чем[
, которые все,]
и возвращает длину.Использование:
источник
Bash + coreutils, 29 байт
источник
tr -d -c [|wc -c
, что по умолчанию будет читать список из стандартного ввода.DASH , 14 байтов
Просто считает
]
. Использование:Бонусное решение, 15 байт
Этот рекурсивно считается от реального списка. Использование:
источник