Визначте глибину масиву


31

Простий виклик для вашого понеділка ввечері (ну або вранці вівторок в іншій половині світу ...)

Ви вводите як вхідний вкладений, потенційно розроблений масив додатних цілих чисел:

[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]

Ваше завдання - визначити його глибину, яка є найбільшою глибиною введення будь-якого цілого числа у списку. У цьому випадку глибина 11є 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

2
Після обговорення в чаті я вирішив дозволити вбудовані довжини, оскільки деякі мови вимагають від них чистого перебору масиву.
Мартін Ендер

2
Просто для загальної освіти: чи вбудований примітив APL саме для цього .
Adám

@ MartinBüttner Я зіткнувся з крихітною проблемою. Я почав це робити в Java, недобросовісно під час тестування входів комами змушують його розділити входи на кілька аргументів командного рядка, а не один. Чи можу я використовувати \ вхідні символи на входах? EDIT: Nevermind просто спробував це так. Це навіть не працює. Дарн, я не можу використовувати аргументи CMD?
Ешвін Гупта

@AshwinGupta не можеш обернути аргумент командного рядка в лапки? Ви також можете прочитати вхід з STDIN або подати функцію, яка приймає фактичний об'єкт масиву як параметр.
Мартін Ендер

@ MartinBüttner о, я не знав, що цитати, я спробую це випробувати. В даний час просто використовується Scanner. (System.in). Я вважаю, що це форма STDIN?
Ешвін Гупта

Відповіді:


20

К, 4 байти

#,/\

У K ,/приєднаються всі елементи списку. Загальна ідіома ,//переходить до фіксованої точки, повністю вирівнюючи довільно вкладений список. ,/\буде повторюватись до фіксованої точки аналогічним чином, але збирає список проміжних результатів. Підраховуючи, скільки проміжних результатів ми відвідуємо, перш ніж досягти фіксованої точки ( #), ми отримуємо потрібну відповідь: максимальна глибина вкладання.

Msgstr "Підрахунок з'єднання при скануванні з фіксованою точкою".

Дія:

 (#,/\)'(,1
        1 2 3
        ,1 2 3
        (3;(3;,3;3);3)
        ,((,1;2);(3;,4)))
1 1 2 3 4

15

Сітківка , 10

  • Збережено 1 байт завдяки @ ӍѲꝆΛҐӍΛПҒЦꝆ
  • Збережено 14 зайвих байтів завдяки @ MartinBüttner
+ `\ w |} {

{

Тут формат введення трохи надуманий - _символи використовуються для розділювачів списку, тому введення виглядатиме так{1_{{2_3_{{4}_5}_6_{7_8}}_9_{10_{{{11}}}}_12_13}_14}

  • Етап 1 - неодноразово видаляйте }{та всі інші \wсимволи. Це призводить до того, що а) створення всіх списків на всіх рівнях складається лише з одного елемента та б) видалення всіх неструктурних символів.
  • 2 етап - підрахунок залишився {. Це дає найглибший рівень гніздування.

Спробуйте в Інтернеті.


Якщо це занадто багато розтяжок, то попередня відповідь була:

Сітківка , 13

Припускає, що списки містяться у фігурних дужках {}.

+ `[^} {] |} {

{

Спробуйте в Інтернеті .


1
Ваш код можна скоротити до 13 байт (11, якщо трохи розтягнути формат введення). Дайте мені знати, якщо ви хочете підказку. :) (Я не дуже хочу його публікувати, оскільки це практично те саме рішення.)
Мартін Ендер,

Це дві речі. а) Ви можете зберегти байт чи так, трохи змінивши формат введення. б) Ви можете зекономити багато байтів незалежно від цього ... чи можете ви знайти коротше (і набагато простіше) рішення, якщо намагаєтесь не обробляти кілька тестових випадків за один пробіг?
Мартін Ендер

Я навіть про це не думав. Ця кількість байтів збережена тоді. Моя зміна формату введення була б ще слабшою. Що стосується б) пригадайте, яким був перший та найпростіший режим роботи Retina?
Мартін Ендер

1
так. Моя а) мала на увазі видалення пробілів із вхідних даних. Потім ви можете зберегти ще два байти, використовуючи _замість цього, ,але це може бути трохи розтягнутим.
Мартін Ендер

@ MartinBüttner Приємна ідея! Погоджено - _роздільники можуть бути занадто надуманими. Тож я залишаю обидві версії у відповіді
Digital Trauma

12

Python 2, 33 байти

f=lambda l:l>{}and-~max(map(f,l))

Рекурсивно визначає глибину, кажучи, що глибина числа є 0, а глибина списку - на одну більшу, ніж максимальна глибина його елементів. Число проти списку перевіряється порівнянням із порожнім словником {}, який падає вище чисел, але нижче списків на довільному впорядкуванні вбудованих типів Python 2.


Вбудовані по довжині тепер дозволені, якщо це допомагає.
Мартін Ендер

6

Pyth - 11 10 7 байт

1 байт збережено завдяки @Dennis

4 байти збережено завдяки @Thomas Kwa

eU.usNQ

Спробуйте його онлайн тут .

Продовжує підсумовувати масив до тих пір, поки він не перестане змінюватися, що означає його просто число, робить це накопичувально, щоб зберегти всі проміжні результати та отримує довжину, зробивши помаранчевий такий самий довжина, як список та взявши останній елемент.


m!!dможе стати &R1.
Денніс

@Dennis круто, це розумно
Малтісен

@ThomasKwa lзаборонено в ОП.
Мальтісен

@ThomasKwa це дуже розумно, дякую!
Мальтісен

Вбудовані по довжині тепер дозволені, якщо це допомагає.
Мартін Ендер

6

Haskell, 43 байти

'['#x=x-1
']'#x=x+1
_#x=x
maximum.scanr(#)0

Приклад використання: maximum.scanr(#)0 $ "[1, [[3]], [5, 6], [[[[8]]]], 1]"-> 5.

У Haskell немає змішаних списків ( Integerзмішаних з List of Integer), тому я не можу використовувати деякі функції виявлення списку, і мені доведеться розбирати рядок.

Починаю праворуч з 0і додаю 1 для кожного ], віднімаємо 1 для кожного [і зберігаємо значення в іншому випадку. scanrзберігає всі проміжні результати, тому maximumможе це зробити.


5

JavaScript (ES6), 35 байт

f=a=>a[0]?Math.max(...a.map(f))+1:0

Пояснення

Рекурсивна функція, яка повертає максимальну глибину масиву або 0якщо передано число.

var solution =

f=a=>
  a[0]?                   // if a is an array
    Math.max(...a.map(f)) // return the maximum depth of each element in the array
    +1                    // add 1 to increase the depth
  :0                      // if a is a number, return 0

// Test cases
result.textContent =
`[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`
.split`\n`.map(t=>(c=t.split`->`.map(p=>p.trim()),c[0]+" == "+c[1]+": "+(solution(eval(c[0]))==c[1]?"Passed":"Failed"))).join`\n`
<input type="text" id="input" value="[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]" />
<button onclick="result.textContent=solution(eval(input.value))">Go</button>
<pre id="result"></pre>


Вбудовані по довжині тепер дозволені, якщо це допомагає.
Мартін Ендер

4

MATL , 11 14 15 байт

'}{'!=dYsX>

У MATL для цього типу масивів використовуються фігурні дужки. У будь-якому випадку вхід приймається та обробляється як рядок, тому квадратні дужки можна було б однаково використовувати, змінюючи два символи в коді.

Спробуйте в Інтернеті!

          % implicitly take input as a string (row array of chars)
'}{'!     % 2x1 (column) char array with the two curly brace symbols
=         % 2-row array. First / second row contains 1 where '}' / '{' is found
d         % second row minus first row
Ys        % cumulative sum of the array
X>        % maximum of the array
          % implicitly display result

Вбудовані по довжині тепер дозволені, якщо це допомагає.
Мартін Ендер

4

Октава, 29 байт

@(a)max(cumsum(92-(a(a>90))))

Мапи [до 1 і ]до -1, а потім приймає максимум сукупної суми.

Введення - це рядок форми

S6 = '[1, [[3]], [5, 6], [[[[8]]]], 1]';

Зразок запущений на ideone .


Якщо ви використовуєте {, }? Еквівалент Octave до масивів в ОП - це масиви клітин, я думаю
Луїс Мендо

@LuisMendo Ні, тому що це 2 зайвих байти :) Плюс, оскільки я ніколи фактично не створюю масив, просто проаналізуйте рядок введення, я не думаю, що це має значення. Але ви нагадали мені додати очікуваний внесок у свою відповідь.
стакан

Правда! Більш довгий код ASCII
Луїс Мендо

@LuisMendo Actually, 1 byte longer. That second comparison only needs to be greater than '9'. But you get the idea :D
beaker

4

Julia, 55 26 bytes

f(a)=0a!=0&&maximum(f,a)+1

This is a recursive function that accepts a one-dimensional array with contents of type Any and returns an integer. When passing an array to the function, prefix all brackets with Any, i.e. f(Any[1,Any[2,3]]).

The approach is pretty simple. For an input a, we multiply a by 0 and check whether the result is the scalar 0. If not, we know that a is an array, so we apply the function to each element of a, take the maximum and add 1.

Saved 29 bytes thanks to Dennis!


2
Dat golf. <filler>
El'endia Starman

3

Ruby, 53 bytes

i=0;p gets.chars.map{|c|i+=('] ['.index(c)||1)-1}.max

Input from STDIN, output to STDOUT.

i=0;                 initialize counter variable
p                    output to STDOUT...
gets                 get line of input
.chars               enumerator of each character in the input
.map{|c|             map each character to...
i+=                  increment i (and return the new value) by...
('] ['.index(c)||1)  returns 0 for ], 2 for [, 1 for anything else
-1                   now it's -1 for ], 1 for [, 0 for anything else
                     therefore: increment i on increase in nesting, decrement i
                       on decrease, do nothing otherwise
}.max                find the highest nesting level that we've seen

Length built-ins are now allowed if it helps.
Martin Ender

3

Jelly, 10 7 bytes

¬;/SпL

Try it online! or verify all test cases.

How it works

¬;/SпL  Main link. Input: A (list)

¬        Negate all integers in A. This replaces them with zeroes.
    п   Cumulative while loop.
   S       Condition: Compute the sum of all lists in A.
                      If the sum is an integer, it will be zero (hence falsy).
 ;/        Body:      Concatenate all lists in A.
      L  Count the number of iterations.

Update

While writing this answer, I noticed that Jelly behaves rather weirdly for ragged lists, because I calculated the depth of a list as the incremented minimum of depths of its items.

This has been addressed in the latest version, so the following code (6 bytes) would work now.

¬SSпL

This sums the rows of the array instead of concatenating them.


Presumably, ŒḊ is newer than the challenge?
caird coinheringaahing

You must not use any built-ins related to the shape of arrays (including built-ins that solve this challenge, that get you the dimensions of a nested array).
Dennis


3

Mathematica, 27 20 bytes

Max[#0/@#]+1&[0#]-1&

Simple recursive function.


It's possible to void the If, saving 7 bytes. (Let me know if you want a hint.)
Martin Ender

@MartinBüttner I give up... A Replace-based solution is at least as long as this one...
LegionMammal978

1
Mapping over an integer is a no-op: Max[#0/@#]+1&[0#]-1&. The -1 can also go inside the inner call like ...&[0#-1]&.
Martin Ender

3

PHP, 61 bytes

function d($a){return is_array($a)?1+max(array_map(d,$a)):0;}

recursive function that uses itself as a mapping function to replace each element with its depth.


I just noticed: The same thing in JS has only 35 bytes. Still pretty in php.
Titus

Nice, you beat me. But I updated mine and beat you back :)
aross

3

PHP, 84 72 64 63 60 bytes

Note: requires PHP 7 for the combined comparison operator. Also uses IBM-850 encoding

for(;$c=$argv[1][$i++];)$c>A&&$t=max($t,$z+=~ú<=>$c);echo$t;

Run like this:

php -r 'for(;$c=$argv[1][$i++];)$c>A&&$t=max($t,$z+=~ú<=>$c);echo$t;' "[1, [[3]], [5, 6], [[[[8]]]], 1]"
  • Saved 12 bytes by just counting braces of the string representation instead
  • Saved 8 bytes by simplifying string comparisons and using ordinal number of the char in case of [ and ]
  • Saved a byte by not casting $i to an int. String offsets are casted to an int implicitly
  • Saved 3 bytes by using combined comparison operator instead of ordinal number

Nice idea, great golfing! Check out mine.
Titus


2

Python 3, 42 39 bytes

-3 bytes thanks to Sp3000

This is essentially a port of xnor's Python 2 solution:

f=lambda l:"A"<str(l)and-~max(map(f,l))

Unfortunately, [] > {} returns an unorderable types error, so that particular clever trick of xnor's cannot be used. In its place, -0123456789 are lower in ASCII value than A, which is lower than [], hence the string comparison works.


2

CJam (15 bytes)

q~{__e_-M*}h],(

Online demo

Dissection

q~      e# Read line and parse to array
{       e# Loop...
  _     e#   Leave a copy of the array on the stack to count it later
  _e_-  e#   Remove a flattened version of the array; this removes non-array elements from
        e#   the top-level array.
  M*    e#   Remove one level from each array directly in the top-level array
}h      e# ...until we get to an empty array
],(     e# Collect everything together, count and decrement to account for the extra []

For the same length but rather more in ugly hack territory,

q'[,-{:~_}h],2-

s/ugly/beautiful/
Dennis

@Dennis, I was referring specifically to the use of '[,- to strip the string down to [], which relies on the contents being limited. The approach which flattens works regardless of the contents of the array.
Peter Taylor

The second one is prettier. The first one has two types of mismatched braces
Cyoce

2

Sed, 40 characters

(39 characters code + 1 character command line option.)

s/[^][]+//g
:;s/]\[//;t
s/]//g
s/\[/1/g

Input: string, output: unary number.

Sample run:

bash-4.3$ sed -r 's/[^][]+//g;:;s/]\[//;t;s/]//g;s/\[/1/g' <<< '[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]'
111111

Sed, 33 characters

(32 characters code + 1 character command line option.)

If trailing spaces are allowed in the output.

s/[^][]+//g
:;s/]\[//;t
y/[]/1 /

Input: string, output: unary number.

Sample run:

bash-4.3$ sed -r 's/[^][]+//g;:;s/]\[//;t;y/[]/1 /' <<< '[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]'
111111      

2

Hexagony, 61 bytes

Edit: Thanks @Martin Ender♦ for saving me 1 byte from the marvelous -1 trick!

|/'Z{>"-\..(.."/'&<'..{>-&,=+<$.{\$._{..><.Z=/...({=Z&"&@!-"

Try it online to verify test cases!

The images below are not modified but the flow is basically the same. Also note that this will return -1 if the input is not an array (i.e. without []).

I have lots of no-ops inside the Hexagon... I guess it can definitely be golfed more.

Explanation

In brief, it adds -1 when encounters a [ and adds 1 when encounters a ]. Finally it prints the max it has got.

Let's run along Test Case 5 to see its behaviour when it runs along the String [1, [[3]], [5, 6], [[[[8]]]], 1]:

It starts at the beginning and takes its input at the W corner:

Brackets

Since there is still input (not the null character \0 or EOL), it wraps to the top and starts the crimson path.

Here is what happens when from there till cute ><:

, reads [ into Buffer, and { and Z sets the constant Z to be 90. ' moves to Diff and - calculates the difference. For [ and ] the difference will be 1 and 3 respectively. For numbers and spaces and commas it'll be negative.

M1 M2

Then we run ( twice (once at the end of crimson path, one at the start after wrapping at the green path) to get -1 and 1 resp for [ and ]. Here we change the naming of Diff to Value. Add this Value to Depth. (I used Z& to ensure that it copies the right neighbor). Then we calculate lastMin - Depth and got a number on the Memory edge minLR.

Then we apply & (at the end of green path) to minLR: If the number is <=0, it copies the left value (i.e. lastMin - Depth <= 0 => lastMin <= Depth), otherwise it takes the right value.

We wraps to the horizontal blue path and we see Z& again which copies the minLR. Then we "& and made a copy of the calculated min. The brackets are assumed to be balanced, so the min must be <=0. After wrapping, the blue path go left and hit (, making the copy 1 less than the real min. Reusing the -, we created one more 1-off copy as a neighbor of Buffer:

M3

Note: copy is renamed as 1-off

When blue path hits \ and got a nice " and < catches it back to the main loop.

When the loop hits 1, , or or other numbers as input:

othersM4

The Diff will become negative and it got reflected back to the main loop for next input.

When everything has gone through the main loop, we reach EOL which makes Buffer -1 and it finally goes to the bottom edge:

M5

' moves the MP to the 1-off copy and ) increments it, and with ~ negation it got the correct Max Depth value which is printed with !

And the story ends with a @.

I guess I must have over complicating things a little bit. If I have had to only "move back" and "print" without incrementing and negation, I would have well saved 2 bytes without using the full Hexagon.

Great thanks to Timwi for Esoteric IDE and Hexagony Colorer!


You can save a byte by making use of the -1 from , by changing the last row to: @!-". (although I agree that it is probably possible to shave off a lot more or even fit this into side-length 4 with some restructuring).
Martin Ender

Haven't thought of making use of the -1! Will edit once I got my computer. If the temp is on left neighbor, I would have saved quite a few Z from using Z&. And there should be better ways to start the program with the implicit if.
Sunny Pun

2

brainfuck, 48 bytes

,[<++[>-<------]>++[+[<]>>[-]]+<,]-[<[>+<-]>>]<.

Formatted:

,
[
  <++[>-<------]>++
  [
    not close paren
    +
    [
      not open paren
      <
    ]
    >>[-]
  ]
  +<,
]
-[<[>+<-]>>]
<.

Takes input formatted like (1, ((3)), (5, 6), ((((8)))), 1) and outputs a byte value.

Try it online.

This stores the depth by memory location, moving the pointer right for ( and left for ) and ignoring other characters. Visited cells are marked with a 1 flag, so at the end of the main loop there will be depth + 1 flags to the right of the current cell. These are then added to print the final result.


A previous 69-byte solution using a different approach:

,
[
  >>++[<<->>------]<-<++
  [
    not close paren
    >++<+
    [
      not open paren
      >-<[-]
    ]
  ]
  <
  [
    [>+>]
    <[<-<]
    >
  ]
  >>[<+> >+<-]
  ,
]
<.

In this version, the depth and max depth are stored explicitly in cells.


1

Pyth, 15 13 bytes

-2 bytes by @Maltysen

eSm-F/Ld`Y._z

Counts the difference between the cumulative counts of [ and ], and takes the maximum. Y is the empty array, and its string representation (`) is conveniently [].

Try it here.


Length built-ins are now allowed if it helps.
Martin Ender

1

CJam, 19 22 23 bytes

0l{_91=\93=-+_}%:e>

Similar idea to my MATL answer.

Thanks to Peter Taylor for removing 3 bytes

Try it here

0                            push a 0
l                            read line as string
{            }%              map this block on the string
  _91=\93=-                  1 if it's an opening bracket, -1 if closing
           +_                cumulative sum
               :e>           fold maximum function


1

Ruby, 51 characters

(Started as improvement suggestion for Doorknob's Ruby answer but ended differently. So I posted it as separate answer. Upvotes for the depth counting idea (?\\<=>$&, descending from '] ['.index(c)) should go to the original answer.)

m=i=0
gets.gsub(/\[|\]/){m=[m,i+=?\\<=>$&].max}
p m

Input: string, output: number.

Sample run:

bash-4.3$ ruby -e 'm=i=0;gets.gsub(/\[|\]/){m=[m,i+=?\\<=>$&].max};p m' <<< '[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]'
6

1

Perl 6, 53 bytes

The closure:

{my ($m,$d);/[\[{$d++;$m=max $m,$d}|\]{$d--}|.]*/;$m}

Needs an argument, eg:

{my ($m,$d);/[\[{$d++;$m=max $m,$d}|\]{$d--}|.]*/;$m}("[[[3]][2]]")
3

Explanation:

{ my ($m,$d);                 # start closure, declare variables    

  /                           # start regex match

   [                          # start (non-capturing) group

     \[ {$d++;$m=max $m,$d} | # match [ and track depth; OR

     \] {$d--}              | # match ] and track depth; OR

     .                        # match one character

   ]*                         # repeat group

  /;                          # end regex

  $m                          # return max depth
}

1

Minkolang 0.15, 31 29 24 bytes

Overhauled my algorithm upon inspiration by Luis Mendo's CJam answer and saved 5 bytes!

od5&j$ZN.d"["=$r"]"=~++d

Try it here!

Explanation

Essentially, what this code does is keep a running total with +1 for each [ and -1 for each ], keeping track of the maximum value reached, outputting that maximum at the end. Looping is handled by the toroidal nature of Minkolang's codebox.

od           Take character from input and duplicate it (0 if input is empty)
  5&         Pop top of stack and skip the following five spaces if 0
    j$Z      Push the maximum value of the stack
       N.    Output as number and stop.

  d                  Duplicate top of stack for character tests
   "["=              +1 if the character is [
       $r            Swap top two items of stack
         "]"=~       -1 if the character is ]
              ++     Add twice
                d    Duplicate top of stack for the running total

1

Ruby, 41 characters

f=->a,d=1{a.map{|e|f[e,d+1]rescue d}.max}

Parameter: array, return: number.

Sample run:

2.1.5 :001 > f=->a,d=1{a.map{|e|f[e,d+1]rescue d}.max}
 => #<Proc:0x0000000214d258@(irb):1 (lambda)> 

2.1.5 :002 > f[[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]]
 => 6 

1

Oracle SQL 11.2, 133 bytes

SELECT MAX(d)FROM(SELECT SUM(DECODE(SUBSTR(:1,LEVEL,1),'[',1,']',-1,0))OVER(ORDER BY LEVEL)d FROM DUAL CONNECT BY LEVEL<=LENGTH(:1));

Un-golfed

SELECT MAX(d)
FROM   (
         SELECT SUM(DECODE(SUBSTR(:1,LEVEL,1),'[',1,']',-1,0))OVER(ORDER BY LEVEL) d 
         FROM   DUAL 
         CONNECT BY LEVEL<=LENGTH(:1)
       );

The CONNECT BY creates one row per character in the input string.

The SUBSTR isolates the character corresponding to the row number.

The DECODE translates each '[' to 1, each ']' to -1 and every other character to 0.

The analytic SUM sums each 1, -1 and 0 from the preceding rows, including the current row;

The MAX sums is the depth.


1

Java 8, 95

This is a lambda expression for a ToIntFunction<String>. Input is taken as a String in the OP's examples format.

s->{int d=e=-1;for(String t:s.split("[")){d=++e>d?e:d;e-=t.split("]",-1).length()-1;}return d;}

fairly straightfoward. Split the string using [ as the delimiter. For each of them, increment the counter e and compare it with the counter d, keeping the larger of them in d. Then split the current iteration's string using ] as the delimiter this time and subtract the number of extra splits from e.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.