Hi Jon, I understand Idot the way you're explaining it.

   Idot m=: 1=3|i.3 4
0 1
1 0
1 3
2 2

finds the indices of the 1-s in m.
Even shorter is:
   4$.$.m
0 1
1 0
1 3
2 2

The standard way to index an array (to get the element at a certain index) is { 
.
   2{3{i.4 5
17

The index has to be boxed when multi-dimensional:
   (<2 3) { i.4 5
13

You can have an array of (boxed) indices:
    ]i=. ;/Idot m   
┌───┬───┬───┬───┐
│0 1│1 0│1 3│2 2│
└───┴───┴───┴───┘
   i { m
1 1 1 1

Ben
________________________________________
From: programming-boun...@forums.jsoftware.com 
[programming-boun...@forums.jsoftware.com] on behalf of Jon Hough 
[jgho...@outlook.com]
Sent: Saturday, October 11, 2014 07:43
To: programm...@jsoftware.com
Subject: Re: [Jprogramming] Project Euler 85, Python and J

Also, regarding Ben Gorte's

Idot =: $ #: I.@:,

This is an equivalent of I. for higher dimensions.

I'm having trouble understanding how this works.

Here is my understanding.

1. ravel the matrix and index elements (I.@:,)
2. Next is a fork of $ #: I.@:,

   Right "prong" is the aforementioned element indices.

   Left "prong" is the shape of the original array/matrix.

   middle "prong" is  the antibase of the right prong w.r.t. the left.

This seems to work for matrices of any size or dimension.

Is this the standard way to index multidimensional arrays?



> From: jgho...@outlook.com
> To: programm...@jsoftware.com
> Date: Sat, 11 Oct 2014 06:33:45 +0100
> Subject: Re: [Jprogramming] Project Euler 85, Python and J
>
> Using (2 ! >:) is clearly better than doing my double for-loop. I'm 
> embarrassed I missed that.
>
> The real meat of my confusion with multidimensional arrays is in not just 
> finding the indices but doing something with the elements at the indices.
>
> e.g. For a single dimension array, there could be a function to fund the 
> primes less than 100.
>
>
> primelist =: (I.@:(1&=)@:(1&p:)) { ]
>
>
> and primelist >: i. 100
>
>
> should spit out
>
>
> 2 3 5 ...  ...97
>
>
> But what if instead of having >: i. 100
>
> I had ( for some reason )
>
>  arr =: 10 10 $ >: i. 100
>
>
> So I have a 10 by 10 matrix of all positive ints up to 100.
>
>
> primelist clearly will not work on arr. But if I want to return the list of 
> primes, as a single dimensional list I'm not sure how to do that.
>
>
> Or, for example, if I want to change the elements of arr to 1 if and only if 
> the sum of the (i, j) indices are prime (just a random example).
>
>
> In procedural python this could be quickly done with a double for-loop and a 
> prime test. In J this type of problem still escapes me.
>
>
>
> > Date: Fri, 10 Oct 2014 19:35:26 -0400
> > From: devon...@gmail.com
> > To: programm...@jsoftware.com
> > Subject: Re: [Jprogramming] Project Euler 85, Python and J
> >
> >    countRects=: */@(2 ! >:)             NB. How many pairs each of vertical
> > * horizontal lines
> >    getSizes=: ,@(>:/~) # [: ,/ ,"0/~    NB. All pairs of i. y
> >    idxClosest=: 4 : '(i. <./)@(x |@:- ])y'"(0 2)   NB. Index of mat y to
> > value x
> >    ({~ *2e6*&idxClosest@:(countRects"1)) getSizes >: i.200    NB. Closest
> > to 2e6
> > 77 36
> >    ({~ *1e6*&idxClosest@:(countRects"1)) getSizes >: i.200    NB. Closest
> > to 1e6
> > 63 31
> >    countRects"1 ] 63 31,:77 36     NB. How close is each?
> > 999936 1999998
> >
> >
> > On Fri, Oct 10, 2014 at 1:14 PM, Linda Alvord <lindaalv...@verizon.net>
> > wrote:
> >
> > > What is the correct answerfor this problem?
> > >
> > > Linda
> > >
> > > -----Original Message-----
> > > From: programming-boun...@forums.jsoftware.com
> > > [mailto:programming-boun...@forums.jsoftware.com] On Behalf Of Stefano
> > > Lanzavecchia
> > > Sent: Friday, October 10, 2014 11:47 AM
> > > To: programm...@jsoftware.com
> > > Subject: Re: [Jprogramming] Project Euler 85, Python and J
> > >
> > > Actuary the use of ravel and antibase is common practice to solve
> > > certain problems in APL and isn't considered cheating. So I wouldn't
> > > say it's "not nice" but I would definitely go for antibase instead of
> > > a combination of floored-divide and modulus. As a bonus, a solution
> > > based on antibase would scale to problems of any rank and not just 2d
> > > matrices.
> > >
> > > Have fun!
> > > --
> > > Stefano
> > >
> > > > On 10/ott/2014, at 17:35, Sebastiano Tronto <sebastiano.tro...@gmail.com
> > > >
> > > wrote:
> > > >
> > > > Hi,
> > > > A dirty trick to get the job done would be to ravel the matrix ( , ),
> > > solve
> > > > the 1d version of the problem and then get the "true" indexes with
> > > > something like (<.@%&200 , 200&|).
> > > > For example, if you needed to just find the max:
> > > > (<.@%&200 , 200&|) (i. >./) , m
> > > > where m is your matrix.
> > > >
> > > > I know this isn't a nice way to solve the problem, but it should work.
> > > >
> > > > Sebastiano
> > > >
> > > > 2014-10-07 6:37 GMT+02:00 Jon Hough <jgho...@outlook.com>:
> > > >
> > > >> Project Euler 85: https://projecteuler.net/problem=85
> > > >> This problem is not really conceptually hard, but I am struggling with 
> > > >> a
> > > J
> > > >> solution.I have solved it in Python:
> > > >> =============================================
> > > >> def pe85(larg, rarg):   count = 0       llist = range(1, larg+1)
> > > >> rlist = range(1, rarg+1)
> > > >>        for l in llist:         for r in rlist:                 count +=
> > > >> l*r
> > > >>        return count
> > > >>
> > > >> if __name__ == "__main__":      # test for 2x3 grid, as in question.
> > > k
> > > >> = pe85(2,3)   print "Test value: "+str(k)             l1 = range(1,200)
> > > #
> > > >> 200 lucky guess     l2 = range(1,200)       bestfit = 10000 # just a 
> > > >> big
> > > >> number     area = 0        for i in l1:            for j in l2:
> > > >>         diff = abs(2000000 - pe85(i,j))                         if diff
> > > <
> > > >> bestfit:                             area = i*j
> > > >>  bestfit = diff
> > > >>        print "AREA is "+str(area)
> > > >>
> > > >>
> > > >> ================================================The above script will
> > > give
> > > >> the final area of the closest fit to 2 million. (The python code may 
> > > >> not
> > > be
> > > >> the best). Also I tested all possibilities up to 200x200, which was
> > > chosen
> > > >> arbitrarily(~ish).
> > > >> Next my J. I go the inner calculation ok (i.e. see the function pe85
> > > >> above). In J I have:
> > > >> pe85 =: +/@:+/@:((>:@:i.@:[) *"(0 _) (>:@:i.@:]))
> > > >> NB. I know, too brackety. Any tips for improvement appreciated.
> > > >>
> > > >>
> > > >> But from here things get tricky. If I do the calculation over 200x200
> > > >> possibilities I end up with a big matrix, of which I have to find the
> > > >> closest value to 2 million, of which then I have to somehow get the
> > > (x,y)
> > > >> values of and then find the area by x*y.
> > > >>
> > > >> The main issue is getting the (x,y) from the best fit value of the
> > > array.
> > > >>
> > > >> i.e. If I do pe85"(0)/~ 200, I get a big array, and I know I can get 
> > > >> the
> > > >> closest absolute value to 2 million but then I need to get the original
> > > >> values to multiply together to give the best fit area. Actually I have
> > > >> bumped into this issue many times. It is easy enough in a 1-d 
> > > >> array,just
> > > do:
> > > >> (I. somefunc ) { ])
> > > >>
> > > >> or similar to get the index. But for two indices the problem is beyond
> > > me
> > > >> at the moment. Any help appreciated.Regards,Jon
> > > >>
> > > >>
> > > >>
> > > >> ----------------------------------------------------------------------
> > > >> 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
> > >
> >
> >
> >
> > --
> > Devon McCormick, CFA
> > ----------------------------------------------------------------------
> > 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