Как заменить операции factorial, nCr и nPr в python? - PullRequest
0 голосов
/ 18 июня 2020

Я хочу это всякий раз, когда:

Я пишу '!' он меняет символ на 'math.factorial'

Когда я пишу C, он выполняет операцию выбора (nCr) (n! / (r! (n - r)! ))

Если я напишу P это выполняет операцию перестановки (nPr) (n! / (n - r)!)

Это код, который я начал писать:

import math
term = ['math.factorial']
replace = ['!']
a = input('')
for word in replace:
    a = a.replace(word, term[replace.index(word)])

print(a)

Этот фрагмент кода изменится на '!' в 'math.factorial', чтобы я мог производить вычисления с помощью факториальной операции. Однако я хотел бы иметь возможность переместить 'math.factorial' перед числом.

Пример

Вот что делает моя программа:

Если я ввожу 2*x + (9-5)!

Моя программа напечатает 2*x + (9-5)math.factorial

Пример

Это должно сделать:

Если я введу 2*x + (9-5)!

Моя программа напечатает 2*x + math.factorial(9-5)

И это также должно быть сделано с помощью операций nCr и nPr.

Вы можете мне помочь?

1 Ответ

0 голосов
/ 19 июня 2020

Вот что вы можете сделать:

import re

input_line = "2*x + (9-5)! + 99! + max! + (x-3)! -4"

pattern = "\(.+?\)(?=!)|[0-9]+(?=!)|[a-z]+(?=!)"
result = re.findall(pattern, input_line)
print(result)
output_line = input_line
for match in result:
    if match[0] == '(':
        output_line = output_line.replace(f"{match}!", f"math.factorial{match}")
    else:
        output_line = output_line.replace(f"{match}!", f"math.factorial({match})")

print(output_line)

Сначала создается регулярное выражение "\(.*?\)(?=!)| [0-9]*(?=!)| [a-z]*(?=!)", которое затем сопоставляется со строкой ввода. Все совпадения сохраняются в result.

Затем вы заменяете все совпадения в строке ввода желаемой частью. Выполнение этого приведет к выводу:

2*x + math.factorial(9-5) + math.factorial(99) + math.factorial(max) + math.factorial(x-3) -4

Вы можете сделать это аналогичным образом для других операторов.

EDIT: Я не мог удержаться от попыток еще раз. Это приближается к хорошему решению, но все еще имеет fl aws.

import re

input_line = "2*x + (9-5)! + 99! + max! + (x-3)! -4 * ((7 + 2!)!)"
pattern_1 = "[0-9]+(?=!)"
pattern_2 = "[a-z]+(?=!)"
pattern_3 = "\(.+?\)(?=!)"
result_1 = re.findall(pattern_1, input_line)

output_line = input_line
result_3 = re.findall(pattern_3, output_line)

for match in result_3:
    output_line = output_line.replace(f"{match}!", f"math.factorial{match}")
for match in result_1:
    output_line = output_line.replace(f"{match}!", f"math.factorial({match})")
result_2 = re.findall(pattern_2, input_line)
for match in result_2:
    output_line = output_line.replace(f"{match}!", f"math.factorial({match})")
result_3 = re.findall(pattern_3, output_line)

print(output_line)

Создает вывод:

2*x + math.factorial(9-5) + math.factorial(99) + math.factorial(max) + math.factorial(x-3) -4 * math.factorial((7 + math.factorial(2)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...