From 4f1bb81b4401686fa8860756a68c81a7b292008a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 27 Aug 2016 23:12:22 +0200 Subject: Solve largest --- .../largest_series_product.go | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 go/largest-series-product/largest_series_product.go (limited to 'go/largest-series-product/largest_series_product.go') diff --git a/go/largest-series-product/largest_series_product.go b/go/largest-series-product/largest_series_product.go new file mode 100644 index 0000000..df7110d --- /dev/null +++ b/go/largest-series-product/largest_series_product.go @@ -0,0 +1,55 @@ +package lsproduct + +import "errors" + +const testVersion = 3 + +func check(s string) bool { + for _, v := range s { + if v < '0' || v > '9' { + return false + } + } + return true +} + +func split(s string, n int) <-chan string { + c := make(chan string) + go func() { + for i := 0; i <= len(s)-n; i++ { + c <- s[i : i+n] + } + close(c) + }() + return c +} + +func max(c <-chan string) int { + prod := func(s string) int { + p := 1 + for _, v := range s { + p *= int(v - '0') + } + return p + } + var m int + for v := range c { + if p := prod(v); p > m { + m = p + } + } + return m +} + +func LargestSeriesProduct(s string, n int) (int, error) { + if ok := check(s); !ok { + return 0, errors.New("invalid chars") + } + if n < 0 || n > len(s) { + return 0, errors.New("invalid length") + } + if n == 0 { + return 1, nil + } + return max(split(s, n)), nil +} -- cgit v1.2.3