diff --git a/largest_product_in_a_series/largest_product_test.go b/largest_product_in_a_series/largest_product_test.go new file mode 100644 index 0000000..26e53f8 --- /dev/null +++ b/largest_product_in_a_series/largest_product_test.go @@ -0,0 +1,54 @@ +package main + +import ( + "reflect" + "testing" +) + +func TestFetchNextAdjacent(t *testing.T) { + tt := []struct { + name string + wantCount int + srcDigits []int + wantDigits []int + wantSrcLeft []int + }{ + { + "2 out of 3", + 2, + []int{1, 2, 3}, + []int{2, 3}, + []int{}, + }, + { + "2 out of 2", + 2, + []int{1, 2}, + []int{}, + []int{1, 2}, + }, + { + "5 out of 6", + 5, + []int{1, 2, 3, 4, 5, 6}, + []int{2, 3, 4, 5, 6}, + []int{}, + }, + { + "2 out of 6", + 2, + []int{1, 2, 3, 4, 5, 6}, + []int{2, 3}, + []int{4, 5, 6}, + }, + } + + for _, tc := range tt { + t.Run(tc.name, func(t *testing.T) { + got, got2 := FetchNextAdjacent(tc.wantCount, tc.srcDigits) + if !reflect.DeepEqual(got, tc.wantDigits) || !reflect.DeepEqual(got2, tc.wantSrcLeft) { + t.Errorf("FetchNextAdjacent(%d, %v)=%v, %v, want %v, %v", tc.wantCount, tc.srcDigits, got, got2, tc.wantDigits, tc.wantSrcLeft) + } + }) + } +} diff --git a/largest_product_in_a_series/main.go b/largest_product_in_a_series/main.go new file mode 100644 index 0000000..338ebb1 --- /dev/null +++ b/largest_product_in_a_series/main.go @@ -0,0 +1,66 @@ +package main + +import ( + "fmt" + "strconv" +) + +var src = "73167176531330624919225119674426574742355349194934" + + "96983520312774506326239578318016984801869478851843" + + "85861560789112949495459501737958331952853208805511" + + "12540698747158523863050715693290963295227443043557" + + "66896648950445244523161731856403098711121722383113" + + "62229893423380308135336276614282806444486645238749" + + "30358907296290491560440772390713810515859307960866" + + "70172427121883998797908792274921901699720888093776" + + "65727333001053367881220235421809751254540594752243" + + "52584907711670556013604839586446706324415722155397" + + "53697817977846174064955149290862569321978468622482" + + "83972241375657056057490261407972968652414535100474" + + "82166370484403199890008895243450658541227588666881" + + "16427171479924442928230863465674813919123162824586" + + "17866458359124566529476545682848912883142607690042" + + "24219022671055626321111109370544217506941658960408" + + "07198403850962455444362981230987879927244284909188" + + "84580156166097919133875499200524063689912560717606" + + "05886116467109405077541002256983155200055935729725" + + "71636269561882670428252483600823257530420752963450" + +func main() { + var nextSrc []int + for len(src) > 0 { + i, err := strconv.Atoi(src[0:1]) + if err != nil { + panic(err) + } + nextSrc = append(nextSrc, i) + src = src[1:] + } + var next []int + var out int + for { + next, nextSrc = FetchNextAdjacent(13, nextSrc) + if len(next) == 0 { + break + } + var product = next[0:1][0] + next = next[1:] + for _, v := range next { + product = product * v + } + if product > out { + out = product + } + } + + fmt.Println("the largest product is", out) +} + +func FetchNextAdjacent(n int, src []int) ([]int, []int) { + if n >= len(src) { + return []int{}, src + } + ret := make([]int, n) + copy(ret, src[1:n+1]) + return ret, src[n+1:] +}