Shape of an array
Given a non-ragged array (an array where all sub-arrays at a particular level have the same length) of non-negative integers, answer its shape, that is, the length along every dimension. You may assume that the given array has at least one empty dimension, and that only the trailing dimension can have length 0.
Test cases
[]
→ [0]
[0]
→ [1]
[[]]
→ [1,0]
[[],[]]
→ [2,0]
[[4,4],[0,3]]
→ [2,2]
[[[4],[6]]]
→ [1,2,1]
[[[[7],[0]]]]
→ [1,1,2,1]
[Python 2], 37 bytes …
4y ago
J, 1 byte ```J $ ``` T …
3y ago
JavaScript (Node.js), 51 bytes …
3y ago
[Raku], 32 bytes {m …
4y ago
[JavaScript (Node.js)], 36 byt …
4y ago
JavaScript (Node.js), 39 bytes …
4y ago
6 answers
Python 2, 37 bytes
l=input()
while 1:print len(l);l=l[0]
This makes heavy use of programs being allowed to terminate with error, which I assume is allowed by default because it is on SE. We repeatedly print the length, and then replace the list with its first entry. This will fail when we're at a leaf, which is when the list is empty or is actually a number.
JavaScript (Node.js), 39 bytes
Returns dimensions from innermost to outermost
f=a=>a?.pop?f(a[0]).concat(a.length):[]
JavaScript (Node.js), 41 bytes
Returns dimensions from outermost to innermost
f=a=>a?.pop?[a.length].concat(f(a[0])):[]
0 comment threads
Raku, 32 bytes
{map +*,($_,*[0]...^9 ge*.gist)}
It's difficult to tell the difference between one element arrays and just plain numbers, since Raku translates between the two. However, gist
returns the list formatted with brackets surrounding it, so we are able to use that to our advantage using string comparison.
0 comment threads
JavaScript (Node.js), 51 bytes
n=[];f=(a)=>a&&a.map?(n.push(a.length),f(a[0]),n):n
Run f on your input, e.g. f([[],[]])
.
Explanation:
n=[]; // make a global array to hold the results
f=(a)=> // make the function
a&&a.map? // is a defined, and an array?
(n.push(a.length), // add the length to the results
f(a[0]), // do it again on the first item
n) // ...and return n
// ...if not, return n
:n
1 comment thread