This (2!>:) version seems more straightforward, especially if accompanied by a comment pointing out that you're looking for the number of combinations (*/) of all pairs of lines (2!) and the number of lines is one more than each dimension (>:) because they delineate the boundaries of the cells. It seems like this also extends to higher dimensions, so CountRects 2 2 2 27 gives the number of rectangular solids that could be formed within a 2x2x2 cube.
To make the initial version of "countRects" extend this way, you'd have to modify it by replacing the hard-coded "4" with (2^#y), i.e. countRects=: (2 ^ #) %~ [: */ ] , >: On Tue, Oct 7, 2014 at 8:19 PM, Tikkanz <tikk...@gmail.com> wrote: > Here is another version of countRects > countRects=: */@(2 ! >:) > > On Wed, Oct 8, 2014 at 9:07 AM, Tikkanz <tikk...@gmail.com> wrote: > > > Sorry, yes that is a leap. > > (x * (x + 1)) * 0.5 is the number of ways to choose two horizontal lines > > to make 2 sides of the rectangle. > > (y * (y + 1)) * 0.5 is the number of ways to choose two vertical lines to > > make the other 2 sides of the rectangle > > ((x * (x + 1)) * 0.5) * ((y * (y + 1)) * 0.5) is the number of ways to > > choose the lines to make a rectangle > > refactoring: > > 4 %~ x * (x+1) * y * (y+1) > > 4 %~ */ x,(x+1),y,(y+1) > > 4 %~ */ x,y,(x+1),(y+1) > > 4 %~ */ (, >:) x,y > > > > HTH > > > > On Wed, Oct 8, 2014 at 4:30 AM, Devon McCormick <devon...@gmail.com> > > wrote: > > > >> Hi - > >> > >> "countRects" seems like a bit of a leap. I think I understand "4 %~" > >> because you're overcounting by 4 rotations, but I don't comprehend the > >> magic behind "*/@(,>:)". > >> > >> I see that "(,>:)" concatenates the shape to its increment, e.g. 2 3 3 4 > >> for the input 2 3, but what's the rationale behind this? > >> > >> Thanks, > >> > >> Devon > >> > >> On Tue, Oct 7, 2014 at 7:41 AM, Tikkanz <tikk...@gmail.com> wrote: > >> > >> > 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 <jgho...@outlook.com> > 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 > >> > > >> > >> > >> > >> -- > >> 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 > -- Devon McCormick, CFA ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm