Stick a pair of parens around the hook, otherwise it executes like any explicit sentence!
Louis > On 29 Aug 2017, at 11:33, Skip Cave <[email protected]> wrote: > > 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 ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
