Ugly as hell (but my J doesn't get any better without practicing):
cross =.(((1 {. 0 # ]), ]) {~ (>:*(|.+.])@(=/~))@i.@#)
NB. Works for strings with replicated entries
cross 'aabbcdeabcde'
a a
b b
c c
d d
ee
aa
b b
c c
d d
e e
NB. Works for empty argument
$cross ''
0 0
NB. Works for scalar argument (but it generates a matrix... should
it?)
cross 'a'
a
NB. Works for numbers
cross a.i.'aabbcdeabcde'
97 0 0 0 0 0 0 0 0 0 0 97
0 97 0 0 0 0 0 0 0 0 97 0
0 0 98 0 0 0 0 0 0 98 0 0
0 0 0 98 0 0 0 0 98 0 0 0
0 0 0 0 99 0 0 99 0 0 0 0
0 0 0 0 0 100 100 0 0 0 0 0
0 0 0 0 0 101 101 0 0 0 0 0
0 0 0 0 97 0 0 97 0 0 0 0
0 0 0 98 0 0 0 0 98 0 0 0
0 0 99 0 0 0 0 0 0 99 0 0
0 100 0 0 0 0 0 0 0 0 100 0
101 0 0 0 0 0 0 0 0 0 0 101
NB. Works for boxed
cross 'one';'two';'three';'four'
-----T-----T-----T----┐
│one │ │ │one │
+----+-----+-----+----+
│ │two │two │ │
+----+-----+-----+----+
│ │three│three│ │
+----+-----+-----+----+
│four│ │ │four│
L----+-----+-----+-----
--
Stefano "WildHeart" Lanzavecchia - mailto:[email protected]
[ "To know oneself, one should assert oneself." ---
Albert Camus ]
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm