JC,
Short answer:
k =: (&[) ("_1) (#/.~@:]`) (`({~ ~.)) (`:6) ~
l =: k (`(~.@:[)) (`]) }
f =: ^&2
v =: i.10
ind =: 3 5 3
ind f l v
0 1 2 81 4 25 6 7 8 9
A couple of points. You say the result should be r=:1 2 81 4 25 6 7 8 9 but:
(A) (#r) is 9 whereas (#v) is 10 , so I'm assuming you forgot
the first element, 0 .
(B) You say f is 2^y but 2^5 is 32 , not 25 , so I assume
you meant y^2 (y-squared). To that end, you might want to
say f=: *: rather than f=: ^&2 .
Since you asked for "elegant", I decided to provide a tacit solution, to prove
that such can done in the language. If I were
writing this with intent of making it production code, I would probably make it
explicit. Explicit code, while not as beautiful
or cool, tends to be easier to read and maintain, and in complicated examples
like this, usually faster. For example, the tacit
code takes ~.x twice, which, in explicit code, could be calculated once and
stored in a local name.
-Dan
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm