Hi, I tried replying already but somehow it didn't seem to get through.

I read Jon's main question as: how do I get the indices of the 1-s in a 
multi-dimensional boolean array, like I get them using I. in 1-d:
   I. 0 0 1 0 0 1 1 0 0 
2 5 6

A usual there are multiple options, such as:
   Idot =. $ #: I.@:,
   ]m2 =: 0=?4 6$5
0 1 0 0 0 1
0 0 0 0 0 1
0 1 1 0 0 0
0 1 0 0 0 0
   Idot m2
0 1
0 5
1 5
2 1
2 2
3 1
   Idot m3 =: 2 3 4$,m2
0 0 1
0 1 1
0 2 3
1 0 1
1 0 2
1 1 3

Also nice is:
      4$.$.m2
0 1
0 5
1 5
2 1
2 2
3 1 
, which I think I saw in a Rosetta contribution of Marshall Lochbaum. I.e.
   Idot2 =: 4&$.@:$.

I. duplicates indices of items with integer values > 1 :
   I.i.4
1 2 2 3 3 3
If you want the same behaviour in multiple dimensions, you go:
   Idot3 =: (5&$. # 4&$.) @: $.   
   Idot3 i.2 3
0 1
0 2
0 2
1 0
1 0
1 0
1 1
1 1
1 1
1 1
1 2
1 2
1 2
1 2
1 2

Ben


________________________________________
From: [email protected] 
[[email protected]] on behalf of Jon Hough 
[[email protected]]
Sent: Tuesday, October 07, 2014 06:37
To: [email protected]
Subject: [Jprogramming] Project Euler 85, Python and J

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

Reply via email to