Louis:
This works:
+/(#~[:-.2&|)i.43
462
This doesn't:
+/#~ -.@:(2&|)i.43
22
Skip Cave
Cave Consulting LLC
On Tue, Aug 29, 2017 at 4:17 AM, Louis de Forcrand <[email protected]> wrote:
> Also count the verbs in
>
> #~ -. 2&|
>
> With three verbs this evaluates to a fork, so
>
> (#~ -. 2&|) v
> (#~v) -. 2&|v
>
> which signals a length error because #~ changes the shape of its argument.
>
> What you want is to apply -. mondadically to 2&|, not apply it between #~
> and 2&|; to do so use a cap [: like so:
>
> #~ [: -. 2&|. (which is a hook with 4 verbs)
>
> This is equivalent to
>
> #~ -.@:(2&|)
>
> Cheers,
> Louis
>
> > On 29 Aug 2017, at 10:29, Raul Miller <[email protected]> wrote:
> >
> > You should be using #~ instead of #
> >
> > If you look at your intermediate result without the +/ you will see why.
> >
> > Thanks,
> >
> > --
> > Raul
> >
> >
> >> On Tue, Aug 29, 2017 at 4:04 AM, Skip Cave <[email protected]>
> wrote:
> >> There seems to be two basic approaches to this problem:
> >>
> >> 1. Generate the even numbers between 1 & 42, and add them up.
> >> 2. Use the formula for the sum of an arithmetic progression - e.g.:
> >>
> >> Sum=n(a+b)/2
> >> *n* = number of numbers in the sequence (here 21)
> >> *a* = the first number in the sequence (here 2)
> >>
> >> *b* = the last number in the sequence (here 42)
> >>
> >> Generally, I like to approach these kinds of Quora sequence problems
> using
> >> a "brute force" approach, and ignore simplifying formulas. In the days
> >> before modern computers, formulas were developed to make computations on
> >> sequences like this Quora problem more tractable, particularly when the
> >> number of terms got large.
> >>
> >> Today, with powerful modern computers and languages, it is often easier
> to
> >> simply generate a sequence in it's entirety, and then compute some
> property
> >> of that sequence such as it's limit, sum, etc. to get the final result.
> >> This is particularly true when you have at your fingertips a powerful
> >> matrix language such as APL or J.
> >>
> >> For me, the obvious approach to this problem is to simply generate the
> >> sequence of even integers and then sum them, instead of trying to find a
> >> formula that relates to that specific sequence (in any case, I didn't
> have
> >> a clue where to look for such formulas).
> >>
> >> So the plan was: Generate the numbers from 0 to 42, throw out the odd
> >> numbers (zero doesn't matter in this problem), and then add up what's
> left:
> >>
> >> a =:i.43
> >>
> >> +/(-.2|a)#a
> >>
> >> 462
> >>
> >>
> >> My main dissatisfaction was that I was sure that this could be done in a
> >> single line, but I didn't know how to get the integer sequence on both
> >> sides of the tally/copy verb, which i wanted to use as a binary selector
> >> mask.
> >>
> >> Yes, thanks to Raul and others, I now realize that I could have just
> >> multiplied the first 21 integers by 2 to get all the even integers and
> then
> >> sum them, but I wanted to learn how to get the same vector of integers
> in
> >> two places in the formula without having to assign that vector to a
> >> variable.
> >>
> >> Raul showed me how to do that, though he used equality & multiplication
> to
> >> generate the selector mask and make the selections.
> >>
> >> +/(*0=2&|)i.43
> >>
> >> 462
> >>
> >>
> >> Raul's multiply by zero trick was cool, but my purist sensibilities
> still
> >> wanted to use selection of the even numbers as the most straightforward
> way
> >> to implement the sum of evens.
> >>
> >> However, Raul's approach did show me the way. I could use the copy
> operator
> >> to implement the selector mask, instead of multiplication
> >>
> >> +/(#0=2&|)i.43
> >>
> >> 462
> >>
> >>
> >> That worked, So we should also be able to get the sum of the odd
> numbers:
> >>
> >>
> >> +/(#2&|)i.43
> >>
> >> 441
> >>
> >>
> >> Yep. That worked too. So i should also be able use the NOT verb ".-" to
> >> invert the selection mask to get the sum of evens like I did in my
> original
> >> attempt:
> >>
> >>
> >> +/(#-.2&|)i.43
> >>
> >> 43
> >>
> >>
> >> AAAAK! What happened? I tried to negate the selection mask, and
> something
> >> went terribly wrong! Maybe I need to isolate the negation:
> >>
> >>
> >> +/(#(-.2&|))i.43
> >>
> >> |length error
> >>
> >> | +/ (#(-.2&|))i.43
> >>
> >>
> >> Nope! What am I doing wrong? How can I simply negate the selection
> mask,
> >> just like I did in my original explicit example?
> >>
> >>
> >>
> >> Skip Cave
> >> ----------------------------------------------------------------------
> >> 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