Ahhh, the anti-base is clever.  Now I get it.
   3 4 #: 0 6 7
0 0
1 2
1 3

While the spare-array trick is great, I think this answer resonates as more
in keeping with an array-oriented 'style' that I'm trying to internalize.
It also succinctly does what I was trying to do with modulus/division hack
I first developed in a (now obvious) number-base manner.

Thank you all for the great feedback.



On Fri, Jul 12, 2019 at 4:14 AM 'Mike Day' via Programming <
[email protected]> wrote:

> Sorry - I see Louis has just posted a very similar comment,  but I'll
> persist!...
>
> I usually use something more basic and more boring!
> The idea is that you use the shape of your input as the basis for a
> representation of the indices of the ravelled version of the array.
> Here goes:
>     ] 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
>     ixbool =: $ #: I.@,  index of 1s in a boolean array
>     ixbool _1 = toy
> 0 0
> 1 2
> 1 3
>
> If, like Linda Alvord, you don't like @,  use this alternative tacit form:
>     ixbool =: $ #: [:I.,
>
> Notice, somewhat trivially,  that Bob's method can made slightly leaner:
>     $. toy = _1   NB. can use = rather than e.
> 0 0 │ 1
> 1 2 │ 1
> 1 3 │ 1
>
> Finally,  I evidently solved this problem (Euler 44) some time ago, as I
> have access to the answer,  but I have no record of how I achieved it!
> The answer is reasonably high,  but Oleg Kobchenko posted a J solution
> in Problem 44's discussion pages which didn't need high-powered
> maths,  unlike many of the more recent Euler Project problems,  so
> examining a table _might_ get you there.
>
> Good Luck,
>
> Mike
>
>
>
>
> On 12/07/2019 00:35, 'robert therriault' via Programming 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
>
>
> ---
> This email has been checked for viruses by Avast antivirus software.
> https://www.avast.com/antivirus
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to