diff --git a/archives/15/src/main.c.disabled b/archives/15/src/main.c.disabled index eece796..ee76bd8 100644 --- a/archives/15/src/main.c.disabled +++ b/archives/15/src/main.c.disabled @@ -7,7 +7,7 @@ How many such routes are there through a 20×20 grid? - https://projecteuler.net/problem=14 + https://projecteuler.net/problem=15 */ void move(int x,int y,long*pathCount) { diff --git a/archives/15/src/threadedmain.c b/archives/15/src/threadedmain.c index c2e931b..043d577 100644 --- a/archives/15/src/threadedmain.c +++ b/archives/15/src/threadedmain.c @@ -7,7 +7,7 @@ How many such routes are there through a 20×20 grid? - https://projecteuler.net/problem=14 + https://projecteuler.net/problem=15 */ void move(int x,int y,long*pathCount) { diff --git a/archives/18/current b/archives/18/current new file mode 100755 index 0000000..1a1d3c4 Binary files /dev/null and b/archives/18/current differ diff --git a/archives/18/src/main.c b/archives/18/src/main.c new file mode 100644 index 0000000..57370fc --- /dev/null +++ b/archives/18/src/main.c @@ -0,0 +1,76 @@ +#include +#include "utils.h" + +#define TARGET 2 + +/* + By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23. + +3 +7 4 +2 4 6 +8 5 9 3 + +That is, 3 + 7 + 4 + 9 = 23. + +Find the maximum total from top to bottom of the triangle below: + +75 +95 64 +17 47 82 +18 35 87 10 +20 04 82 47 65 +19 01 23 75 03 34 +88 02 77 73 07 63 67 +99 65 04 28 06 16 70 92 +41 41 26 56 83 40 80 70 33 +41 48 72 33 47 32 37 16 94 29 +53 71 44 65 25 43 91 52 97 51 14 +70 11 33 28 77 73 17 78 39 68 17 57 +91 71 52 38 17 14 91 43 58 50 27 29 48 +63 66 04 68 89 53 67 30 73 16 69 87 40 31 +04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 + +NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o) + https://projecteuler.net/problem=18 +*/ + +int main(int argc,char**argv) { + int rows[][15] = { + {75} + ,{95,64} + ,{17,47,82} + ,{18,35,87,10} + ,{20,4,82,47,65} + ,{19,1,23,75,3,34} + ,{88,2,77,73,7,63,67} + ,{99,65,4,28,6,16,70,92} + ,{41,41,26,56,83,40,80,70,33} + ,{41,48,72,33,47,32,37,16,94,29} + ,{53,71,44,65,25,43,91,52,97,51,14} + ,{70,11,33,28,77,73,17,78,39,68,17,57} + ,{91,71,52,38,17,14,91,43,58,50,27,29,48} + ,{63,66,4,68,89,53,67,30,73,16,69,87,40,31} + ,{4,62,98,27,23,9,70,98,73,93,38,53,60,4,23}}; + + int max=14; + for (int row=14;row>0;row--) { + for (int col=0;colnumb2)?numb1:numb2; + } + max--; + } + for (int i=0;i<15;i++) { + for (int j=0;j<15;j++) { + printf("%d\t",rows[i][j]); + } + printf("\n"); + } + + printf("\nYour maximum route is %d",rows[0][0]); + + return 0; +} \ No newline at end of file diff --git a/archives/18/src/utils.c b/archives/18/src/utils.c new file mode 100644 index 0000000..bd5f32c --- /dev/null +++ b/archives/18/src/utils.c @@ -0,0 +1,54 @@ +#include "utils.h" +#include +#include + +struct String add(struct String numb1, struct String numb2){ + byte carryover=0; + int digitCount=0; + char*str = malloc(0); + if (numb1.length>=numb2.length) { + for (int offset=0;offsetoffset) { + //printf("%c %c\n",numb1.str[numb1.length-offset-1],numb2.str[numb2.length-offset-1]); + int sum=((numb1.str[numb1.length-offset-1]-'0')+(numb2.str[numb2.length-offset-1]-'0'))+((carryover>0)?carryover--:0); + if (sum>=10) { + carryover=1; + sum-=10; + } + str[offset]=sum+'0'; + } else { + str[offset]=numb1.str[numb1.length-offset-1]; + } + } + } else { + for (int offset=0;offsetoffset) { + //printf("%c %c\n",numb1.str[numb1.length-offset-1],numb2.str[numb2.length-offset-1]); + int sum=((numb1.str[numb1.length-offset-1]-'0')+(numb2.str[numb2.length-offset-1]-'0'))+((carryover>0)?carryover--:0); + if (sum>=10) { + carryover=1; + sum-=10; + } + str[offset]=sum+'0'; + } else { + str[offset]=numb2.str[numb2.length-offset-1]; + } + } + } + if (carryover>0) { + str = realloc(str,++digitCount); + str[digitCount-1]='1'; + } + for (int i=0;i #include "utils.h" +#define TARGET 2 + /* - If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total. + By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23. + +3 +7 4 +2 4 6 +8 5 9 3 - If all the numbers from 1 to 1000 (one thousand) inclusive were written out in words, how many letters would be used? +That is, 3 + 7 + 4 + 9 = 23. +Find the maximum total from top to bottom of the triangle below: - NOTE: Do not count spaces or hyphens. For example, 342 (three hundred and forty-two) contains 23 letters and 115 (one hundred and fifteen) contains 20 letters. The use of "and" when writing out numbers is in compliance with British usage. +75 +95 64 +17 47 82 +18 35 87 10 +20 04 82 47 65 +19 01 23 75 03 34 +88 02 77 73 07 63 67 +99 65 04 28 06 16 70 92 +41 41 26 56 83 40 80 70 33 +41 48 72 33 47 32 37 16 94 29 +53 71 44 65 25 43 91 52 97 51 14 +70 11 33 28 77 73 17 78 39 68 17 57 +91 71 52 38 17 14 91 43 58 50 27 29 48 +63 66 04 68 89 53 67 30 73 16 69 87 40 31 +04 62 98 27 23 09 70 98 73 93 38 53 60 04 23 - https://projecteuler.net/problem=17 +NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o) + https://projecteuler.net/problem=18 */ int main(int argc,char**argv) { - int totalCount=0; - int counter=1; - int i=1; - int hundredsDigit=-1; - int tensDigit=-1; - while (i<=1000) { - hundredsDigit=-1; - tensDigit=-1; - counter=i; - int currentCount=totalCount; - if (counter==1000) { - //onethousand (11) - totalCount+=11; - counter-=1000; - printf("onethousand"); - } - if (counter>=100) { - hundredsDigit=counter/100; - switch (hundredsDigit) { - case 1: - case 2: - case 6:{ - //onehundred (10) - totalCount+=10; - printf("%s",hundredsDigit==1?"one":hundredsDigit==2?"two":"six"); - }break; - case 3: - case 7: - case 8:{ - //threehundred (12) - totalCount+=12; - printf("%s",hundredsDigit==3?"three":hundredsDigit==7?"seven":"eight"); - }break; - case 4: - case 5: - case 9:{ - //fourhundred (11) - totalCount+=11; - printf("%s",hundredsDigit==4?"four":hundredsDigit==5?"five":"nine"); - }break; - } - printf("hundred"); - counter-=hundredsDigit*100; - } - if (counter>=10) { - tensDigit=counter/10; - if (tensDigit!=0) { - if (hundredsDigit!=-1) { - //and (3) - totalCount+=3; - printf("and"); - } - if (counter<20) { - switch (counter) { - case 10:{ - //ten (3) - totalCount+=3; - printf("ten"); - }break; - case 11:{ - //eleven (6) - totalCount+=6; - printf("eleven"); - }break; - case 12:{ - //twelve (5) - totalCount+=5; - printf("twelve"); - }break; - case 13: - case 14: - case 19:{ - //thirteen (8) - totalCount+=8; - printf("%s",counter==13?"thirteen":counter==14?"fourteen":"nineteen"); - }break; - case 15: - case 16:{ - //fifteen (7) - totalCount+=7; - printf("%s",counter==15?"fifteen":"sixteen"); - }break; - case 17: - case 18:{ - //seventeen (9) - totalCount+=9; - printf("%s",counter==17?"seventeen":"eighteen"); - }break; - } - counter=0; - } else { - switch (tensDigit) { - case 2: - case 3: - case 8: - case 9:{ - //twenty (6) - totalCount+=6; - printf("%s",tensDigit==2?"twenty":tensDigit==3?"thirty":tensDigit==8?"eighty":"ninety"); - }break; - case 4: - case 5: - case 6:{ - //forty (5) - totalCount+=5; - printf("%s",tensDigit==4?"forty":tensDigit==5?"fifty":"sixty"); - }break; - case 7:{ - //seventy (7) - totalCount+=7; - printf("seventy"); - }break; - } - counter-=tensDigit*10; - } - } + int rows[][15] = { + {75} + ,{95,64} + ,{17,47,82} + ,{18,35,87,10} + ,{20,4,82,47,65} + ,{19,1,23,75,3,34} + ,{88,2,77,73,7,63,67} + ,{99,65,4,28,6,16,70,92} + ,{41,41,26,56,83,40,80,70,33} + ,{41,48,72,33,47,32,37,16,94,29} + ,{53,71,44,65,25,43,91,52,97,51,14} + ,{70,11,33,28,77,73,17,78,39,68,17,57} + ,{91,71,52,38,17,14,91,43,58,50,27,29,48} + ,{63,66,4,68,89,53,67,30,73,16,69,87,40,31} + ,{4,62,98,27,23,9,70,98,73,93,38,53,60,4,23}}; + + int max=14; + for (int row=14;row>0;row--) { + for (int col=0;colnumb2)?numb1:numb2; } - if (counter>0) { - if (tensDigit==-1&&hundredsDigit!=-1) { - //and (3) - totalCount+=3; - printf("and"); - } - switch (counter) { - case 1: - case 2: - case 6:{ - //one (3) - totalCount+=3; - printf("%s",counter==1?"one":counter==2?"two":"six"); - }break; - case 3: - case 7: - case 8:{ - //three (5) - totalCount+=5; - printf("%s",counter==3?"three":counter==7?"seven":"eight"); - }break; - case 4: - case 5: - case 9:{ - //four (4) - totalCount+=4; - printf("%s",counter==4?"four":counter==5?"five":"nine"); - }break; - } + max--; + } + for (int i=0;i<15;i++) { + for (int j=0;j<15;j++) { + printf("%d\t",rows[i][j]); } - printf(" %d:%d\n",i,totalCount-currentCount); - i++; + printf("\n"); } - printf("%d",totalCount); + + printf("\nYour maximum route is %d",rows[0][0]); + return 0; } \ No newline at end of file