Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.97 KB | None | 0 0
  1. def get_members(input_string):
  2. pointer = 0
  3. members = []
  4. operators = []
  5. for i in range(len(input_string)):
  6. symbol = input_string[i]
  7. if symbol == '+' or symbol == '-':
  8. operators.append(symbol)
  9. members.append(input_string[pointer:i])
  10. pointer = i + 1
  11. if i == len(input_string) - 1:
  12. members.append(input_string[pointer:i+1])
  13. return members, operators
  14.  
  15.  
  16. def multiplication(polynomial_a, polynomial_b):
  17. result = {}
  18. for member_b in polynomial_b:
  19. for member_a in polynomial_a:
  20.  
  21. var = member_a['var'] if member_a['var'] != 'free' else member_b['var']
  22. poww = member_a['poww'] + member_b['poww']
  23.  
  24. if poww != 1 and var != 'free':
  25. key = var + "^" + str(poww)
  26. else:
  27. key = var
  28.  
  29. coeff = result.get(key, None)
  30. if not coeff:
  31. result[key] = {
  32. 'k': member_a['coeff'] * member_b['coeff'],
  33. 'poww': poww
  34. }
  35. else:
  36. result[key]['k'] += member_a['coeff'] * member_b['coeff']
  37.  
  38. if result.get('free', None):
  39. result['free']['poww'] = -10
  40.  
  41. final_res = {}
  42. for member in result.keys():
  43. if result[member]['k'] != 0:
  44. final_res[member] = result[member]
  45.  
  46. return final_res
  47.  
  48.  
  49. def parse_polynomial(input_string):
  50. array_of_members, array_of_operators = get_members(input_string)
  51. res = []
  52.  
  53. first_has_sign = False
  54. for index, member in enumerate(array_of_members):
  55. if not member:
  56. first_has_sign = True
  57. continue
  58.  
  59. var = None
  60. coeff = '-'
  61. is_poww = False
  62. poww = None
  63. for i in member:
  64. if i.isdigit():
  65. if not is_poww:
  66. if coeff == '-':
  67. coeff = int(i)
  68. else:
  69. coeff = coeff * 10 + int(i)
  70. elif is_poww:
  71. if not poww:
  72. poww = int(i)
  73. else:
  74. poww = poww * 10 + int(i)
  75. else:
  76. if i == '^':
  77. is_poww = True
  78. else:
  79. var = i
  80. res_member = {
  81. 'coeff': coeff if coeff != '-' else 1,
  82. 'var': var if var else 'free',
  83. 'poww': poww if poww else 1,
  84. }
  85. if res_member['var'] == 'free':
  86. res_member['poww'] = 0
  87.  
  88. sign = '+'
  89. if first_has_sign:
  90. sign = array_of_operators[index - 1]
  91. elif index > 0:
  92. sign = array_of_operators[index - 1]
  93. if sign == '-':
  94. res_member['coeff'] *= -1
  95.  
  96. res.append(res_member)
  97. return res
  98.  
  99.  
  100. def polynomial_to_string(polynomial):
  101. if not polynomial:
  102. return '0'
  103. result = ''
  104. first = True
  105. for key in sorted(polynomial.keys(), key=lambda _key: polynomial[_key]['poww'], reverse=True):
  106. coeff = polynomial[key]['k']
  107. if not first:
  108. if coeff > 0:
  109. result += '+'
  110. if abs(coeff) != 1 or abs(coeff) == 1 and key == 'free':
  111. result += str(coeff)
  112. elif coeff == -1:
  113. result += '-'
  114.  
  115. else:
  116. first = False
  117.  
  118. if abs(coeff) != 1 or abs(coeff) == 1 and key == 'free':
  119. result += str(coeff)
  120. elif coeff == -1:
  121. result += '-'
  122.  
  123. if key != 'free':
  124. result += key
  125. return result
  126.  
  127.  
  128. def calculate(polynomial_str_a, polynomial_str_b):
  129. return polynomial_to_string(
  130. multiplication(
  131. parse_polynomial(polynomial_str_a),
  132. parse_polynomial(polynomial_str_b)
  133. )
  134. )
  135.  
  136.  
  137. polynomial_str_a = input()
  138. polynomial_str_b = input()
  139. print(calculate(polynomial_str_a, polynomial_str_b))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement