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 2020 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:
Post a Comment