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
