## The challenge

You will have a list of rationals in the form:

 ``````1 `````` ``````lst = [ [numer_1, denom_1] , ... , [numer_n, denom_n] ] ``````

where all numbers are positive integers. You have to produce their sum `N / D` in an irreducible form: this means that `N` and `D` have only `1` as a common divisor.

Return the result in the form: `"N/D"`

If the result is an integer (`D` evenly divides `N`) return: `"n"`

If the input list is empty, return: `"0"`

Examples:

 ``````1 2 `````` ``````[ [1, 2], [1, 3], [1, 4] ] --> [13, 12] 1/2 + 1/3 + 1/4 = 13/12 ``````

## The solution in Golang

Option 1:

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 `````` ``````package solution import"fmt" func SumFracts(arr[][]int) string { a,b:= 0,1 for _,v:=range arr{ c,d:=v[0],v[1] k:=gcd(b,d) a,b=(a*d+b*c)/k,b*d/k } k:=gcd(a,b) a,b=a/k,b/k if b==1 {return fmt.Sprintf("%d",a)} return fmt.Sprintf("%d/%d",a,b) } func gcd(a, b int) int { for b != 0 { a, b = b, a%b } return a } ``````

Option 2:

 `````` 1 2 3 4 5 6 7 8 9 10 `````` ``````package solution import "math/big" func SumFracts(arr [][]int) string { result := new(big.Rat).SetFloat64(0) for _, v := range(arr) { rat := big.NewRat(int64(v[0]), int64(v[1])) result.Add(result, rat) } return result.RatString() } ``````

Option 3:

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 `````` ``````package solution import "math/big" func SumFracts(arr [][]int) string { sum := big.NewRat(0,1) for _, f := range arr { sum.Add(sum, big.NewRat(int64(f[0]), int64(f[1]))) } if sum.Denom().Cmp(big.NewInt(1)) == 0 { return sum.Num().String() } return sum.String() } ``````

## Test cases to validate our solution

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 `````` ``````package solution_test import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) func dotest(arr [][]int, exp string) { var ans = SumFracts(arr) Expect(ans).To(Equal(exp)) } var _ = Describe("Tests SumFracts", func() { It("should handle basic cases", func() { dotest([][]int{{1, 2}, {1, 3}, {1, 4}}, "13/12") dotest([][]int{{1, 3}, {5, 3}}, "2") }) }) ``````