Idot =: $ #: I.@:,    NB. the I. for higher dimensions
   NB.  there are (1/2 * N * N+1) = -: (* >:) N possibilities on a side with 
length N
   NB. and the product of two of those (*/~) should be (closest to) 18.
   Idot (= <./@:,) |18 - */~ -: (*>:) i.200   
2 3
3 2
   NB. now with two million, and multiplying the two sides:
   */"1 Idot (= <./@:,) |2e6 - */~ -: (*>:) i.200
2772 2772
________________________________________
From: [email protected] 
[[email protected]] on behalf of Tikkanz 
[[email protected]]
Sent: Tuesday, October 07, 2014 13:41
To: Programming JForum
Subject: Re: [Jprogramming] Project Euler 85, Python and J

Note that 200 x 200 is a bit of an overkill given 3x2 = 2x3
The following choses the lower triangular of a matrix of the different
sized rectangles to investigate.
getSizes=: ,@(>:/~) # [: ,/ ,"0/~
getSizes >: i. 5

Given the sides of a rectangle you can count the number of rectangles as
follows:
countRects=: 4 %~ */@(, >:)
countRects 2 3

Now get the index of the rectangle size with a count closest to 2million

idxClosest=: (i. <./)@(2e6 |@:- ])


Putting it together

*/@({~ idxClosest@:(countRects"1)) getSizes >: i.200



On Tue, Oct 7, 2014 at 5:37 PM, Jon Hough <[email protected]> wrote:

> 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

Reply via email to