your definition of pentagonal doesn't do the divide by 2 step
pentagonal =: [ -:@* ( 1 -~ 3 * ])
this combines (,:) the +/ and -/ tables into 2, then finds intersection (*./).
4$.$. returns index(es)
4 $. $. *./@:(e.~ -/~ ,: +/~) pentagonal >: i.20115
2166 1019
On Thursday, July 11, 2019, 08:11:41 p.m. EDT, Daniel Eklund
<[email protected]> wrote:
Double thanks.
One for that sparse array trick. That will go into my toolbox.
And secondly, for the work you've been putting into the youtube videos -- I
think they've been an invaluable teaching aid, and a welcome addition to
the relative paucity of J learning outside of the main website.
On Thu, Jul 11, 2019 at 7:35 PM 'robert therriault' via Programming <
[email protected]> wrote:
> Wow Daniel,
> I am sincerely impressed at how you wrestled that one to the ground.
>
> A trick I learned a while ago on these forums was the use of Sparse ($.)
>
> toy e. _1
> 1 0 0 0
> 0 0 1 1
> 0 0 0 0
> $. toy e. _1 NB. converts dense array to sparse form
> 0 0 │ 1
> 1 2 │ 1
> 1 3 │ 1
> 4 $. $. toy e. _1 NB. Dyadic 4 $. returns the indices of sparse form
> 0 0
> 1 2
> 1 3
>
> Cheers, bob
>
> > On Jul 11, 2019, at 4:20 PM, Daniel Eklund <[email protected]> wrote:
> >
> > Hi everyone,
> >
> > I’m looking for some newbie help. I feel I’ve come so far but I’ve run
> > into something that is making me think I’m not really getting something
> > fundamental.
> >
> > Rather than try to come up with a contrived example, I’ll just say
> outright
> > that I’m trying to solve one of the project Euler questions (problem 44)
> > and in my desire to use a particular J strategy (‘tabling’) I’m
> struggling
> > to deduce how array indexing to recover the input pairs works best.
> >
> > From the question:
> >
> > A pentagonal number is Pn=n(3n−1)/2. The first ten pentagonal numbers
> are:
> >
> > 1, 5, 12, 22, 35, 51, 70, 92, 117, 145, …
> >
> > The challenge is to find two pentagonal numbers that both added together
> > and whose difference is also a pentagonal number.
> >
> > Producing pentagonals is easy enough:
> >
> > pentagonal =: [ * ( 1 -~ 3 * ])
> >
> > pentagonal >: i. 5
> >
> > 2 10 24 44 70
> >
> > My plan was then to table both the addition and subtraction
> >
> > +/~ pentagonal >: i. 5
> >
> > 4 12 26 46 72
> >
> > 12 20 34 54 80
> >
> > 26 34 48 68 94
> >
> > 46 54 68 88 114
> >
> > 72 80 94 114 140
> >
> > -/~ pentagonal >: i. 5
> >
> > 0 _8 _22 _42 _68
> >
> > 8 0 _14 _34 _60
> >
> > 22 14 0 _20 _46
> >
> > 42 34 20 0 _26
> >
> > 68 60 46 26 0
> >
> > And then fetch the values in the table that were also pentagonal. This
> > seems like a sane strategy -- not entirely clever -- but I am running
> into
> > something that makes me feel I am missing something essential: how to
> > recover the numbers (horizontal row number and column number pair, and
> > therefore input values) that induced the result.
> >
> > I create myself a toy example to try to understand, by creating a
> hardcoded
> > matrix where I’m interested in those that have a certain value:
> >
> > ] toy =: 3 4 $ _1 2 12 9 32 23 _1 NB. _1 will be value of interest
> >
> > _1 2 12 9
> >
> > 32 23 _1 _1
> >
> > 2 12 9 32
> >
> > toy e. _1 NB. I am searching for _1 (a proxy for a truth function like
> > "is_pentagonal")
> >
> > 1 0 0 0
> >
> > 0 0 1 1
> >
> > 0 0 0 0
> >
> > I cannot easily find the indices using I., because
> >
> > I. toy e. _1
> >
> > 0 0
> >
> > 2 3
> >
> > 0 0
> >
> > Has a zero in the first row which is semantically important, but
> > zero-padding (semantically unimportant) in other locations.
> >
> > I realize I can ravel the answer and deduce (using the original shape)
> the
> > indices
> >
> > I. , toy e. _1
> >
> > 0 6 7
> >
> > NB. The following is ugly, but works
> >
> > (<.@:%&4 ; 4&|)"0 I. , toy e. _1 NB. The 4 hardcoded is the length
> > of each item
> >
> > ┌─┬─┐
> >
> > │0│0│
> >
> > ├─┼─┤
> >
> > │1│2│
> >
> > ├─┼─┤
> >
> > │1│3│
> >
> > └─┴─┘
> >
> > And voilà a table of items of row/column pairs that can be used to fetch
> > the original inducing values.
> >
> > To get to the point: is there anything easier? I spent a long time on
> > NuVoc looking at the “i.” family along with “{“. I feel like I might be
> > missing out on something obvious, stipulating that there is probably
> > another way to do this without tabling and trying to recover the inducing
> > values.
> >
> > Is my desire, i.e. to table results and simultaneously keep pointers back
> > to the original values (a matter of some hoop jumping) the smell of an
> > anti-pattern in J ?
> >
> > Thanks for any input.
> >
> > Daniel
> >
> > PS. In my question I purposefully am ignoring the obvious symmetry of
> >
> > +/~ pentagonal >: i. 5
> >
> > As I am interested in the _general_ case of tabling two different arrays:
> >
> > ( pentagonal 20+i.6) +/ pentagonal >: i. 5
> >
> > 1182 1190 1204 1224 1250
> >
> > 1304 1312 1326 1346 1372
> >
> > 1432 1440 1454 1474 1500
> >
> > 1566 1574 1588 1608 1634
> >
> > 1706 1714 1728 1748 1774
> >
> > 1852 1860 1874 1894 1920
> >
> > And recovering their indices.
> > ----------------------------------------------------------------------
> > 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