You can compare the tree versions of comb3a and comb4 to see their
differences:
comb3a
┌─ [
│ ┌─ =
│ ┌──────┤ ┌─ / ─── +
│ │ └─ " ──┴─ 1
│ │
├───┤ ┌─ |.
──┤ │ ┌─ @: ─┴─ I.
│ ├─ @ ──┴─ #
│ └─ ]
│
│ ┌─ 2
│ │ ┌─ #:
└───┤ ┌─ @ ──┴─ i.
├─ @: ─┴─ ^
└─ ]
comb4
┌─ [:
├─ |.
│ ┌─ [:
│ ├─ I.
──┤ │ ┌─ [
│ │ ├─ =
│ │ │ ┌─ [:
│ │ ┌───┤ │ ┌─ / ─── +
└────┤ │ │ ├─ " ─┴─ 1
│ │ └────┤
│ │ │ ┌─ [:
│ │ │ ├─ #:
│ │ └─────┤ ┌─ [:
│ │ │ ├─ i.
└────┤ └─────┤ ┌─ 2
│ └────┼─ ^
│ └─ ]
├─ #
│ ┌─ [:
│ ├─ #:
└───┤ ┌─ [:
│ ├─ i.
└────┤ ┌─ 2
└─────┼─ ^
└─ ]
Linda
-----Original Message-----
From: Programming [mailto:[email protected]] On
Behalf Of Linda Alvord
Sent: Friday, November 3, 2017 2:28 AM
To: [email protected]
Subject: Re: [Jprogramming] Partitions
Oops, this should be better:
comb4=: 13 :'|.I.(x=+/"1#:i.2^y)##:i. 2^y'
comb4
[: |. [: I. ([ = [: +/"1 [: #: [: i. 2 ^ ]) # [: #: [: i. 2 ^ ]
#3 comb4 5
10
Linda
-----Original Message-----
From: Programming [mailto:[email protected]] On
Behalf Of Raul Miller
Sent: Thursday, November 2, 2017 2:54 AM
To: Programming forum <[email protected]>
Subject: Re: [Jprogramming] Partitions
No, you did not test your work.
#3 comb 5
10
#3 comb4 5
56
Probably the simplest way to approach what I think you are trying to do
involves expanding the part in parenthesis independent of the rest of it.
And, personally, when I am working on a line of J code, I like to have a
little test rig so that I can quickly see when I have gone astray.
Doing that here (and clipping out my mistakes), then adding comments gets
me this:
First, I set up a test rig with the original expression:
#3 ([ ((= +/"1) |.@:I.@# ]) 2 #:@i.@:^ ]) 5
10
Then, I rephrase the outer part as an explicit expression for 13 :
#3 (13 :'x ((= +/"1) |.@:I.@# ]) #:i. 2^y') 5
10
Since that worked, I take a look at what 13 : gave me
13 :'x ((= +/"1) |.@:I.@# ]) #:i. 2^y'
[ ((= +/"1) |.@:I.@# ]) [: #: [: i. 2 ^ ]
Next, I try that out in my test rig:
#3 ([ ((= +/"1) |.@:I.@# ]) [: #: [: i. 2 ^ ]) 5
10
So, now that I have that, I do a rephrase of the inner part for another
13
:
# 3([ (13 :'|.I.(x = +/"1 y) # y') [: #: [: i. 2 ^ ]) 5
10
And, since that works, I take a look at what it gave me:
[ (13 :'|.I.(x = +/"1 y) # y') [: #: [: i. 2 ^ ] [ ([: |. [: I. ] #~
[
= [: +/"1 ]) [: #: [: i. 2 ^ ]
And, voila, I've got another variation that I can use in a word
definition:
comb4a=: [ ([: |. [: I. ] #~ [ = [: +/"1 ]) [: #: [: i. 2 ^ ]
That's a bit ugly, but ascii is ugly (but, also, standardized and - thus
-
widely available).
So, we can try that out and see it in operation:
3 comb4a 5
0 1 2
0 1 3
0 1 4
0 2 3
0 2 4
0 3 4
1 2 3
1 2 4
1 3 4
2 3 4
Also... note that when working with "real life" mechanisms (not just J),
having some sort of test rig to make sure that what you are doing behaves
like you think it does can be an invaluable time saver. (The alternative
-
putting a lot of work into something, only to find out that it doesn't
work
and that you have to start over again - is sometimes necessary but not
always attractive.)
(Well, that, and remember that this approach is slower than the stock
comb
implementation when y > 10 - so mostly I would just do require'stats' and
then use that comb implementation.)
Then again, now that we have this variation, we could also try to
reconstruct an explicit expression which does the same thing. For that we
want to merge these two examples:
#3 (13 :'x ((= +/"1) |.@:I.@# ]) #:i. 2^y') 5
# 3([ (13 :'|.I.(x = +/"1 y) # y') [: #: [: i. 2 ^ ]) 5
Perhaps something like:
#3 (13 :'|.I.(x = +/"1 t) # t=. #:i. 2^y') 5
10
(But I would not blindly enshrine results just because they were
generated
by an automated mechanism - such things can be useful tools, of course,
but
if you abandon your own understanding that's not good.)
I hope this helps,
--
Raul
On Wed, Nov 1, 2017 at 11:55 PM, Linda Alvord <[email protected]
wrote:
This is another way to get to Raul's ideas in a tacit soluion:
comb4=: 13 :'|.I.(x=+/"1#:i.x^y)##:i.x^y'
2 comb4 4
0 1
0 2
0 3
1 2
1 3
2 3
comb4
[: |. [: I. ([ = [: +/"1 [: #: [: i. ^) # [: #: [: i. ^
Linda
-----Original Message-----
From: Programming [mailto:[email protected]] On
Behalf Of Lippu Esa
Sent: Wednesday, November 1, 2017 5:53 PM
To: '[email protected]' <[email protected]>
Subject: Re: [Jprogramming] Partitions
Thank you, Raul! I knew that there would be a tacit solution. But comb
is
better with big y as you said.
Esa
-----Original Message-----
From: Programming [mailto:[email protected]] On
Behalf Of Raul Miller
Sent: Wednesday, November 1, 2017 11:26 PM
To: Programming forum <[email protected]>
Subject: Re: [Jprogramming] Partitions
comb3 performs well for y<10, but bogs down (compared to comb) for
y>10
That said, a=.[: #: [: i. 2 ^ ] is a verb, not a noun.
That said, you do not have to compute a twice, for example:
comb3a=: [ ((= +/"1) |.@:I.@# ]) 2 #:@i.@:^ ]
(but comb3a is still slower than comb, when I time it, for y>10)
Thanks,
--
Raul
On Wed, Nov 1, 2017 at 4:52 PM, Lippu Esa <[email protected]> wrote:
Yes, interesting! Thank you Linda.
Just for practice, I tried to isolate the common part: [: #: [: i. 2 ^
]
but had to use a noun as didn't manage to find a tacit solution.
comb3=:([ = [: +/"1 a) ([: |. [: I. #) a=.[: #: [: i. 2 ^ ]
Anyone?
Esa
-----Original Message-----
From: Programming [mailto:[email protected]]
On Behalf Of Linda Alvord
Sent: Wednesday, November 1, 2017 1:49 PM
To: [email protected]
Subject: Re: [Jprogramming] Partitions
Maybe you will find comb2 interesfing.
load 'stats'
comb2=:([ = [: +/"1 [: #: [: i. 2 ^ ]) ([: |. [: I. #) [: #: [: i. 2
^ ]
(4 comb2 7)-:4 comb 7
Li nda
Get Outlook for Android<https://aka.ms/ghei36>
________________________________
From: Programming <[email protected]> on
behalf of Erling Hellenäs <[email protected]>
Sent: Wednesday, November 1, 2017 7:13:33 AM
To: [email protected]
Subject: Re: [Jprogramming] Partitions
Hi all!
parRuskey comparison.
Mike Days new version is slightly faster than the Frank Ruskey version.
Cheers,
Erling Hellenäs
----------Project----------
ts=: 6!:2 , 7!:2@] NB. Time and space
normalize=: 3 :0
NB. The idea here is to normalize the representation so that NB. the
copies are adjacent.
NB. Sort buckets within each combination after first item in each
bucket v31=.(] /: {.&.>)"1 y NB. Sort buckets within each combination
after number of items in each bucket v4=.(] /: #&.>)"1 v31 NB. Sort
v5=. /:~ v4
(/: #&.> v5){ v5
)
compare=: -:&:normalize
NB. parELMDE for comparison
parELMDE=: 4 : 0
a =. ~. i.~"1 iy #: i. */ iy =. (1+i.x),(y-x)$x a =. a#~ x = #@~."1 a
sort a </."1 i. y
)
NB. Original Frank Ruskey version.
parRuskey =: 4 : 0
a=: i. y
r=: (0,y)$0
(x-1) S y-1
r </."1 i.y
)
S =: 4 : 0
if. x=y do.
r=:r,a
else.
for_i. i.x+1 do.
a=: i y } a
x S y-1
a=: y y } a
end.
if. x > 0 do.
a=: x y } a
(x-1) S y-1
a=: y y } a
end.
end.
)
NB. Slightly modified by Erling to remove global variables.
parRuskeyE =: 4 : 0
r=. (i.y) SE (x-1);y-1
r </."1 i.y
)
SE =: 4 : 0
'k n' =. y
r=. 0{.,:x
if. k=n do.
r=.,:x
else.
for_i. i.k+1 do.
r=.r, (i n } x) SE k;n-1
end.
if. k > 0 do.
r=.r, (k n } x) SE (k-1);n-1
end.
end.
r
)
NB. Modified by Mike Day
parRuskeyMD =: 4 : 0
NB. L =: 0$~0, 2 + y NB. debug/understand array of call parameters
r=. (i.y) SMD (x-1),y-1
NB. R =: r NB. debug/understand output
r </."1 i.y
)
SMD =: 4 : 0
NB. L =: L, y, x NB. debug/understand array of call parameters
'k n' =. y
a =.x
r =. 0$~ 0, #a
if. k = n - 1 do. NB. replace repeated calls with k = n (on entry)
r =. (i.k+1) n }"0 1 (k+1)# ,:a NB. don't need to use recursion
here!
else.
NB. is there a way to avoid recursion here, too?
r =. r, ,/ (SMD&(k,n-1))"1 (i.k+1) n }"0 1 a NB.apply "1 instead
of do loop end.
if. k > 0 do.
r=.r, (k n } a) SMD (k-1),n-1
end.
r
)
x=:1
y=:1
(x parELMDE y) compare x parRuskey y
(x parELMDE y) compare x parRuskeyE y NB.(x parELMDE y) compare x
parRuskeyMD y - Error
x=:1
y=:2
(x parELMDE y) compare x parRuskey y
(x parELMDE y) compare x parRuskeyE y (x parELMDE y) compare x
parRuskeyMD y
x=:2
y=:3
(x parELMDE y) compare x parRuskey y
(x parELMDE y) compare x parRuskeyE y (x parELMDE y) compare x
parRuskeyMD y
x=:3
y=:5
(x parELMDE y) compare x parRuskey y
(x parELMDE y) compare x parRuskeyE y (x parELMDE y) compare x
parRuskeyMD y
x=:3
y=:6
(x parELMDE y) compare x parRuskey y
(x parELMDE y) compare x parRuskeyE y (x parELMDE y) compare x
parRuskeyMD y
x=:5
y=:10
ts'x parRuskey y'
ts'x parRuskeyE y'
ts'x parRuskeyMD y'
-------Output-------------------
x=:1
y=:1
(x parELMDE y) compare x parRuskey y
1
(x parELMDE y) compare x parRuskeyE y
1
NB.(x parELMDE y) compare x parRuskeyMD y - Error
x=:1
y=:2
(x parELMDE y) compare x parRuskey y
1
(x parELMDE y) compare x parRuskeyE y
1
(x parELMDE y) compare x parRuskeyMD y
1
x=:2
y=:3
(x parELMDE y) compare x parRuskey y
1
(x parELMDE y) compare x parRuskeyE y
1
(x parELMDE y) compare x parRuskeyMD y
1
x=:3
y=:5
(x parELMDE y) compare x parRuskey y
1
(x parELMDE y) compare x parRuskeyE y
1
(x parELMDE y) compare x parRuskeyMD y
1
x=:3
y=:6
(x parELMDE y) compare x parRuskey y
1
(x parELMDE y) compare x parRuskeyE y
1
(x parELMDE y) compare x parRuskeyMD y
1
x=:5
y=:10
ts'x parRuskey y'
0.204245 3.89459e7
ts'x parRuskeyE y'
0.316044 3.8954e7
ts'x parRuskeyMD y'
0.173341 3.8954e7
Cheers,
Erling Hellenäs
Den 2017-10-31 kl. 20:17, skrev 'Mike Day' via Programming:
parRuskeynew =: 4 : 0
NB. L =: 0$~0, 2 + y NB. debug/understand array of call parameters
r=. (i.y) Snew (x-1),y-1
NB. R =: r NB. debug/understand output
r </."1 i.y
)
Snew =: 4 : 0
NB. L =: L, y, x NB. debug/understand array of call parameters
'k n' =. y
a =.x
r =. 0$~ 0, #a
if. k = n - 1 do. NB. replace repeated calls with k = n (on
entry)
r =. (i.k+1) n }"0 1 (k+1)# ,:a NB. don't need to use recursion
here!
else.
NB. is there a way to avoid recursion here, too?
r =. r, ,/ (Snew&(k,n-1))"1 (i.k+1) n }"0 1 a NB.apply "1 instead
of do loop end.
if. k > 0 do.
r=.r, (k n } a) Snew (k-1),n-1
end.
r
)
---------------------------------------------------------------------
- For information about J forums see
http://www.jsoftware.com/forums.htm
---------------------------------------------------------------------
- For information about J forums see
http://www.jsoftware.com/forums.htm
---------------------------------------------------------------------
- For information about J forums see
http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm