Hi Daniel, If the ravel indices into the array M are stored in I, the multi-dimensional indices are then
($M) #: I So for your toy example a possible verb is v=: $ #: , I.@:= _1: Cheers, Louis > On 12 Jul 2019, at 02:11, 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
