// 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";
}