// One possible implementation of shape() proc myshape(a) { var res, i, j, n, m, tmp, t1; if (a.isarray()) { n = a.length(); res = {n}; tmp = myshape(a[0]); if (tmp) { for (i = 1; i < n; i++) { t1 = myshape(a[i]); if (!t1) { tmp = nil; break; } m = t1.length(); if (m < tmp.length()) { tmp = tmp[0:m]; } m = tmp.length(); for (j = 0; j < m; j++) { if (t1[j] < tmp[j]) { tmp[j] = t1[j]; } } } if (tmp) { res = res ## tmp; } } return res; } else { return nil; } } proc main() { var a = {{{"\x00\x01\x02\x03\x04","\x05\x06\x07\x08\x09", "\x0A\x0B\x0C\x0D\x0E","\x0F\x10\x11\x12\x13"}, {"\x14\x15\x16\x17\x18","\x19\x1A\x1B\x1C\x1D", "\x1E\x1F\x20\x21\x22","\x23\x24\x25\x26\x27"}, {"()*+,","-./01","23456","789:;"}}, {{"<=>?@","ABCDE","FGHIJ","KLMNO"}, {"PQRST","UVWXY","Z[\\]^","_`abc"}, {"defgh","ijklm","nopqr","stuvw"}}}; var b, i, n; b = myshape(a); n = b.length(); "b ="; for (i = 0; i < n; i++) { " ", b[i]; } "\n"; }