I'm working on euler 11 from projecteuler.org.  I got the answer by doing
something really crummy, and I decided to go back and do proper code for the
diagonals.  The problem is to take the greatest product of four consecutive
numbers in a 20 by 20 array where the possibilities are rows, columns and
diagonals.

Rows and columns are trivial, and now that I understand that /. does not
only take the longest diagonal the diagonals are not much harder.

Because this is a product, I wanted to use a 1 fill.

a is a 20 by 20 array of small numbers.

My first attempt was to box the diagonals, and then fill them, the unbox
them and then do my product on the crosswise bits, and then take the max,
so

>./(,4 */\ a) ,(,4 */\ |:a) ,(,4*/\"1 > 20{.!.1 L:_1 </.a),(,4*/\"1 >
20{.!.1 L:_1 </.|:a)

I transpose the array to get the other diagonals, and do it again so that I
can do the horizontals and verticals.

I used a box for the diagonals because my thought was that they were all
different lengths, so they needed to be boxed. Once I fixed them to be
conformant, I could unbox them.

Then I looked and determined that I could get an array with the diagonals on
the lines as:

20&{. /.aa

And this gives (the small, forum appropriate version):
  5&{. /. (5 5 $i. 25)
 0  0  0  0  0
 1  5  0  0  0
 2  6 10  0  0
 3  7 11 15  0
 4  8 12 16 20
 9 13 17 21  0
14 18 22  0  0
19 23  0  0  0
24  0  0  0  0

But because it is a product, I need a 1 fill.  I am using a 1 fill with take
above, when I am taking from the lines individually.

  5&{.!.1 /. (5 5 $i. 25)
|domain error
|       5&{.!.1/.(5 5$i.25)

I could not, at first, figure out why the domain error was occuring.  Take
should fix the length of the line no matter what the length of the incoming
line.

Then I thought, suppose it is calculating a number of things to add to the
vector, and the second vector it tries to finesse the calculation, using the
same value to produce a line, and then having a domain error when that value
of pad produces an unsquare array.  What if I change the rank of the verb to
try and get it, say, not to run on all of the lines produced by /. at the
same time, but instead to run on each line?  So I tried a few different
values for the rank.

  (5&{.!.1)"_1 /. (5 5 $i. 25)
|domain error

I won't bore you by repeating this, but that theory simply didn't work. I
could not get the verb to stop reporting an error.

0+/. a builds me a zero filled array that looks exactly like 20{. .  Can't
use 1+ or a verb with a test assuming I could get it to work (usually can't,
I'm new to this) because there are zeros in the array that I think I have to
leave alone.

Maybe the real problem is that the fill is not coming from where I expect it
to come from. But I think they come from the take verb when I do 20{.
/. aand well, this is interesting:

 (#,5&{.) /. (5 5 $i. 25)
1  0  0  0  0  0
2  1  5  0  0  0
3  2  6 10  0  0
4  3  7 11 15  0
5  4  8 12 16 20
4  9 13 17 21  0
3 14 18 22  0  0
2 19 23  0  0  0
1 24  0  0  0  0


so the lines are clearly not being padded before the verb is called.

and, um-- well, I think I just don't understand things more complex, it
implies that if I can derive the length I should be able to prepend
(5-#L$1), instead of hash but I always get hung in anything complex.

Is this a bug or a feecher?  Other than boxing it, is there a way to code
it?  Am I just missing how to do it?





-- 
Of course I can ride in the carpool lane, officer.  Jesus is my constant
companion.
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to