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

Reply via email to