Python, Straightforward with Explanation
Evidently, we have 2 parts to our problem:\n Break our string into separate tokens which represent one fraction each\n Add the fractions together, keeping it in
Evidently, we have 2 parts to our problem:\n* Break our string into separate tokens which represent one fraction each\n* Add the fractions together, keeping it in reduced form\n\nLet's decide how we want to break our string into tokens.  Immediately after we see the second digit region, we know the first fraction must end there.  To know whether we ended a digit region, we can look for a digit followed by a non-digit (or we are at the end of the string).  Thus, every 2 digit regions, we'll report the token we've found.  That token is something like "-10/3", which we'll convert into the integer tuple (-10, 3) representing fraction (-10 / 3).\n\n```\ndef fractionAddition(self, S):\n    def iter_tokens(S):\n        left = 0\n        count = 0 \n        for right, symbol in enumerate(S):\n            if (right == len(S)-1 or \n                    symbol.isdigit() and not S[right + 1].isdigit()):\n                count += 1\n                if count % 2 == 0:\n                    yield map(int, S[left: right+1].split('/'))\n                    left = right + 1\n```\n\nTo add two fractions (a, b) and (c, d) together, we convert to a common denominator bd, so the fraction is (ad + bc, bd).  To keep fraction (x, y) reduced, we should divide both the numerator and denominator by their greatest common divisor.  We can finish as follows:\n\n```\n    def gcd(a, b):\n        if a == 0: return b\n        return gcd(b%a, a)\n\n    def add((an, ad), (bn, bd)):\n        n = an * bd + bn * ad\n        d = ad * bd\n        g = gcd(n, d)\n        return n/g, d/g\n\n    return "{}/{}".format(*reduce(add, iter_tokens(S)))\n```\n\nWe could have also leveraged the fractions library to simplify our calculation.\n```\ndef fractionAddition(self, S):\n    from fractions import Fraction\n    ans = Fraction(0, 1)\n    left = count = 0\n    for right, symbol in enumerate(S):\n        if (right == len(S) - 1 or \n                symbol.isdigit() and not S[right + 1].isdigit()):\n            count ^= 1\n            if not count:\n                ans += Fraction(*map(int, S[left: right+1].split('/')))\n                left = right + 1\n    \n    return "{}/{}".format(ans.numerator, ans.denominator)\n```
[]