Skip to content

Commit e62eae9

Browse files
committed
11 to 15
1 parent fb570ff commit e62eae9

File tree

10 files changed

+526
-0
lines changed

10 files changed

+526
-0
lines changed

project_euler/problem_11/problem11.go

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/**
2+
* Problem 11 - Largest product in a grid
3+
* @see {@link https://projecteuler.net/problem=11}
4+
*
5+
* In the 20×20 grid below, four numbers along a diagonal line have been marked in red.
6+
*
7+
* The product of these numbers is 26 × 63 × 78 × 14 = 1788696.
8+
*
9+
* What is the greatest product of four adjacent numbers in the same direction
10+
* (up, down, left, right, or diagonally) in the 20×20 grid?
11+
*
12+
* @author ddaniel27
13+
*/
14+
package problem11
15+
16+
var grid = [20][20]uint{
17+
{8, 2, 22, 97, 38, 15, 0, 40, 0, 75, 4, 5, 7, 78, 52, 12, 50, 77, 91, 8},
18+
{49, 49, 99, 40, 17, 81, 18, 57, 60, 87, 17, 40, 98, 43, 69, 48, 4, 56, 62, 0},
19+
{81, 49, 31, 73, 55, 79, 14, 29, 93, 71, 40, 67, 53, 88, 30, 3, 49, 13, 36, 65},
20+
{52, 70, 95, 23, 4, 60, 11, 42, 69, 24, 68, 56, 1, 32, 56, 71, 37, 2, 36, 91},
21+
{22, 31, 16, 71, 51, 67, 63, 89, 41, 92, 36, 54, 22, 40, 40, 28, 66, 33, 13, 80},
22+
{24, 47, 32, 60, 99, 3, 45, 2, 44, 75, 33, 53, 78, 36, 84, 20, 35, 17, 12, 50},
23+
{32, 98, 81, 28, 64, 23, 67, 10, 26, 38, 40, 67, 59, 54, 70, 66, 18, 38, 64, 70},
24+
{67, 26, 20, 68, 2, 62, 12, 20, 95, 63, 94, 39, 63, 8, 40, 91, 66, 49, 94, 21},
25+
{24, 55, 58, 5, 66, 73, 99, 26, 97, 17, 78, 78, 96, 83, 14, 88, 34, 89, 63, 72},
26+
{21, 36, 23, 9, 75, 0, 76, 44, 20, 45, 35, 14, 0, 61, 33, 97, 34, 31, 33, 95},
27+
{78, 17, 53, 28, 22, 75, 31, 67, 15, 94, 3, 80, 4, 62, 16, 14, 9, 53, 56, 92},
28+
{16, 39, 5, 42, 96, 35, 31, 47, 55, 58, 88, 24, 0, 17, 54, 24, 36, 29, 85, 57},
29+
{86, 56, 0, 48, 35, 71, 89, 7, 5, 44, 44, 37, 44, 60, 21, 58, 51, 54, 17, 58},
30+
{19, 80, 81, 68, 5, 94, 47, 69, 28, 73, 92, 13, 86, 52, 17, 77, 4, 89, 55, 40},
31+
{4, 52, 8, 83, 97, 35, 99, 16, 7, 97, 57, 32, 16, 26, 26, 79, 33, 27, 98, 66},
32+
{88, 36, 68, 87, 57, 62, 20, 72, 3, 46, 33, 67, 46, 55, 12, 32, 63, 93, 53, 69},
33+
{4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 8, 46, 29, 32, 40, 62, 76, 36},
34+
{20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 4, 36, 16},
35+
{20, 73, 35, 29, 78, 31, 90, 1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 5, 54},
36+
{1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1, 89, 19, 67, 48},
37+
}
38+
39+
func Problem11() uint {
40+
max := uint(0)
41+
42+
for i := 0; i < 20; i++ {
43+
for j := 0; j < 20; j++ {
44+
45+
// Vertical
46+
if i+3 < 20 {
47+
product := grid[i][j] * grid[i+1][j] * grid[i+2][j] * grid[i+3][j]
48+
if product > max {
49+
max = product
50+
}
51+
}
52+
53+
// Horizontal
54+
if j+3 < 20 {
55+
product := grid[i][j] * grid[i][j+1] * grid[i][j+2] * grid[i][j+3]
56+
if product > max {
57+
max = product
58+
}
59+
}
60+
61+
if i+3 < 20 && j+3 < 20 {
62+
// Diagonal
63+
product := grid[i][j] * grid[i+1][j+1] * grid[i+2][j+2] * grid[i+3][j+3]
64+
if product > max {
65+
max = product
66+
}
67+
}
68+
69+
if i+3 < 20 && j-3 >= 0 {
70+
// Diagonal
71+
product := grid[i][j] * grid[i+1][j-1] * grid[i+2][j-2] * grid[i+3][j-3]
72+
if product > max {
73+
max = product
74+
}
75+
}
76+
}
77+
}
78+
79+
return max
80+
}
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package problem11
2+
3+
import "testing"
4+
5+
// Tests
6+
func TestProblem11_Func(t *testing.T) {
7+
testCases := []struct {
8+
name string
9+
expected uint
10+
}{
11+
{"Test Case 1", 70600674},
12+
}
13+
14+
for _, tc := range testCases {
15+
t.Run(tc.name, func(t *testing.T) {
16+
actual := Problem11()
17+
if actual != tc.expected {
18+
t.Errorf("Expected: %v, but got %v", tc.expected, actual)
19+
}
20+
})
21+
}
22+
}
23+
24+
// Benchmark
25+
func BenchmarkProblem11_Func(b *testing.B) {
26+
for i := 0; i < b.N; i++ {
27+
Problem11()
28+
}
29+
}

project_euler/problem_12/problem12.go

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* Problem 12 - Highly divisible triangular number
3+
* @see {@link https://projecteuler.net/problem=12}
4+
*
5+
* The sequence of triangle numbers is generated by adding the natural numbers.
6+
* So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28.
7+
* The first ten terms would be:
8+
*
9+
* 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
10+
*
11+
* Let us list the factors of the first seven triangle numbers:
12+
*
13+
* 1: 1
14+
* 3: 1,3
15+
* 6: 1,2,3,6
16+
* 10: 1,2,5,10
17+
* 15: 1,3,5,15
18+
* 21: 1,3,7,21
19+
* 28: 1,2,4,7,14,28
20+
*
21+
* We can see that 28 is the first triangle number to have over five divisors.
22+
* What is the value of the first triangle number to have over five hundred divisors?
23+
*
24+
* @author ddaniel27
25+
*/
26+
package problem12
27+
28+
func Problem12(limit uint) uint {
29+
triangle := uint(0)
30+
for i := uint(1); ; i++ {
31+
triangle += i
32+
if numDivisors(triangle) >= limit {
33+
return triangle
34+
}
35+
}
36+
}
37+
38+
func numDivisors(n uint) uint {
39+
divisors := uint(0)
40+
for i := uint(1); i*i <= n; i++ {
41+
if n%i == 0 {
42+
divisors += 2
43+
}
44+
}
45+
return divisors
46+
}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package problem12
2+
3+
import "testing"
4+
5+
func TestProblem12_Func(t *testing.T) {
6+
tests := []struct {
7+
name string
8+
input uint
9+
want uint
10+
}{
11+
{"Test Case 1", 6, 28},
12+
{"Test Case 2", 7, 36},
13+
{"Test Case 3", 11, 120},
14+
{"Test Case 4", 500, 76576500},
15+
}
16+
17+
for _, tt := range tests {
18+
t.Run(tt.name, func(t *testing.T) {
19+
actual := Problem12(tt.input)
20+
if actual != tt.want {
21+
t.Errorf("Expected: %v, but got %v", tt.want, actual)
22+
}
23+
})
24+
}
25+
}
26+
27+
func BenchmarkProblem12_Func(b *testing.B) {
28+
for i := 0; i < b.N; i++ {
29+
Problem12(500)
30+
}
31+
}

project_euler/problem_13/problem13.go

+150
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
/**
2+
* Problem 13 - Large sum
3+
* @see {@link https://projecteuler.net/problem=13}
4+
*
5+
* Work out the first ten digits of the sum of the following one-hundred 50-digit numbers.
6+
*
7+
* @author ddaniel27
8+
*/
9+
package problem13
10+
11+
var numbers = [100]string{
12+
"37107287533902102798797998220837590246510135740250",
13+
"46376937677490009712648124896970078050417018260538",
14+
"74324986199524741059474233309513058123726617309629",
15+
"91942213363574161572522430563301811072406154908250",
16+
"23067588207539346171171980310421047513778063246676",
17+
"89261670696623633820136378418383684178734361726757",
18+
"28112879812849979408065481931592621691275889832738",
19+
"44274228917432520321923589422876796487670272189318",
20+
"47451445736001306439091167216856844588711603153276",
21+
"70386486105843025439939619828917593665686757934951",
22+
"62176457141856560629502157223196586755079324193331",
23+
"64906352462741904929101432445813822663347944758178",
24+
"92575867718337217661963751590579239728245598838407",
25+
"58203565325359399008402633568948830189458628227828",
26+
"80181199384826282014278194139940567587151170094390",
27+
"35398664372827112653829987240784473053190104293586",
28+
"86515506006295864861532075273371959191420517255829",
29+
"71693888707715466499115593487603532921714970056938",
30+
"54370070576826684624621495650076471787294438377604",
31+
"53282654108756828443191190634694037855217779295145",
32+
"36123272525000296071075082563815656710885258350721",
33+
"45876576172410976447339110607218265236877223636045",
34+
"17423706905851860660448207621209813287860733969412",
35+
"81142660418086830619328460811191061556940512689692",
36+
"51934325451728388641918047049293215058642563049483",
37+
"62467221648435076201727918039944693004732956340691",
38+
"15732444386908125794514089057706229429197107928209",
39+
"55037687525678773091862540744969844508330393682126",
40+
"18336384825330154686196124348767681297534375946515",
41+
"80386287592878490201521685554828717201219257766954",
42+
"78182833757993103614740356856449095527097864797581",
43+
"16726320100436897842553539920931837441497806860984",
44+
"48403098129077791799088218795327364475675590848030",
45+
"87086987551392711854517078544161852424320693150332",
46+
"59959406895756536782107074926966537676326235447210",
47+
"69793950679652694742597709739166693763042633987085",
48+
"41052684708299085211399427365734116182760315001271",
49+
"65378607361501080857009149939512557028198746004375",
50+
"35829035317434717326932123578154982629742552737307",
51+
"94953759765105305946966067683156574377167401875275",
52+
"88902802571733229619176668713819931811048770190271",
53+
"25267680276078003013678680992525463401061632866526",
54+
"36270218540497705585629946580636237993140746255962",
55+
"24074486908231174977792365466257246923322810917141",
56+
"91430288197103288597806669760892938638285025333403",
57+
"34413065578016127815921815005561868836468420090470",
58+
"23053081172816430487623791969842487255036638784583",
59+
"11487696932154902810424020138335124462181441773470",
60+
"63783299490636259666498587618221225225512486764533",
61+
"67720186971698544312419572409913959008952310058822",
62+
"95548255300263520781532296796249481641953868218774",
63+
"76085327132285723110424803456124867697064507995236",
64+
"37774242535411291684276865538926205024910326572967",
65+
"23701913275725675285653248258265463092207058596522",
66+
"29798860272258331913126375147341994889534765745501",
67+
"18495701454879288984856827726077713721403798879715",
68+
"38298203783031473527721580348144513491373226651381",
69+
"34829543829199918180278916522431027392251122869539",
70+
"40957953066405232632538044100059654939159879593635",
71+
"29746152185502371307642255121183693803580388584903",
72+
"41698116222072977186158236678424689157993532961922",
73+
"62467957194401269043877107275048102390895523597457",
74+
"23189706772547915061505504953922979530901129967519",
75+
"86188088225875314529584099251203829009407770775672",
76+
"11306739708304724483816533873502340845647058077308",
77+
"82959174767140363198008187129011875491310547126581",
78+
"97623331044818386269515456334926366572897563400500",
79+
"42846280183517070527831839425882145521227251250327",
80+
"55121603546981200581762165212827652751691296897789",
81+
"32238195734329339946437501907836945765883352399886",
82+
"75506164965184775180738168837861091527357929701337",
83+
"62177842752192623401942399639168044983993173312731",
84+
"32924185707147349566916674687634660915035914677504",
85+
"99518671430235219628894890102423325116913619626622",
86+
"73267460800591547471830798392868535206946944540724",
87+
"76841822524674417161514036427982273348055556214818",
88+
"97142617910342598647204516893989422179826088076852",
89+
"87783646182799346313767754307809363333018982642090",
90+
"10848802521674670883215120185883543223812876952786",
91+
"71329612474782464538636993009049310363619763878039",
92+
"62184073572399794223406235393808339651327408011116",
93+
"66627891981488087797941876876144230030984490851411",
94+
"60661826293682836764744779239180335110989069790714",
95+
"85786944089552990653640447425576083659976645795096",
96+
"66024396409905389607120198219976047599490197230297",
97+
"64913982680032973156037120041377903785566085089252",
98+
"16730939319872750275468906903707539413042652315011",
99+
"94809377245048795150954100921645863754710598436791",
100+
"78639167021187492431995700641917969777599028300699",
101+
"15368713711936614952811305876380278410754449733078",
102+
"40789923115535562561142322423255033685442488917353",
103+
"44889911501440648020369068063960672322193204149535",
104+
"41503128880339536053299340368006977710650566631954",
105+
"81234880673210146739058568557934581403627822703280",
106+
"82616570773948327592232845941706525094512325230608",
107+
"22918802058777319719839450180888072429661980811197",
108+
"77158542502016545090413245809786882778948721859617",
109+
"72107838435069186155435662884062257473692284509516",
110+
"20849603980134001723930671666823555245252804609722",
111+
"53503534226472524250874054075591789781264330331690",
112+
}
113+
114+
func Problem13() string {
115+
sum := "0"
116+
117+
for _, n := range numbers {
118+
sum = add(sum, n)
119+
}
120+
121+
return sum[:10]
122+
}
123+
124+
func add(a, b string) string {
125+
if len(a) < len(b) {
126+
a, b = b, a
127+
}
128+
129+
carry := 0
130+
sum := make([]byte, len(a)+1)
131+
132+
for i := 0; i < len(a); i++ {
133+
d := int(a[len(a)-1-i] - '0')
134+
if i < len(b) {
135+
d += int(b[len(b)-1-i] - '0')
136+
}
137+
d += carry
138+
139+
sum[len(sum)-1-i] = byte(d%10) + '0'
140+
carry = d / 10
141+
}
142+
143+
if carry > 0 {
144+
sum[0] = byte(carry) + '0'
145+
} else {
146+
sum = sum[1:]
147+
}
148+
149+
return string(sum)
150+
}
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package problem13
2+
3+
import "testing"
4+
5+
func TestProblem13_Func(t *testing.T) {
6+
tests := []struct {
7+
name string
8+
expected string
9+
}{
10+
{"Test Case 1", "5537376230"},
11+
}
12+
13+
for _, tt := range tests {
14+
t.Run(tt.name, func(t *testing.T) {
15+
actual := Problem13()
16+
if actual != tt.expected {
17+
t.Errorf("Expected: %v, but got %v", tt.expected, actual)
18+
}
19+
})
20+
}
21+
}
22+
23+
func BenchmarkProblem13_Func(b *testing.B) {
24+
for i := 0; i < b.N; i++ {
25+
Problem13()
26+
}
27+
}

0 commit comments

Comments
 (0)