Простое испытание для вашего вечера понедельника (ну, или утро вторника в другой половине мира ...)
В качестве входных данных вы получаете вложенный, потенциально рваный массив натуральных чисел:
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]
Ваша задача - определить его глубину, которая является наибольшей глубиной вложенности любого целого числа в списке. В этом случае глубина 11
IS 6
, которая является самой крупной.
Вы можете предположить, что ни один из массивов не будет пустым.
Вы можете написать программу или функцию, принимая ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции и выводя результат через STDOUT (или ближайшую альтернативу), возвращаемое значение функции или параметр функции (out).
Ввод может быть сделан в любом удобном формате списка или строки, который поддерживает непрямоугольные массивы (с вложенными массивами различной глубины), если фактическая информация не была предварительно обработана.
Вы не должны использовать какие-либо встроенные модули, связанные с формой массивов (включая встроенные модули, которые решают эту задачу и получают размеры вложенного массива). Единственное исключение - получение длины массива.
Применяются стандартные правила игры в гольф .
Тестовые случаи
[1] -> 1
[1, 2, 3] -> 1
[[1, 2, 3]] -> 2
[3, [3, [3], 3], 3] -> 3
[[[[1], 2], [3, [4]]]] -> 4
[1, [[3]], [5, 6], [[[[8]]]], 1] -> 5
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14] -> 6
[[[[[[[3]]]]]]] -> 7
источник
≡
встроенный примитив APL именно для этого .\
на входах? РЕДАКТИРОВАТЬ: фигу просто попробовал это так. Это даже не работает. Черт возьми, я не могу использовать CMD args?Ответы:
К, 4 байта
В K
,/
будут объединены все элементы списка. Общая идиома,//
повторяется до фиксированной точки, полностью сглаживая произвольно вложенный список.,/\
выполняет итерацию до фиксированной точки аналогичным образом, но собирает список промежуточных результатов. Подсчитав, сколько промежуточных результатов мы видим до достижения фиксированной точки (#
), мы получаем желаемый ответ: максимальная глубина вложения.Msgstr "Количество соединений по сканированию с фиксированной точкой".
В бою:
источник
Сетчатка , 10
Здесь формат ввода немного надуманный -
_
символы используются для разделителей списков, поэтому вход будет выглядеть так{1_{{2_3_{{4}_5}_6_{7_8}}_9_{10_{{{11}}}}_12_13}_14}
}{
и все остальные\w
персонажи. Это приводит к тому, что а) все списки на всех уровнях состоят только из одного элемента и б) удаляются все неструктурные символы списка.{
. Это дает самый глубокий уровень вложенности.Попробуйте онлайн.
Если это слишком много, то предыдущий ответ был:
Сетчатка , 13
Предполагается, что списки содержатся в фигурных скобках
{}
.Попробуйте онлайн .
источник
_
вместо,,
но это может быть немного растянуто._
разделители могут быть слишком надуманными. Поэтому я оставляю обе версии в ответеPython 2, 33 байта
Рекурсивно определяет глубину, говоря, что глубина числа равна 0, а глубина списка на единицу больше максимальной глубины его элементов. Число против списка проверяется путем сравнения с пустым словарем
{}
, который выпадает выше цифр, но ниже списков в произвольном порядке Python 2 встроенных типов.источник
Pyth -
11107 байт1 байт сохранен благодаря @Dennis
4 байта сохранены благодаря @Thomas Kwa
Попробуйте это онлайн здесь .
Продолжает суммировать массив до тех пор, пока он не перестанет изменяться, что означает его просто число, делает это кумулятивно, чтобы сохранить все промежуточные результаты и получает длину, создавая urange такой же длины, что и список, и беря последний элемент.
источник
m!!d
может стать&R1
.l
не разрешено в OP.Haskell, 43 байта
Пример использования:
maximum.scanr(#)0 $ "[1, [[3]], [5, 6], [[[[8]]]], 1]"
->5
.У Haskell нет смешанных списков (
Integer
смешанных сList of Integer
), поэтому я не могу использовать некоторые функции обнаружения списков, и мне нужно проанализировать строку.Я начинаю справа с
0
и добавляю 1 для каждого]
, вычитаю 1 для каждого[
и сохраняю значение в противном случае.scanr
сохраняет все промежуточные результаты, так чтоmaximum
можете делать это.источник
JavaScript (ES6), 35 байт
объяснение
Рекурсивная функция, которая возвращает максимальную глубину массива или
0
если передано число.источник
MATL , 11
14 15байтФигурные скобки используются в MATL для этого типа массивов. В любом случае, входные данные берутся и обрабатываются как строка, поэтому одинаково можно использовать квадратные скобки, изменяя два символа в коде.
Попробуйте онлайн!
источник
Октава, 29 байт
Сопоставляет
[
с 1 и]
с -1, затем берет максимум совокупной суммы.Ввод - это строка вида
Пробный прогон на идеоне .
источник
{
,}
? Я думаю, что октава, эквивалентная массивам в ОП, - это клеточные массивыЮлия,
5526 байтовЭто рекурсивная функция, которая принимает одномерный массив с содержимым типа
Any
и возвращает целое число. При передаче массива функции, префикс всех скобок сAny
, то естьf(Any[1,Any[2,3]])
.Подход довольно прост. Для входа a мы умножаем a на 0 и проверяем, является ли результат скаляром 0. Если нет, мы знаем, что a является массивом, поэтому мы применяем функцию к каждому элементу a , берем максимум и добавляем 1.
Благодаря Денису сэкономлено 29 байт!
источник
Рубин, 53 байта
Ввод из STDIN, вывод в STDOUT.
источник
Желе,
107 байтПопробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
Обновить
При написании этого ответа я заметил, что Jelly ведет себя довольно странно для рваных списков, потому что я вычислял глубину списка как увеличенный минимум глубин его элементов.
Это было исправлено в последней версии, поэтому следующий код ( 6 байт ) будет работать сейчас.
Это суммирует строки массива, а не объединяет их.
источник
ŒḊ
новее, чем вызов?Mathematica, 18 байт
источник
Mathematica,
2720 байтовПростая рекурсивная функция.
источник
If
, экономя 7 байтов. (Дайте мне знать, если хотите подсказку.)Replace
на решении решение по крайней мере так же долго, как и это ...Map
пинг над целым числом является не-оп:Max[#0/@#]+1&[0#]-1&
.-1
Также может зайти внутрь внутреннего вызова , как...&[0#-1]&
.PHP, 61 байт
рекурсивная функция, которая использует себя как функцию отображения для замены каждого элемента его глубиной.
источник
PHP,
8472646360 байтПримечание: требуется PHP 7 для оператора комбинированного сравнения. Также использует кодировку IBM-850
Запустите так:
[
и]
$i
к int. Смещения строк приводятся к int неявным образомисточник
C
9869 байт29 байтов, спасибо @DigitalTrauma !!
Принимает строку в качестве входных данных и возвращает результат как целое число.
Живой пример в: http://ideone.com/IC23Bc
источник
Python 3,
4239 байт-3 байта благодаря Sp3000
По сути это порт решения xnor Python 2 :
К сожалению,
[] > {}
возвращаетunorderable types
ошибку, так что конкретный хитрый прием xnor's не может быть использован. На его месте,-0123456789
ниже в ASCII значение, чемA
, что ниже[]
, следовательно, сравнение строк работает.источник
CJam (15 байт)
Онлайн демо
рассечение
Для той же длины, но скорее на уродливой территории,
источник
s/ugly/beautiful/
'[,-
для обрезки строки[]
, которая опирается на ограниченное содержимое. Подход, который выравнивает, работает независимо от содержимого массива.Сед, 40 знаков
(39 символов кода + 1 символ опции командной строки.)
Вход: строка, выход: унарный номер.
Образец прогона:
Сед, 33 персонажа
(32 символа кода + 1 символ опции командной строки.)
Если в выводе допускаются конечные пробелы.
Вход: строка, выход: унарный номер.
Образец прогона:
источник
Гексагония , 61 байт
Редактировать : Спасибо @Martin Ender ♦ за спасение меня 1 байт от чудесного трюка -1!
Попробуйте онлайн, чтобы проверить контрольные примеры!
Изображения ниже не изменены, но поток в основном такой же. Также обратите внимание, что это будет возвращаться,
-1
если входные данные не являются массивом (т.е. без[]
).У меня в "Шестиграннике" много бездействующих ... Я думаю, что это определенно может быть больше в гольфе.
объяснение
Вкратце, он добавляет,
-1
когда встречает a,[
и добавляет,1
когда встречает a]
. Наконец он печатает максимум, что получил.Давайте пробежимся по тестовому примеру 5, чтобы увидеть его поведение при выполнении по строке
[1, [[3]], [5, 6], [[[[8]]]], 1]
:Он начинается в начале и принимает свой вклад в углу W:
Поскольку все еще есть ввод (не нулевой символ
\0
или EOL), он переносится наверх и запускает малиновый путь.Вот что происходит, когда оттуда до симпатичного
><
:,
считывает[
в Buffer{
иZ
устанавливает константу Z равной 90.'
переходит в Diff и-
вычисляет разницу. Ибо[
и]
разница будет1
и3
соответственно. Для чисел, пробелов и запятых это будет отрицательным.Затем мы запускаем
(
дважды (один раз в конце алого пути, один в начале после переноса на зеленый путь), чтобы получить-1
и1
соответственно для[
и]
. Здесь мы меняем наименованиеDiff
наValue
. Добавьте это значение в глубину. (Я использовал,Z&
чтобы убедиться, что он копирует правильного соседа). Затем мы вычисляемlastMin - Depth
и получаем число на границе памятиminLR
.Затем мы применяем
&
(в конце зеленого пути) кminLR
: Если число <= 0, оно копирует левое значение (т.е.lastMin - Depth <= 0 => lastMin <= Depth
), в противном случае оно принимает правильное значение.Мы свернем на горизонтальную синюю дорожку и
Z&
снова увидим, кто копируетminLR
. Тогда мы"&
и сделали копию рассчитанного мин. Скобки предполагаются сбалансированными, поэтому min должно быть <= 0. После обертывания синий путь идет влево и нажимает(
, делая копию1
меньше реальной мин. Повторно используя-
, мы создали еще одну однократную копию в качестве соседа Buffer:Примечание:
copy
переименовано в1-off
Когда синяя дорожка попадает
\
и получает хороший"
и<
ловит его обратно в основной цикл.Когда хиты цикла
1
,,
илиили другие номера в качестве входных данных:
Разница станет отрицательной, и она будет отражена обратно в основной цикл для следующего ввода.
Когда все проходит через основной цикл, мы достигаем EOL, который создает Buffer,
-1
и он, наконец, переходит к нижнему краю:'
перемещает MP к1-off copy
и)
увеличивает его, и с~
отрицанием он получил правильное значение максимальной глубины, которое печатается с!
И история заканчивается
@
.Наверное, я немного усложнил ситуацию. Если бы мне пришлось только «двигаться назад» и «печатать» без приращения и отрицания, я бы хорошо сохранил 2 байта без использования полного шестиугольника.
Большое спасибо Тимви за Эзотерическую IDE и Hexagony Colorer !
источник
-1
from,
, изменив последний ряд на:@!-".
(хотя я согласен, что, возможно, можно значительно больше сбрить или даже вписать это в длину стороны 4 с некоторой реструктуризацией).Z
от использованияZ&
. И должны быть лучшие способы запуска программы с неявным if.брейкфук, 48 байт
отформатирован:
Принимает форматированный ввод
(1, ((3)), (5, 6), ((((8)))), 1)
и выводит байтовое значение .Попробуйте онлайн.
Это сохраняет глубину по месту в памяти, перемещая указатель вправо
(
и влево)
и игнорируя другие символы. Посещенные ячейки помечены1
флажком, поэтому в конце основного циклаdepth + 1
справа от текущей ячейки будут флажки. Затем они добавляются для печати окончательного результата.Предыдущее 69-байтовое решение с использованием другого подхода:
В этой версии глубина и максимальная глубина хранятся явно в ячейках.
источник
Pyth,
1513 байт-2 байта @Maltysen
Подсчитывает разницу между совокупным количеством
[
и]
и принимает максимум.Y
это пустой массив, и его строковое представление (`
) удобно[]
.Попробуй это здесь .
источник
CJam, 19
22 23байтаИдея, аналогичная моему ответу в MATL.
Спасибо Питеру Тейлору за удаление 3 байтов
Попробуй здесь
источник
Perl 5, 34 байта
32 плюс два для
-p
Похищенные из Digital Trauma «s Retina ответ ... что на 26% меньше , чем это.
:-)
Или, в равной степени:
источник
]
не нужно убегать, кроме как в скобках.s&...&...&g
оператор замещения. См. Perldoc.perl.org/perlop.htmlРубин, 51 персонаж
(Начинала как рационализаторское предложение для дверной ручки «s Рубите ответ , но в итоге по- разному. Так что я отправил его в качестве отдельного ответа. Upvotes за идею глубины счета (
?\\<=>$&
, спускающееся с'] ['.index(c)
) следует перейти к первоначальному ответу.)Вход: строка, выход: число.
Образец прогона:
источник
Perl 6, 53 байта
Закрытие:
Нужен аргумент, например:
Объяснение:
источник
Минколанг 0,15 ,
312924 байтаПересмотрел мой алгоритм по вдохновению от ответа CJam Луиса Мендо и сэкономил 5 байт!
Попробуй это здесь!
объяснение
По сути, этот код сохраняет промежуточную сумму с +1 для каждого
[
и -1 для каждого]
, отслеживая достигнутое максимальное значение, выводя этот максимум в конце. Циклы обрабатываются тороидальной природой кодового поля Минколанга.источник
Рубин, 41 персонаж
Параметр: массив, возвращаемый: номер.
Образец прогона:
источник
Oracle SQL 11.2, 133 байта
Un-golfed
CONNECT BY создает одну строку на символ во входной строке.
SUBSTR выделяет символ, соответствующий номеру строки.
DECODE переводит каждый '[' в 1, каждый ']' в -1, а каждый другой символ в 0.
Аналитическая SUM суммирует каждые 1, -1 и 0 из предыдущих строк, включая текущую строку;
МАКС. Суммы - это глубина.
источник
Ява 8, 95
Это лямбда-выражение для
ToIntFunction<String>
. Ввод принимается какString
в формате примеров ОП.довольно простой. Разбейте строку, используя
[
в качестве разделителя. Для каждого из них увеличьте счетчикe
и сравните его со счетчикомd
, сохраняя большее из нихd
. Затем разделите строку текущей итерации, используя]
на этот раз в качестве разделителя, и вычтите количество дополнительных разбиений изe
.источник