summaryrefslogtreecommitdiff
path: root/go/sum-of-multiples/sum_of_multiples.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-08-26 14:44:10 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-08-26 14:44:10 +0200
commitacbc22c498a5e58b810f6a3838fa85e597b7f4d9 (patch)
tree1e543f56ad4e63a0df55a5ea269b41720bb0f287 /go/sum-of-multiples/sum_of_multiples.go
parentf47002f53090869eb8a0d725b7770959a3af30db (diff)
Solve sum of multiples
Diffstat (limited to 'go/sum-of-multiples/sum_of_multiples.go')
-rw-r--r--go/sum-of-multiples/sum_of_multiples.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/go/sum-of-multiples/sum_of_multiples.go b/go/sum-of-multiples/sum_of_multiples.go
new file mode 100644
index 0000000..c99cdd7
--- /dev/null
+++ b/go/sum-of-multiples/sum_of_multiples.go
@@ -0,0 +1,34 @@
+package summultiples
+
+import "sync"
+
+func MultipleSummer(n ...int) func(top int) int {
+ return func(top int) int {
+ c := make(chan int)
+ wg := sync.WaitGroup{}
+ // spawn worker
+ for _, v := range n {
+ wg.Add(1)
+ go func(m int) {
+ for i := m; i < top; i += m {
+ c <- i
+ }
+ wg.Done()
+ }(v)
+ }
+ go func() {
+ wg.Wait()
+ close(c)
+ }()
+ // collect, uniq and sum up values
+ var sum int
+ seen := make(map[int]bool)
+ for v := range c {
+ if !seen[v] {
+ seen[v] = true
+ sum += v
+ }
+ }
+ return sum
+ }
+}