In the effort of generalizing it more, I noticed that

   (3 5) (0 +./ .= (|/ i.)) 10
1 0 0 1 0 1 1 0 0 1

works fine, but collapses when only on divider is given

   (2) (0 +./ .= (|/ i.)) 10
1

(looks like the resulting vector being ORed).

Q1:
Is there a possible twist to bring these two cases (one | more than one) together..?

In continuing toward solution to PE1 (generalized) I produced this line

   pe1g=. 13 : '+/ (i.y) * (x) (0 +./ .= (|/ i.)) y'

which seems to deliver correct results

   (3 5) pe1g 10
23
   (3 5) pe1g 1000
233168

but still doesn't cover the special case:

   (2) pe1g 10
45

*~~~~~*

Going tacid using the result of the "13 cheat"

   pe1g=. [: +/ ([: i. ]) * 0 +./ .= (|/ i.)

I end up near, but not quite at Raul's 2nd suggestion

   pe1=: [:+/ [:I. 0 +./ .= (|/ i.)

Q2:
Why is it, that sometimes the placeholder (]) is used to indicate the right hand argument, and sometimes not..?

If I put two of those (i.]) in my version (as was my first thought), I do even get a wrong answer:

   pe1gf=. [: +/ ([: i. ]) * 0 +./ .= (|/ i.])
   3 5 pe1gf 10
0

*~~~~~*

Progressing from

   (2) (0 = (|/ i.)) 10
1 0 1 0 1 0 1 0 1 0

to

   (I.) (2) (0 = (|/ i.)) 10
0 2 4 6 8

I now see how (I.) was used to compact it further by evaluating the bit mask (instead of multiplying the elements). Neat.

-M


At 2016-05-06 08:43, you wrote:
Let me add that, following this thread so far, I too learned a few things today - and pardon me for outlining the steps for further reference. I (again) did a very base level approach: 3 + 8 9 10 11 12 13 5 + 8 9 10 13 14 15 3 5 + 8 9 10 |length error | 3 5 +8 9 10 At that stage I realized that (/) isn't only "Insert" but also used to force a "Table": 3 5 +/ 8 9 10 11 12 13 13 14 15 These lines take the "Modulo" and, in a second step, throw a "1" for a match [division result zero], "0" otherwise): 3 5 |/ 8 9 10 2 0 1 3 4 0 3 5 (0=|/) 8 9 10 0 1 0 0 0 1 I then combined these results by ORing (+.) the two rows: +./ 3 5 (0=|/) 8 9 10 0 1 1 Here comes Raul for help with his "first multiply, then add up" example 2 * 3 5 7 6 10 14 2 +/ .* 3 5 7 30 This technique seems to work for anything dyadic, e.g. if I replaced the "multipy" (*) with [third] "root" (%:) I got 3 %: 2 3 4 1.25992 1.44225 1.5874 3 +/ .%: 2 3 4 4.28957 As he (Raul) pointed out, if one replaces the "multiply" with the "equal to zero comparison" one can rewrite thus 3 5 (0 +./ .=(|/)) 8 9 10 0 1 1 3 5 (0 +./ .=(|/8+i.)) 3 0 1 1 Going back to the original example 3 5 (0 +./ .=(|/i.)) 20 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 0 0 1 0 which I now understand a bit better, reading from right to left, as - take the current index (i.), - check the modulo result (|/), - compare with zero(0 .=), - OR the table rows (+./) produced by the left vector (to get the result vector). And this is a fairly general notation; playing around (this is fun): 3 5 7 (0=(|/i.)) 25 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 3 5 7 (0 +./ .=(|/i.)) 25 1 0 0 1 0 1 1 1 0 1 1 0 1 0 1 1 0 0 1 0 1 1 0 0 1 Thanks for your patience ... -M At 2016-05-05 22:03, you wrote: > > 3 5 (0 +./ .= (|/ i.)) 20 the ".=" is hard to read. Its > equivalent to ". =" or in this case 3 5 (0 +./@:= (|/ i.)) 20 ----- > Original Message ----- From: Geoff Canyon <gcan...@gmail.com> To: > programm...@jsoftware.com Sent: Thursday, May 5, 2016 5:54 PM > Subject: Re: [Jprogramming] Project Euler 1 So there are a few > learning opportunities here -- euphemism for things I don't > understand ;-) I get how adding 0 = transforms the modulo results > into a 1 for "divisible" and 0 for "not divisible": 3 5 (0 = > (|/ i.)) 20 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 0 0 0 0 1 0 0 > 0 0 1 0 0 0 0 1 0 0 0 0 But I'm not seeing how this combines those > results with an OR: 3 5 (0 +./ .= (|/ i.)) 20 1 0 0 1 0 1 1 0 0 1 1 > 0 1 0 0 1 0 0 1 0 Maybe I'm just not seeing how the forks/hooks > resolve themselves? I seem to recall there was a command to get J > to box a command to show how that flow works, but I don't remember > it. Or maybe that's not it at all and I'm just confused. thx gc On > Wed, May 4, 2016 at 11:35 PM, Raul Miller <rauldmil...@gmail.com> > wrote: > On Wed, May 4, 2016 at 10:35 PM, Geoff Canyon > <gcan...@gmail.com> wrote: > > So I tried to write code to solve > the general case of Project Euler > problem > > 1. The problem > given is to find the sum of all the positive integers less > > than > 1000 that are divisible by 3 or 5. Obviously the specific case > is > > highly optimizable. But I wanted to solve the general, with > any number of > > divisors and any upper limit. > > ... > > Here's > the code. As always, I suck at J, so improvements/suggestions > are > > welcome. > > > > pe1 =: +/@(([:i.]) * > 1&-@(0&i.)@*/"1@|:@(|"0 1 i.)) > > Maybe: > pe1=: [:+/@I. 0 +./ > .= (|/ i.) > > ? > > Assuming email anti-spam bots do not eat my > line for including an @ > character. Maybe, instead: > > pe1=: > [:+/ [:I. 0 +./ .= (|/ i.) > > ... > > -- > Raul > > ---------------------------------------------------------------------- > > 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

Reply via email to