Tuesday, 3 March 2009

Project Euler, Problems 11 and 30

Problem 11
In the 20×20 grid below, four numbers along a diagonal line have been marked in red.

08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48

The product of these numbers is 26 × 63 × 78 × 14 = 1788696. What is the greatest product of four adjacent numbers in any direction (up, down, left, right, or diagonally) in the 20×20 grid?

I thought for a while about whether or not I should approach this one, whether it would be something that could be done in a reasonable amount of time. I also struggled with how I could do it simply with my limited amount of C++.

Eventually I decided that the best thing to do would be to do it myself - after all, there were only 400 entries in the grid. The simple thing with this was to cross out numbers as they became irrelevant. Initially my criteria were for just plain low numbers, anything below 10. Then, as I found a sequence of four numbers which produced a higher value, z, than the previous high, it hit me that I should find the largest number x such that the cube root of z/x was greater than 99. That way, I would then be free to remove every number less than x which remained in the grid. As numbers were blanked out, opportunities to "connect four" were reduced, and new sequences became apparent. This gave a new high z, and a new x, and so on. This approach probably took around 40 minutes to give the correct answer, much less time than it would have taken for me to program something to search the grid in C++ (had I even known how to encode the grid).

Problem 30
Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits:

1634 = 1^(4) + 6^(4) + 3^(4) + 4^(4)
8208 = 8^(4) + 2^(4) + 0^(4) + 8^(4)
9474 = 9^(4) + 4^(4) + 7^(4) + 4^(4)

As 1 = 1^(4) is not a sum it is not included. The sum of these numbers is 1634 + 8208 + 9474 = 19316. Find the sum of all the numbers that can be written as the sum of fifth powers of their digits.

Following the previous problem that I solved which involved the sum of factorials of digits this was quite straightforward to solve. With a little bit of thought looking at multiples of 9^5 I was able to establish quite quickly what an upper bound would be; then I simply adapted the routine I'd used previously, and it arrived at the correct answer in next to no time.

*

Two to go!!! Maybe by the end of this week? Keep your fingers crossed.

3 comments:

Matt_Evans said...

How was the grid for 11 created?

zero_zero_one said...

I don't know how they generated it for the question actually. Maybe it was some kind of random number generation.

zero_zero_one said...

PS - I just got one more done!!! Only one more to do :)