From b12217812a1ed31195424aa9e527251a08466249 Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Sun, 2 Jun 2019 10:14:18 -0600 Subject: [PATCH 1/4] day 283: brute force version of regular numbers --- day283/problem.go | 28 +++++++++++++++++++++++++++ day283/problem_test.go | 43 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 day283/problem.go create mode 100644 day283/problem_test.go diff --git a/day283/problem.go b/day283/problem.go new file mode 100644 index 0000000..be63d89 --- /dev/null +++ b/day283/problem.go @@ -0,0 +1,28 @@ +package day283 + +// RegularNumbersBrute returns n regular numbers +// using brute force. +func RegularNumbersBrute(n int) []int { + if n < 0 { + panic("negative values are not possible") + } + result := make([]int, 0, n) + count := 0 + for x := 1; count < n; x++ { + remain := repeatDivide(x, 2) + remain = repeatDivide(remain, 3) + remain = repeatDivide(remain, 5) + if remain == 1 { + result = append(result, x) + count++ + } + } + return result +} + +func repeatDivide(val, factor int) int { + for val%factor == 0 { + val /= factor + } + return val +} diff --git a/day283/problem_test.go b/day283/problem_test.go new file mode 100644 index 0000000..8fd004b --- /dev/null +++ b/day283/problem_test.go @@ -0,0 +1,43 @@ +package day283 + +import ( + "reflect" + "testing" +) + +// nolint +var testcases = []struct { + n int + expected []int +}{ + {0, []int{}}, + {1, []int{1}}, + {2, []int{1, 2}}, + {11, []int{1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15}}, +} + +func TestRegularNumbersBrute(t *testing.T) { + t.Parallel() + for _, tc := range testcases { + if result := RegularNumbersBrute(tc.n); !reflect.DeepEqual(result, tc.expected) { + t.Errorf("Expected %v, got %v", tc.expected, result) + } + } +} + +func TestRegularNumbersBruteBadInput(t *testing.T) { + defer func() { + if err := recover(); err == nil { + t.Errorf("Expected a panic for a negative input") + } + }() + RegularNumbersBrute(-2) +} + +func BenchmarkRegularNumbersBrute(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, tc := range testcases { + RegularNumbersBrute(tc.n) + } + } +} From 28ddc1edb2c33c97114ce8a04d418bbf16bfb481 Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Sun, 2 Jun 2019 10:14:47 -0600 Subject: [PATCH 2/4] add day 283 to readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b8df42c..e689b52 100644 --- a/README.md +++ b/README.md @@ -289,3 +289,4 @@ problems from * [Day 280](https://github.com/vaskoz/dailycodingproblem-go/issues/568) * [Day 281](https://github.com/vaskoz/dailycodingproblem-go/issues/572) * [Day 282](https://github.com/vaskoz/dailycodingproblem-go/issues/575) +* [Day 283](https://github.com/vaskoz/dailycodingproblem-go/issues/577) From ef6324d84e60b5cfa48d46d7fcd31119be796258 Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Sun, 2 Jun 2019 10:16:14 -0600 Subject: [PATCH 3/4] day 283: larger testcase --- day283/problem_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/day283/problem_test.go b/day283/problem_test.go index 8fd004b..6fe455a 100644 --- a/day283/problem_test.go +++ b/day283/problem_test.go @@ -14,6 +14,7 @@ var testcases = []struct { {1, []int{1}}, {2, []int{1, 2}}, {11, []int{1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15}}, + {26, []int{1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60}}, } func TestRegularNumbersBrute(t *testing.T) { From 9cd982c4502819b24efe48bcb7db4b7b054ec8c4 Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Sun, 2 Jun 2019 10:25:58 -0600 Subject: [PATCH 4/4] day 283: faster version of regular numbers --- day283/problem.go | 40 ++++++++++++++++++++++++++++++++++++++++ day283/problem_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/day283/problem.go b/day283/problem.go index be63d89..8fede56 100644 --- a/day283/problem.go +++ b/day283/problem.go @@ -1,5 +1,45 @@ package day283 +// RegularNumbersFaster returns n regular numbers +// using brute force. +func RegularNumbersFaster(n int) []int { + if n < 0 { + panic("negative values are not possible") + } else if n == 0 { + return []int{} + } + result := make([]int, n) + result[0] = 1 + var i2, i3, i5 int + next2, next3, next5 := 2, 3, 5 + for i := 1; i < n; i++ { + result[i] = min(next2, next3, next5) + if result[i] == next2 { + i2++ + next2 = result[i2] * 2 + } + if result[i] == next3 { + i3++ + next3 = result[i3] * 3 + } + if result[i] == next5 { + i5++ + next5 = result[i5] * 5 + } + } + return result +} + +func min(vals ...int) int { + smallest := vals[0] + for _, v := range vals { + if v < smallest { + smallest = v + } + } + return smallest +} + // RegularNumbersBrute returns n regular numbers // using brute force. func RegularNumbersBrute(n int) []int { diff --git a/day283/problem_test.go b/day283/problem_test.go index 6fe455a..2ec7ede 100644 --- a/day283/problem_test.go +++ b/day283/problem_test.go @@ -17,6 +17,32 @@ var testcases = []struct { {26, []int{1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60}}, } +func TestRegularNumbersFaster(t *testing.T) { + t.Parallel() + for _, tc := range testcases { + if result := RegularNumbersFaster(tc.n); !reflect.DeepEqual(result, tc.expected) { + t.Errorf("Expected %v, got %v", tc.expected, result) + } + } +} + +func TestRegularNumbersFasterBadInput(t *testing.T) { + defer func() { + if err := recover(); err == nil { + t.Errorf("Expected a panic for a negative input") + } + }() + RegularNumbersFaster(-2) +} + +func BenchmarkRegularNumbersFaster(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, tc := range testcases { + RegularNumbersFaster(tc.n) + } + } +} + func TestRegularNumbersBrute(t *testing.T) { t.Parallel() for _, tc := range testcases {