ForestFox

Калькулятор дробей и комбинаторики

Oct 20th, 2021 (edited)
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 11.94 KB | None | 0 0
  1. def f_znak(s):  # ищем знак и его индекс в массиве
  2.     global znak
  3.     for i in range(len(s) - 1):
  4.         if s[i] in znak:
  5.             return i, s[i]
  6.  
  7. def pretty_num(): #красиво разибаев число и делаем в s два элемента 1 содердит первое число, 2 второе в текстовом виде
  8.     global s, znak_n, znak_z
  9.     if not 'по' in s:
  10.         znak_n, znak_z = f_znak(s)
  11.         s[znak_n] = '*'
  12.         s = ' '.join(s).split('*')
  13.         s = [s[i].split() for i in range(len(s))]
  14.     return s
  15. def enum(i):  # ищем числитель и знаменатель дроби
  16.     if ' и ' in i:
  17.         numerator, denumerator = enum(i[2:])
  18.         numerator += denumerator * i[0]
  19.         return numerator, denumerator
  20.     numerator, denumerator = 0, 0
  21.     for j in range(len(i)):
  22.         if numerator == 0 and chislit.get(i[j]):
  23.             numerator += chislit[i[j]]
  24.         # elif :
  25.         #     numerator += digit[i[j]]
  26.         elif digit.get(i[j]) and 1 <= digit[i[j]] <= 10:
  27.             numerator += digit_1[i[j]]
  28.         elif drob_for_10.get(i[j]):
  29.             denumerator += drob_for_10[i[j]]
  30.         elif digit_10.get(i[j]):
  31.             denumerator += digit_10[i[j]]
  32.         elif drob_for_1.get(i[j]):
  33.             denumerator += drob_for_1[i[j]]
  34.         elif drob.get(i[j]):
  35.             denumerator += drob[i[j]]
  36.         elif denumerator != 0:
  37.             denumerator += drob[i[j]]
  38.     return numerator, denumerator
  39. def num_int(i):
  40.     num = 0
  41.     for j in range(len(i)):
  42.         num += digit[i[j]]
  43.     return num
  44. def is_drob(k): #есть ли дробь во вводе если k == 0, проверяем первое число, если k == 1, проверяем второе число
  45.     global znak_n
  46.     if k == 0:
  47.         for i in s[0]:
  48.             if drob.get(i) or drob_for_1.get(i) or drob_for_10.get(i):
  49.                 return True
  50.     if k == 1:
  51.         for i in s[1]:
  52.             if drob.get(i) or drob_for_1.get(i) or drob_for_10.get(i):
  53.                 return True
  54.     return False
  55. def check():
  56.     global s, comb, znak_n, drob, numbers
  57.     d_0 = is_drob(0)
  58.     d_1 = is_drob(1)
  59.     if s[0] in comb_op[:2]:
  60.         iz, po = s.index('из'), s.index('по')
  61.         numbers[0] = num_int(s[iz+1: po-1]) + comb_op[s[po-1]]
  62.         numbers[1] = num_int(s[po+1:])
  63.         return 'comb'
  64.     elif s[0] == 'перестановок':
  65.         po = s.index('по')
  66.         numbers[0] = num_int(s[po+1:])
  67.         return 'comb'
  68.     elif d_0 and d_1:
  69.         numbers = [enum(s[0]), enum(s[1])]
  70.         return 'drobi'
  71.     elif d_0:
  72.         numbers = [enum(s[0]), num_int(s[1])]
  73.         return '1drob'
  74.     elif d_1:
  75.         numbers = [num_int(s[0]), enum(s[1])]
  76.         return '2drob'
  77.     else:
  78.         numbers[0], numbers[1]  = num_int(s[0]), num_int(s[1])
  79.         return 'int'
  80.  
  81.  
  82. def nod(i, j): #ищем НОД двух чисел
  83.     if i == 0:
  84.         return j
  85.     return nod(j % i, i)
  86. def fac(i): #ищем факториал i
  87.     if i == 1:
  88.         return 1
  89.     return i*fac(i-1)
  90. def drobi(n1, n2): #выполняем действие между двумя дробями
  91.     numerator_1, denumerator_1 = n1
  92.     numerator_2, denumerator_2 = n2
  93.     if znak_z == 'плюс':
  94.         numerator_1 = numerator_1 * denumerator_2 + numerator_2 * denumerator_1
  95.         denumerator_1 *= denumerator_2
  96.     elif znak_z == 'минус':
  97.         numerator_1 = numerator_1 * denumerator_2 - numerator_2 * denumerator_1
  98.         denumerator_1 *= denumerator_2
  99.     elif znak_z == 'умножить':
  100.         numerator_1 *= numerator_2
  101.         denumerator_1 *= denumerator_2
  102.     elif znak_z == 'разделить':
  103.         numerator_1 *= denumerator_2
  104.         denumerator_1 *= numerator_2
  105.     obd = nod(numerator_1, denumerator_1)
  106.     numerator, denumerator = numerator_1 // obd, denumerator_1 // obd
  107.     return numerator, denumerator
  108. def operation_between(i, j):
  109.     if znak_z == 'плюс':
  110.         return i+j
  111.     if znak_z == 'минус':
  112.         return i-j
  113.     if znak_z == 'умножить':
  114.         return i*j
  115. def calcul(s): #определяем, какую операцию хочет сделать пользователь
  116.     global numbers
  117.     if check() == 'comb':
  118.         if s[0] == 'размещений':
  119.             return fac(numbers[0])//fac(numbers[0]-numbers[1])
  120.         if s[0] == 'сочетаний':
  121.             return fac(numbers[0])//(fac(numbers[0]-numbers[1])* fac(numbers[1]))
  122.         if s[0] == 'перестановок':
  123.             return fac(numbers[0])
  124.     elif check() == 'drobi':
  125.         return drobi(numbers[0], numbers[1])
  126.     elif check() == '1drob':
  127.         return drobi(numbers[0], (numbers[1]*numbers[0][1], numbers[0][1]))
  128.     elif check() == "2drob":
  129.         return drobi((numbers[0] * numbers[1][1], numbers[1][1]), numbers[1] )
  130.     elif check() == 'int':
  131.         return operation_between(numbers[0], numbers[1])
  132.  
  133. def inp_int(m):
  134.     if m//10 == 1: return [digit_obr[m]]
  135.     if m // 10 == 0: return [digit_obr[m % 10]]
  136.     if m%10 == 0: return [digit_obr[m//10]]
  137.     return [digit_obr[m // 10], digit_obr[m % 10]]
  138. def posle():
  139.     global m, posl
  140.     if m[0] % m[1] == 1:
  141.         if len(m[1]) > 1:
  142.             posl = drob_for_obr[m[1][-1]]
  143.         else:
  144.             posl = drob_for_obr[m[1]]
  145.     else:
  146.         if len(m[1]) > 1:
  147.             posl = drob_obr[m[1][-1]]
  148.         else:
  149.             posl = drob_obr[m[1]]
  150. def num_ne_100(i):
  151.     return i < 100
  152. def num_znak(i):
  153.     if isinstance(i, int):
  154.         if i < 0:
  155.             return '-', abs(i)
  156.         return '+', i
  157.     else:
  158.         if i[0] < 0 or i[1] < 0:
  159.             return '-', abs(i[0]), abs(i[1])
  160.         return '+', abs(i[0]), abs(i[1])
  161. def pretty_drob(i):
  162.     i = list(i)
  163.     zel = inp_int(i[0] // i[1]) + ['и']
  164.     i[0] %= i[1]
  165.     znamenat = inp_int(i[1])
  166.     if i[1] // 10 != 1:
  167.         if i[0] % 10 != 1: znamenat[-1] = drob_obr[i[1] % 10]
  168.         else: znamenat[-1] = drob_for_obr[i[1] % 10]
  169.     chisl = inp_int(i[0])
  170.     if i[0]//10 != 1:
  171.         chisl[-1] = chislit_obr[i[0]%10]
  172.     return zel+chisl+znamenat
  173.  
  174.  
  175. def calc(m):
  176.     k = (check() not in ['drobi', '1drob', '2drob'])
  177.     if not k and (m[0] % m[1] == 0):
  178.         k = 1
  179.         m = m[0]//m[1]
  180.     if k :
  181.         if m > 100: return [m]
  182.         if m<0: return ['минус', inp_int(abs(m))]
  183.         return inp_int(m)
  184.  
  185.     else:
  186.         if m[0]<0 or m[1]<0:
  187.             m = list(m)
  188.             m[0], m[1] = abs(m[0]), abs(m[1])
  189.             a = ['минус'] + pretty_drob(m)
  190.             return a
  191.         return pretty_drob(m)
  192.  
  193.  
  194. chislit = {'одна': 1, 'две': 2}
  195. drob_1 = {'первых': 1, 'вторых': 2, 'третьих': 3, 'четвертых': 4, 'пятых': 5, 'шестых': 6, 'седьмых': 7, 'восьмых': 8,
  196.           'девятых': 9}
  197. drob_for = {}
  198. drob_for_1 = {'первая': 1, 'вторая': 2, 'третья': 3, 'четвертая': 4, 'пятая': 5, 'шестая': 6, 'седьмая': 7, 'восьмая': 8,
  199.           'девятая': 9}
  200. drob_for_10 = {'десятая': 10, 'одиннадцатая': 11, 'двенадцатая': 12, 'тринадцатая': 13, 'четырдцатая': 14,
  201.            'пятнадцатая': 15, 'сотая': 100,
  202.            'шестнадцатая': 16, 'семнадцатая': 17, 'восемнадцатая': 18, 'девятнадцатая': 19, 'двадцатая': 20,
  203.            'тридцатая': 30,
  204.            'сороковая': 40, 'пятидесятая': 50, 'шестидесятая': 60, 'семидесятая': 70, 'восьмидесятая': 80,
  205.            'девяностая': 90}
  206. drob_for.update(drob_for_1)
  207. drob_for.update(drob_for_10)
  208.  
  209. drob_10 = {'десятых': 10, 'одиннадцатых': 11, 'двенадцатых': 12, 'тринадцатых': 13, 'четырдцатых': 14,
  210.            'пятнадцатых': 15, 'сотых': 100,
  211.            'шестнадцатых': 16, 'семнадцатых': 17, 'восемнадцатых': 18, 'девятнадцатых': 19, 'двадцатых': 20,
  212.            'тридцатых': 30,
  213.            'сороковых': 40, 'пятидесятых': 50, 'шестидесятых': 60, 'семидесятых': 70, 'восьмидесятых': 80,
  214.            'девяностых': 90}
  215. drob = {}
  216. drob.update(drob_1)
  217. drob.update(drob_10)
  218. digit_1 = {'ноль': 0, 'один': 1, 'два': 2, 'три': 3, 'четыре': 4, 'пять': 5, 'шесть': 6, 'семь': 7, 'восемь': 8, 'девять': 9}
  219. digit_10 = {'десять': 10, 'одиннадцать': 11, 'двенадцать': 12, 'тринадцать': 13, 'четырнадцать': 14, 'пятнадцать': 15,
  220.             'шестнадцать': 16, 'семнадцать': 17, 'восемнадцать': 18, 'девятнадцать': 19, 'двадцать': 20, 'тридцать': 30,
  221.             'сорок': 40, 'пятьдесят': 50, 'шестьдесят': 60, 'семьдесят': 70, 'восемьдесят': 80, 'девяносто': 90,
  222.             'сто': 100}
  223. digit_100 = {'сто': 100, 'двести': 200, 'триста': 300, 'четыреста': 400, 'пятьсот': 500, 'шестьсот': 600,
  224.              'семьсот': 700, 'восемьсот': 800, 'девятьсот': 900}
  225. digit_1000 = {'тычяча': 1000, 'две тысячи': 2000, 'три тысячи': 3000, 'четыре тысячи': 4000, 'пять тысяч': 5000,
  226.               'шесть тысяч': 6000, 'семь тысяч': 7000, 'восемь тысяч': 8000, 'девять тысяч': 9000,
  227.               'десять тысяч': 10000}
  228. digit ={}
  229. digit.update(digit_1)
  230. digit.update(digit_10)
  231. digit.update(digit_100)
  232. digit.update(digit_1000)
  233.  
  234.  
  235. digit_obr = {b: a for a, b in digit.items()}
  236. drob_obr = {b: a for a, b in drob.items()}
  237. drob_for_obr = {b: a for a, b in drob_for.items()}
  238. chislit = { 'одна': 1, 'две': 2, 'три': 3, 'четыре': 4, 'пять': 5, 'шесть': 6, 'семь': 7, 'восемь': 8, 'девять': 9,
  239.             'десять': 10, 'одиннадцать': 11, 'двенадцать': 12, 'тринадцать': 13, 'четырнадцать': 14, 'пятнадцать': 15,
  240.             'шестнадцать': 16, 'семнадцать': 17, 'восемнадцать': 18, 'девятнадцать': 19, 'двадцать': 20, 'тридцать': 30,
  241.             'сорок': 40, 'пятьдесят': 50, 'шестьдесят': 60, 'семьдесят': 70, 'восемьдесят': 80, 'девяносто': 90,
  242.             'сто': 100}
  243. chislit_obr = {b: a for a, b in chislit.items()}
  244. znak = ["плюс", "минус", "умножить", "разделить"]
  245.  
  246. comb_op = ['размещений', 'сочетаний', 'перестановок']
  247. comb_1 = {'одного':1 , 'двух':2  ,'трех': 3 , 'четырех':4 , 'пяти':5 , 'шести':6 , 'семи':7 , 'восьми':8 , 'девяти': 9 }
  248. comb_10 = {'десяти': 10, 'одиннадцати': 11 ,'двенадцати':12 , 'тринадцати':13 , 'четырнадцати':14 , 'пятнадцати':15 , 'шестнадцати': 16,
  249.           'семнадцати': 17 , 'восемнадцати': 18, 'девятнадцати': 19, 'двадцати':20 , 'тридцати':30 ,'сорока':40, 'пятидесяти': 50,
  250.            'шестидесяти': 60 , 'семидесяти':70 , 'восьмидесяти':80 , 'девяноста': 90, 'ста': 100}
  251. comb = comb_1
  252. comb.update(comb_10)
  253.  
  254.  
  255. while True:
  256.     s = input().replace(' на ', ' ').split()
  257.     print(s)
  258.     znak_n, znak_z = 0, 0
  259.     # print(znak_n, znak_z)
  260.     numbers = [0, 0]
  261.     pretty_num()
  262.     print(s)
  263.     print(check())
  264.     print(*numbers)
  265.     print(calcul(s))
  266.     print(numbers)
  267.     print(calcul(s))
  268.     print(*calc(calcul(s)))
  269.  
Add Comment
Please, Sign In to add comment