From b4b3c16c582ed10bd386bb0cd00b13726293fdcb Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Fri, 23 Aug 2024 23:42:16 +0200 Subject: [PATCH] =?UTF-8?q?go:=20add=20=C2=AB592.=20Fraction=20Addition=20?= =?UTF-8?q?and=20Subtraction=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- go/fraction-addition-and-subtraction.go | 45 +++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 go/fraction-addition-and-subtraction.go diff --git a/go/fraction-addition-and-subtraction.go b/go/fraction-addition-and-subtraction.go new file mode 100644 index 0000000..9283f6f --- /dev/null +++ b/go/fraction-addition-and-subtraction.go @@ -0,0 +1,45 @@ +package main + +import ( + "fmt" + "regexp" + "strconv" +) + +func fractionAddition(expression string) string { + abs := func(x int) int { + return max(-x, x) + } + gcd := func(x, y int) int { + for y != 0 { + x, y = y, x%y + } + return x + } + NUM_REGEX, _ := regexp.Compile("[+-]?[0-9]+") + + num, denom := 0, 1 + + nums := NUM_REGEX.FindAllString(expression, -1) + for i := 0; i < len(nums); i += 2 { + next_num, ok := strconv.Atoi(nums[i]) + if ok != nil { + panic("failed to parse numerator") + } + + next_denom, ok := strconv.Atoi(nums[i+1]) + if ok != nil { + panic("failed to parse denominator") + } + + num = num*next_denom + next_num*denom + denom *= next_denom + } + + d := abs(gcd(num, denom)) + + num /= d + denom /= d + + return fmt.Sprintf("%d/%d", num, denom) +}