Skip to content

Commit 6d6b06e

Browse files
authored
Project Euler: First Twenty solutions (#771)
* Project Euler: First Ten solutions * 11 to 15 * 16 to 20
1 parent 137d820 commit 6d6b06e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+2121
-0
lines changed

project_euler/problem_1/problem1.go

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* Problem 1 - Multiples of 3 and 5
3+
*
4+
* @see {@link https://projecteuler.net/problem=1}
5+
*
6+
* If we list all the natural numbers below 10 that are multiples of 3 or 5,
7+
* we get 3, 5, 6 and 9. The sum of these multiples is 23.
8+
* Find the sum of all the multiples of 3 or 5 below 1000.
9+
*
10+
* @author ddaniel27
11+
*/
12+
package problem1
13+
14+
func Problem1(n uint) uint {
15+
sum := uint(0)
16+
17+
for i := uint(1); i < n; i++ {
18+
if i%3 == 0 || i%5 == 0 {
19+
sum += i
20+
}
21+
}
22+
23+
return sum
24+
}
+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package problem1
2+
3+
import "testing"
4+
5+
// Tests
6+
func TestProblem1_Func(t *testing.T) {
7+
tests := []struct {
8+
name string
9+
threshold uint
10+
want uint
11+
}{
12+
{
13+
name: "Testcase 1 - threshold 10",
14+
threshold: 10,
15+
want: 23,
16+
},
17+
{
18+
name: "Testcase 2 - threshold 100",
19+
threshold: 100,
20+
want: 2318,
21+
},
22+
{
23+
name: "Testcase 3 - threshold 1000",
24+
threshold: 1000,
25+
want: 233168,
26+
},
27+
}
28+
29+
for _, tt := range tests {
30+
t.Run(tt.name, func(t *testing.T) {
31+
n := Problem1(tt.threshold)
32+
33+
if n != tt.want {
34+
t.Errorf("Problem1() = %v, want %v", n, tt.want)
35+
}
36+
})
37+
}
38+
}
39+
40+
// Benchmarks
41+
func BenchmarkProblem1(b *testing.B) {
42+
for i := 0; i < b.N; i++ {
43+
_ = Problem1(1000)
44+
}
45+
}

project_euler/problem_10/problem10.go

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* Problem 10 - Summation of primes
3+
* @see {@link https://projecteuler.net/problem=10}
4+
*
5+
* The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
6+
* Find the sum of all the primes below two million.
7+
*
8+
* @author ddaniel27
9+
*/
10+
package problem10
11+
12+
import "github.com/TheAlgorithms/Go/math/prime"
13+
14+
func Problem10(n int) uint {
15+
sum := uint(0)
16+
sieve := prime.SieveEratosthenes(n)
17+
18+
for _, v := range sieve {
19+
sum += uint(v)
20+
}
21+
22+
return sum
23+
}
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package problem10
2+
3+
import "testing"
4+
5+
// Tests
6+
func TestProblem10_Func(t *testing.T) {
7+
tests := []struct {
8+
name string
9+
input int
10+
want uint
11+
}{
12+
{
13+
name: "Testcase 1 - input 10",
14+
input: 10,
15+
want: 17,
16+
},
17+
{
18+
name: "Testcase 2 - input 2000000",
19+
input: 2000000,
20+
want: 142913828922,
21+
},
22+
}
23+
24+
for _, tt := range tests {
25+
t.Run(tt.name, func(t *testing.T) {
26+
n := Problem10(tt.input)
27+
28+
if n != tt.want {
29+
t.Errorf("Problem10() = %v, want %v", n, tt.want)
30+
}
31+
})
32+
}
33+
}
34+
35+
// Benchmarks
36+
func BenchmarkProblem10(b *testing.B) {
37+
for i := 0; i < b.N; i++ {
38+
_ = Problem10(2000000)
39+
}
40+
}

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+
}

0 commit comments

Comments
 (0)