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