Recently I asked for a cleaner version of PowerA at bottom of quoted message.
One such implementation is boxscan:
boxscan =: 1 : '>@:(<@(>@[ u >@])/)'
for any dyadic verb V, as long as x V y produces a shape that can be digested
as the right argument to V, then V boxscan < each x, < y will work like '/' for
any shapes/boxing of x and y. The major usefulness is that '/' only works when
x and initial y are the same shape because they have to fit in the same list
together.
+ boxscan ;/ i.1e1
45
(;/ i.1e1), < 1 11
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬────┐
│0│1│2│3│4│5│6│7│8│9│1 11│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴────┘
(] , [ + {:@]) boxscan (;/ i.1e1), < 1 11
1 11 20 28 35 41 46 50 53 55 56 56
Something that almost works instead of boxscan is (leaf /)
+ leaf/ ;/ i.1e1
┌──┐
│45│
└──┘
(] , [ + {:@]) leaf / (;/ i.1e1), < 1 11
┌──────────────────────────────────┐
│1 11 20 28 35 41 46 50 53 55 56 56│
└──────────────────────────────────┘
This actually only almost works, because it assumes unboxed core x and y
shapes. For verbs that can expect boxed x items and boxed y, then (leaf /)
fails, but (L:1 /) works. So double boxing the inputs:
+ leaf L:1/ <"0 ;/ i.1e1
┌────┐
│┌──┐│
││45││
│└──┘│
└────┘
V could be a relatively complex inputs, but relatively simple operation of
insert records into data structure, and so functions that support boxed
parameters are useful.
The only issue with the above is that it is 100x slower: (50x slower when you
move the boxing outside of timing loop)
ts '+ leaf L:1/ <"0 ;/ i.1e5'
10.1755/sec 30.3905MB
ts '+ leaf/ ;/ i.1e5'
19.1274/sec 15.7213MB
ts '+ boxscan ;/ i.1e5'
13.4397/sec 15.722MB
ts '+/ i.1e5'
1520.68/sec 1.05075MB
although, actually it appears slow, just because +/ is incredibly fast
These 2 very similar versions have only 10% speed difference
10 ts '(] , [ + {:@]) L:0 / (;/ i.1e4), < 1 11'
17.9466/sec 2.02381MB
10 ts '(] , [ + {:@]) / ( i.1e4+2)'
19.647/sec 0.39744MB
10 ts '(;/ i.1e4) (] , [ + {:@]) powerA L:0 < 1 11'
13.5675/sec 3.12538MB
10 ts '(] , [ + {:@]) boxscan (;/ i.1e4), < 1 11'
14.5873/sec 2.02483MB
So I'd guess that f L:0 / is already special coded because the first 2
functions speed differ by just 1% when the noun is created/assigned outside of
the timing loop.
I hope this post is still useful just for laying out the boxscan concept, which
seems pretty useful, and not something I've seen presented elsewhere.
----- Original Message -----
powerA =: 1 : 0
:
c =. y
while. 0<#x do.
a=. {. x
c =. a u c
x =. }. x
end.
c
)
(;~"0 i.10) kvset powerA h
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│1│3│a│5│0│2│4│6│7│8│9│
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│1│3│3│5│0│2│4│6│7│8│9│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
ts '(;~"0 i.1e3) kvset powerA h'
2.82845/sec 0.630528MB
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm