loalkota

Untitled

Jun 2nd, 2021 (edited)
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.49 KB | None | 0 0
  1. import re
  2. import math
  3.  
  4.  
  5. class SolveTask:
  6.     def __init__(self):
  7.         self._f = math.factorial
  8.  
  9.     def solve(*args, **kwargs):
  10.         raise NotImplementedError
  11.  
  12.     def combinations(self, n, k):
  13.         return self._f(n) // self._f(k) // self._f(n - k)
  14.  
  15.     def _parse_expression(self, expression):
  16.         n = expression.split('^')[1]
  17.        
  18.         brakets = re.split('[()]', expression)
  19.        
  20.         values = list(map(lambda x: x.strip(), brakets[1].split('+')))
  21.         values = [int(a) if '0' <= a <= '9' else a for a in values]
  22.  
  23.         return *values, int(n)
  24.  
  25.  
  26. class Solve8b(SolveTask):
  27.     SUPERSCRIPTS = '⁰¹²³⁴⁵⁶⁷⁸⁹'
  28.  
  29.     def solve(self, expression: str) -> str:
  30.         """Принимает трехчлены в виде: (a+b+c)^n
  31.  
  32.        Возвращает его раскрытие
  33.        """
  34.  
  35.         try:
  36.             *values, pow = self._parse_expression(expression)
  37.         except Exception as e:
  38.             return "Could't parse. Invalid syntax!"
  39.  
  40.         new_expression = []
  41.  
  42.         for z in range(pow+1):
  43.             for y in range(pow-z+1):
  44.                 x = pow - z - y
  45.  
  46.                 koef = self._get_koef(x, y, z)
  47.                 powered_values = [self._get_power(a, n) for a, n in zip(values, (x, y, z))]
  48.  
  49.                 for v in powered_values:
  50.                     if isinstance(v, int):
  51.                         koef *= v
  52.  
  53.                 powered_values = list(filter(lambda x: isinstance(x, str), powered_values))
  54.  
  55.                 term = str(koef) + "*" * (len(powered_values) != 0) + "*".join(powered_values)
  56.                 new_expression.append(term)
  57.  
  58.         return " + ".join(new_expression)
  59.    
  60.     def _get_power(self, a, n):
  61.         if n == 0:
  62.             return 1
  63.  
  64.         if isinstance(a, int):
  65.             return a ** n
  66.    
  67.         return f'({a}){"".join([self.SUPERSCRIPTS[int(x)] for x in str(n)])}'
  68.  
  69.     def _get_koef(self, a, b, c):
  70.         return self._f(a+b+c) // (self._f(a) * self._f(b) * self._f(c))
  71.  
  72.     def _parse_expression(self, expression):
  73.         n = expression.split('^')[1]
  74.        
  75.         brakets = re.split('[()]', expression)
  76.         brakets[1] = brakets[1].replace('-', '+-')
  77.  
  78.         if brakets[1][0] == '+':
  79.             brakets[1] = brakets[1][1:]
  80.  
  81.         values = list(map(lambda x: x.strip(), brakets[1].split('+')))
  82.  
  83.         values = [int(a) if a.isdigit() else a for a in values]
  84.  
  85.         return *values, int(n)
  86.  
  87.  
  88. class Solve8a(Solve8b):
  89.     def solve(self, expression: str, k: int) -> str:
  90.         """Берем какое то выражение и вычисляем k член ряда
  91.        """
  92.  
  93.         try:
  94.             *values, pow = self._parse_expression(expression)
  95.         except Exception as e:
  96.             return "Could't parse. Invalid syntax!"
  97.        
  98.         k -= 1
  99.         koef = self.combinations(pow, k)
  100.        
  101.         powered_values = [self._get_power(a, n) for a, n in zip(values, (pow-k, k))]
  102.  
  103.         for v in powered_values:
  104.             if isinstance(v, int):
  105.                 koef *= v
  106.  
  107.         powered_values = list(filter(lambda x: isinstance(x, str), powered_values))
  108.  
  109.         term = str(koef) + "*" * (len(powered_values) != 0) + "*".join(powered_values)
  110.  
  111.         return term
  112.  
  113.  
  114. if __name__ == '__main__':
  115.     expressions = [('(-a+b)^3', 4), ('(2a+b)^1', 2), ('(b+4c)^4', 4), ('(5+c)^7', 4)]
  116.     print('Примеры работы:')
  117.  
  118.     for exp in expressions:
  119.         print(exp, ':', Solve8a().solve(*exp), '\n')
  120.  
Add Comment
Please, Sign In to add comment