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

Reply via email to