Search This Blog

Sunday, December 12, 2010

Euler 11

There's a cool website full of maths and programming challenges.. which I've started working through.. Dave told me about it.. and suggested documenting the solutions.. so here it goes.. I've done the previous 11 but not saved the code.. but from now on I'll document it here.

This is the solution to problem 11...

http://projecteuler.net/index.php?section=problems&id=11

 

In the 20x20 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?

 

 

___________

 

static void Main(string[] args)
        {
            string[] a = new string[20];
           string[,] aa = new string[20,20];

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

int max=0;
int r = 0;
//set up - split up
foreach (string c in a)
{
     for (int n=0;n<20;n++)
     {
        aa[r,n]=c.Split(' ')[n];
     }
     r++;
}
//horiz
for (int x=0;x<16;x++)
{
    for (int y = 0; y < 20; y++)
    {
        int tot = Convert.ToInt16(aa[x,y]) *Convert.ToInt16(aa[x + 1,y])*Convert.ToInt16( aa[x + 2,y]) *Convert.ToInt16( aa[x + 3,y]);
        if (tot>max) {max=tot;}

    }
}

//vert
for (int x = 0; x < 20; x++)
{
    for (int y = 0; y < 16; y++)
    {
        int tot = Convert.ToInt16(aa[x, y]) * Convert.ToInt16(aa[x, y + 1]) * Convert.ToInt16(aa[x, y + 2]) *Convert.ToInt16( aa[x, y + 3]);
        if (tot > max) { max = tot; }

    }
}

//diag tl - br
//vert
for (int x = 0; x < 16; x++)
{
    for (int y = 0; y < 16; y++)
    {
        int tot = Convert.ToInt16(aa[x, y]) * Convert.ToInt16(aa[x + 1, y + 1]) * Convert.ToInt16(aa[x + 2, y + 2]) * Convert.ToInt16(aa[x + 3, y + 3]);
        if (tot > max) { max = tot; }

    }
}          

//diag tl - br
//vert
for (int x = 0; x < 16; x++)
{
    for (int y = 0; y < 16; y++)
    {
        int tot = Convert.ToInt16(aa[x + 3, y]) * Convert.ToInt16(aa[x + 2, y + 1]) * Convert.ToInt16(aa[x + 1, y + 2]) * Convert.ToInt16(aa[x, y + 3]);
        if (tot > max) { max = tot; }

    }
}

Console.WriteLine(max);

         //   Console.WriteLine(max);

            Console.ReadLine();

        }

No comments: