| t | import asyncio | t | import asyncio |
| | | |
| class YesFuture: | | class YesFuture: |
| | | |
| def __init__(self, value=None): | | def __init__(self, value=None): |
| self.value = value | | self.value = value |
| | | |
| def set(self, value): | | def set(self, value): |
| self.value = value | | self.value = value |
| | | |
| def __await__(self): | | def __await__(self): |
| | | |
| async def _coro(v): | | async def _coro(v): |
| return v | | return v |
| return _coro(self.value).__await__() | | return _coro(self.value).__await__() |
| | | |
| def parse_poly(poly, x): | | def parse_poly(poly, x): |
| s = poly.replace(' ', '').replace('−', '-') | | s = poly.replace(' ', '').replace('−', '-') |
| supers = {'⁰': '0', '¹': '1', '²': '2', '³': '3', '⁴': '4', '⁵': '5' | | supers = {'⁰': '0', '¹': '1', '²': '2', '³': '3', '⁴': '4', '⁵': '5' |
| , '⁶': '6', '⁷': '7', '⁸': '8', '⁹': '9'} | | , '⁶': '6', '⁷': '7', '⁸': '8', '⁹': '9'} |
| terms = {} | | terms = {} |
| i = 0 | | i = 0 |
| n = len(s) | | n = len(s) |
| while i < n: | | while i < n: |
| sign = 1 | | sign = 1 |
| if s[i] == '+': | | if s[i] == '+': |
| i += 1 | | i += 1 |
| elif s[i] == '-': | | elif s[i] == '-': |
| sign = -1 | | sign = -1 |
| i += 1 | | i += 1 |
| coef_str = '' | | coef_str = '' |
| while i < n and s[i].isdigit(): | | while i < n and s[i].isdigit(): |
| coef_str += s[i] | | coef_str += s[i] |
| i += 1 | | i += 1 |
| coef = int(coef_str) if coef_str else None | | coef = int(coef_str) if coef_str else None |
| has_x = False | | has_x = False |
| power = 0 | | power = 0 |
| if i < n and (s[i] == 'x' or s[i] == 'X'): | | if i < n and (s[i] == 'x' or s[i] == 'X'): |
| has_x = True | | has_x = True |
| i += 1 | | i += 1 |
| exp_str = '' | | exp_str = '' |
| while i < n and s[i] in supers: | | while i < n and s[i] in supers: |
| exp_str += supers[s[i]] | | exp_str += supers[s[i]] |
| i += 1 | | i += 1 |
| if exp_str: | | if exp_str: |
| power = int(exp_str) | | power = int(exp_str) |
| else: | | else: |
| power = 1 | | power = 1 |
| if has_x: | | if has_x: |
| if coef is None: | | if coef is None: |
| coef = 1 | | coef = 1 |
| elif coef is None: | | elif coef is None: |
| continue | | continue |
| coef *= sign | | coef *= sign |
| if power in terms: | | if power in terms: |
| terms[power] += coef | | terms[power] += coef |
| else: | | else: |
| terms[power] = coef | | terms[power] = coef |
| awaitables = [] | | awaitables = [] |
| for power, coef in terms.items(): | | for power, coef in terms.items(): |
| if coef == 0: | | if coef == 0: |
| continue | | continue |
| if power == 0: | | if power == 0: |
| awaitables.append(YesFuture(coef)) | | awaitables.append(YesFuture(coef)) |
| else: | | else: |
| a = x | | a = x |
| b = YesFuture(power) | | b = YesFuture(power) |
| pow_coro = Pow(a, b) | | pow_coro = Pow(a, b) |
| c = YesFuture(coef) | | c = YesFuture(coef) |
| term = Mul(c, pow_coro) | | term = Mul(c, pow_coro) |
| awaitables.append(term) | | awaitables.append(term) |
| if not awaitables: | | if not awaitables: |
| expr = YesFuture(0) | | expr = YesFuture(0) |
| else: | | else: |
| expr = awaitables[0] | | expr = awaitables[0] |
| for term in awaitables[1:]: | | for term in awaitables[1:]: |
| expr = Sum(expr, term) | | expr = Sum(expr, term) |
| | | |
| async def _runner(): | | async def _runner(): |
| return await expr | | return await expr |
| return _runner() | | return _runner() |