Sorry, that tacit form got butchered in copy/pasting through different
mediums and is actually
(|@-)/@(0&{)@(a {~ (b {~ I.@(a e.~ (|@:-)/"1@:(a {~ b=:4&$.@$.@(a e.~ (
</~@:}.@i. * +/~@(a=.}.@pentagona l@i.))))))) 20000
using the sparse-form trick
On Fri, Jul 12, 2019 at 5:31 PM Daniel Eklund <[email protected]> wrote:
> Mike, thanks for thinking like I had a analytic insight, but I made a
> mistake.
>
> In my defense, I did know to divide by 2, but at the time I was exploring
> what forms of verbs could automatically be inverted (obverted?) to create a
> possible "is_pentagonal" predicate and accidentally copied my truncated
> verb into my question.
>
> I never actually used such a form as I merely did what others did and
> checked membership against the pre-generated list.
>
> My final answer was an ugly overly-tacit overly-commutative form that
> doesn't bother with tabling the negative forms (there is a high probability
> that it is over-engineered, and I always strive after getting the answer to
> tersifying my solution to unlock insight).
>
> pentagonal =: -:@( [ * 1 -~ 3 * ])
>
> (|@-)/@(0&{)@(a {~ (b {~ I.@(a e.~ (|@:-)/"1@:(a {~ b=:4&.@.@(a e.~ (
> </~@:}.@i. * +/~@(a=.}.@pentagonal@i.))))))) 20000
>
> Like I said, I know I can improve it, and was excited to see Oleg's answer
> (as I knew I would) when I unlocked the forum.
>
> Thanks for all the feedback. I'm not sure I understand Louis's feedback
> yet, (seeing the anti-base there is confusing) but I am going to try all of
> them now.
>
>
> On Fri, Jul 12, 2019 at 9:43 AM 'Mike Day' via Programming <
> [email protected]> wrote:
>
>> It looks as if Daniel was solving the problem for pentagonal numbers *
>> 2.
>> Clearly, if there’s a solution in true Pn for a pair of indices, m > n,
>> ie, (-/ Pn m,n) = +/ Pn m,n,
>> it will also be a solution for 2 * Pn .
>>
>> I suppose there might be some half-integral solutions for 2 * Pn which
>> don’t work for Pn
>>
>> Mike
>>
>> Sent from my iPad
>>
>> > On 12 Jul 2019, at 12:17, 'Pascal Jasmin' via Programming <
>> [email protected]> wrote:
>> >
>> > 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
>>
>> ----------------------------------------------------------------------
>> For information about J forums see http://www.jsoftware.com/forums.htm
>>
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm