Haskell + free, 4040 37 bytes
3 bytes saved by Lynn
Haskell doesn't have a built in ragged list type so we need to build one out of free monads from the free package.
iter(maximum.((:)=<<length)).fmap(\_->0*0)
Explanation
First we replace every number with 0
because that is their length, or at least it's the length they should be to make the math work out.
Then from there we make a function maximum.((:)=<<length
. This looks complicated, but really all it does is take the length of a list of integers, put it on the front of the list and take the maximum of that. So it gives the max of the list or the length of the list whichever is larger.
With this we use iter
to "tear down" the list. iter
will start first with the lists containing only integers and run this on them then replace them with their results, and then it will do that again, and again until we've reduced the entire structure down to a single element.
We can visualize the entire process as:
[1,[1,[8,2,[1,2],5,4,9]],2,[],3]
[0,[0,[0,0,[0,0],0,0,0]],0,[],0] -- Replace everything with 0
[0,[0,[0,0,2,0,0,0]],0,0,0]
[0,[0,6],0,0,0]
[0,6,0,0,0]
6
Haskell + free, 40 bytes
f(Free x)=maximum$length x:map f x;f _=0
Explanation
This is very similar to the last answer in some ways but the recursion is done manually so it's easier to understand.
Pure x
means that x is just an number, and Free x
means that x
is a list of ragged lists.
So when it encounters a list our function maps itself across that list to get values, adds the length to the front and takes the maximum.
When it encounters a value it just gives back zero.