Co-authored-by: sigonasr2 <sigonasr2@gmail.com>

This commit is contained in:
sigonasr2, Sig, Sigo 2022-07-15 14:42:02 +00:00 committed by GitHub
parent a0bc12a775
commit 1bfce91ade
5 changed files with 168 additions and 18 deletions

BIN
archives/11/current Executable file

Binary file not shown.

87
archives/11/src/main.c Normal file

@ -0,0 +1,87 @@
#include <stdio.h>
#include "utils.h"
/*
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 the same direction (up, down, left, right, or diagonally) in the 20×20 grid?
https://projecteuler.net/problem=11
*/
void checkForProduct(int*largestProd,int product) {
if (product>*largestProd) {
*largestProd=product;
printf("Largest product is now %d\n",*largestProd);
}
}
int main(int argc,char**argv) {
int GRID[]={8,2,22,97,38,15,0,40,0,75,4,5,7,78,52,12,50,77,91,8,49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48,4,56,62,0,81,49,31,73,55,79,14,29,93,71,40,67,53,88,30,3,49,13,36,65,52,70,95,23,4,60,11,42,69,24,68,56,1,32,56,71,37,2,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,3,45,2,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,2,62,12,20,95,63,94,39,63,8,40,91,66,49,94,21,24,55,58,5,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72,21,36,23,9,75,0,76,44,20,45,35,14,0,61,33,97,34,31,33,95,78,17,53,28,22,75,31,67,15,94,3,80,4,62,16,14,9,53,56,92,16,39,5,42,96,35,31,47,55,58,88,24,0,17,54,24,36,29,85,57,86,56,0,48,35,71,89,7,5,44,44,37,44,60,21,58,51,54,17,58,19,80,81,68,5,94,47,69,28,73,92,13,86,52,17,77,4,89,55,40,4,52,8,83,97,35,99,16,7,97,57,32,16,26,26,79,33,27,98,66,88,36,68,87,57,62,20,72,3,46,33,67,46,55,12,32,63,93,53,69,4,42,16,73,38,25,39,11,24,94,72,18,8,46,29,32,40,62,76,36,20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74,4,36,16,20,73,35,29,78,31,90,1,74,31,49,71,48,86,81,16,23,57,5,54,1,70,54,71,83,51,54,69,16,92,33,48,61,43,52,1,89,19,67,48,};
int largestProd=0;
for (int i=0;i<400;i++) {
int x=i%20;
int y=i/20;
//Up
if (y>=3) {
checkForProduct(&largestProd,GRID[(y-3)*20+x]*GRID[(y-2)*20+x]*GRID[(y-1)*20+x]*GRID[i]);
}
//Right
if (x<=16) {
checkForProduct(&largestProd,GRID[(y)*20+x+1]*GRID[(y)*20+x+2]*GRID[(y)*20+x+3]*GRID[i]);
}
//Left
if (x>=3) {
checkForProduct(&largestProd,GRID[(y)*20+x-1]*GRID[(y)*20+x-2]*GRID[(y)*20+x-3]*GRID[i]);
}
//Down
if (y<=16) {
checkForProduct(&largestProd,GRID[(y+1)*20+x]*GRID[(y+2)*20+x]*GRID[(y+3)*20+x]*GRID[i]);
}
//Up-Left
if (y>=3&&x>=3) {
checkForProduct(&largestProd,GRID[(y-3)*20+x-3]*GRID[(y-2)*20+x-2]*GRID[(y-1)*20+x-1]*GRID[i]);
}
//Up-Right
if (y>=3&&x<=16) {
checkForProduct(&largestProd,GRID[(y-1)*20+x+1]*GRID[(y-2)*20+x+2]*GRID[(y-3)*20+x+3]*GRID[i]);
}
//Down-Left
if (x>=3&&y<=16) {
checkForProduct(&largestProd,GRID[(y+1)*20+x-1]*GRID[(y+2)*20+x-2]*GRID[(y+3)*20+x-3]*GRID[i]);
}
//Down-Right
if (y<=16&&x<=16) {
checkForProduct(&largestProd,GRID[(y+1)*20+x+1]*GRID[(y+2)*20+x+2]*GRID[(y+3)*20+x+3]*GRID[i]);
}
}
printf("Highest product is %d",largestProd);
return 0;
}

7
archives/11/src/utils.h Normal file

@ -0,0 +1,7 @@
#define true 1
#define false 0
#define boolean char
struct String{
int length;
char*str;
};

BIN
current

Binary file not shown.

@ -2,30 +2,86 @@
#include "utils.h"
/*
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
In the 20×20 grid below, four numbers along a diagonal line have been marked in red.
Find the sum of all the primes below two million.
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
https://projecteuler.net/problem=10
The product of these numbers is 26 × 63 × 78 × 14 = 1788696.
What is the greatest product of four adjacent numbers in the same direction (up, down, left, right, or diagonally) in the 20×20 grid?
https://projecteuler.net/problem=11
*/
void checkForProduct(int*largestProd,int product) {
if (product>*largestProd) {
*largestProd=product;
printf("Largest product is now %d\n",*largestProd);
}
}
int main(int argc,char**argv) {
FILE*f=fopen("archives/primegenerator/primes","r");
long sum=0;
int ch=' ';
while ((ch=fgetc(f))!='{');
while (true) {
int digit=0;
while ((ch=fgetc(f))!=',') {
digit*=10;
digit+=ch-'0';
int GRID[]={8,2,22,97,38,15,0,40,0,75,4,5,7,78,52,12,50,77,91,8,49,49,99,40,17,81,18,57,60,87,17,40,98,43,69,48,4,56,62,0,81,49,31,73,55,79,14,29,93,71,40,67,53,88,30,3,49,13,36,65,52,70,95,23,4,60,11,42,69,24,68,56,1,32,56,71,37,2,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,3,45,2,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,2,62,12,20,95,63,94,39,63,8,40,91,66,49,94,21,24,55,58,5,66,73,99,26,97,17,78,78,96,83,14,88,34,89,63,72,21,36,23,9,75,0,76,44,20,45,35,14,0,61,33,97,34,31,33,95,78,17,53,28,22,75,31,67,15,94,3,80,4,62,16,14,9,53,56,92,16,39,5,42,96,35,31,47,55,58,88,24,0,17,54,24,36,29,85,57,86,56,0,48,35,71,89,7,5,44,44,37,44,60,21,58,51,54,17,58,19,80,81,68,5,94,47,69,28,73,92,13,86,52,17,77,4,89,55,40,4,52,8,83,97,35,99,16,7,97,57,32,16,26,26,79,33,27,98,66,88,36,68,87,57,62,20,72,3,46,33,67,46,55,12,32,63,93,53,69,4,42,16,73,38,25,39,11,24,94,72,18,8,46,29,32,40,62,76,36,20,69,36,41,72,30,23,88,34,62,99,69,82,67,59,85,74,4,36,16,20,73,35,29,78,31,90,1,74,31,49,71,48,86,81,16,23,57,5,54,1,70,54,71,83,51,54,69,16,92,33,48,61,43,52,1,89,19,67,48,};
int largestProd=0;
for (int i=0;i<400;i++) {
int x=i%20;
int y=i/20;
//Up
if (y>=3) {
checkForProduct(&largestProd,GRID[(y-3)*20+x]*GRID[(y-2)*20+x]*GRID[(y-1)*20+x]*GRID[i]);
}
if (digit>=2000000) {
break;
} else {
sum+=digit;
//Right
if (x<=16) {
checkForProduct(&largestProd,GRID[(y)*20+x+1]*GRID[(y)*20+x+2]*GRID[(y)*20+x+3]*GRID[i]);
}
//Left
if (x>=3) {
checkForProduct(&largestProd,GRID[(y)*20+x-1]*GRID[(y)*20+x-2]*GRID[(y)*20+x-3]*GRID[i]);
}
//Down
if (y<=16) {
checkForProduct(&largestProd,GRID[(y+1)*20+x]*GRID[(y+2)*20+x]*GRID[(y+3)*20+x]*GRID[i]);
}
//Up-Left
if (y>=3&&x>=3) {
checkForProduct(&largestProd,GRID[(y-3)*20+x-3]*GRID[(y-2)*20+x-2]*GRID[(y-1)*20+x-1]*GRID[i]);
}
//Up-Right
if (y>=3&&x<=16) {
checkForProduct(&largestProd,GRID[(y-1)*20+x+1]*GRID[(y-2)*20+x+2]*GRID[(y-3)*20+x+3]*GRID[i]);
}
//Down-Left
if (x>=3&&y<=16) {
checkForProduct(&largestProd,GRID[(y+1)*20+x-1]*GRID[(y+2)*20+x-2]*GRID[(y+3)*20+x-3]*GRID[i]);
}
//Down-Right
if (y<=16&&x<=16) {
checkForProduct(&largestProd,GRID[(y+1)*20+x+1]*GRID[(y+2)*20+x+2]*GRID[(y+3)*20+x+3]*GRID[i]);
}
}
fclose(f);
printf("\n\nThe sum of all primes below 2000000 is %ld",sum);
printf("Highest product is %d",largestProd);
return 0;
}