summaryrefslogtreecommitdiff
path: root/go/largest-series-product/largest_series_product.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/largest-series-product/largest_series_product.go')
-rw-r--r--go/largest-series-product/largest_series_product.go55
1 files changed, 55 insertions, 0 deletions
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
+}