Правила написания логических формул в символьном формате:
Показывать промежуточные выражения
def solve(s:str) -> str: #Рекурсивно решаем выражение
if '(' not in s:#Если не содержит скобок
#Нужно по приоритетам пройти строку, заменяя связки выражений на их значение
s1 = ''
n = len(s)
i = 0
while i < n: # Первый приоритет - инверсия
if s[i] == '-':
if s[i + 1] in '01':
s1 += str(1 - int(s[i + 1]))
i += 1
else:
s1 += s[i]
else:
s1 += s[i]
i += 1
i = 0
s = ''
n = len(s1)
while i < n: # Второй приоритет - конъюнкция
if s1[i] == '*':
s = s[:-1] + str(int(s[-1]) * int(s1[i + 1]))
i += 1
else:
s += s1[i]
i += 1
n = len(s)
s1 = ''
i = 0
while i < n: # Третий приоритет - дизъюкнция
if s[i] == '+':
a = s1[-1]
s1 = s1[:-1]
if a == '1' or s[i + 1] == '1':
s1 += '1'
else:
s1 += '0'
i += 1
else:
s1 += s[i]
i += 1
n = len(s1)
s = ''
i = 0
while i < n: # Четрвертый приоритет - импликация
if s1[i] == '-':
if s1[i - 1] in '01': #Проверяем на маске 0- или 1- (итоговый вид A->B)
a = s[-1]
s = s[:-1]
if a == '1' and s1[i + 2] == '0':
s += '0'
else:
s += '1'
i += 2
else:
s += s1[i]
else:
s += s1[i]
i += 1
s1 = ''
n = len(s)
i = 0
while i < n: # Пятый приоритет - эквиваленция
if s[i] == '<': #Проверяем на маске 0< или 1< (итоговый вид A<->B)
a = s1[-1]
s1 = s1[:-1]
if a == s[i + 3]:
s1 += '1'
else:
s1 += '0'
i += 3
else:
s1 += s[i]
i += 1
return s1
else: #Если скобки есть, заменяем их содержимое рекурсивно
s1 = ''
layer = 0
fl = False
s2 = ''
for ch in s:
if not(fl):
if ch == '(':
fl = True
layer += 1
else:
s1 += ch
else:
if ch == ')':
layer -= 1
if layer == 0:
s1 += solve(s2)
s2 = ''
fl = False
continue
elif ch == '(':
layer += 1
s2 += ch
return solve(s1)
def despacito(s:str) -> str: # Это можно заменить на s = s.replace('s', '')
res = ''
for ch in s:
if ch != ' ':
res += ch
return res
def gen(lst:list, n:int): # Генерируем строки для переменных, n - номер строки
if len(lst) == n:
yield lst
else:
lst.append('0')
for res in gen(lst, n):
yield res
lst.pop()
lst.append('1')
for res in gen(lst, n):
yield res
lst.pop()
def solution(s:str) -> None: #Основная программа
s = despacito(s)
variables = set()
if s[-1] not in ' -+*<>()':
s += ' '
lst = []
if s[0] in '+-*<> ()':
fl = False
else:
fl = True
v = ''
for ch in s:
if ch in '+-*<> ()':
if not(fl):
v += ch
else:
if v != '0' and v != '1':
lst.append((v, True))
variables.add(v)
v = ch
fl = False
else:
fl = False
if len(lst) == 0:
v += ch
else:
v = lst.pop()[0] + v + ch
else:
if not(fl):
lst.append((v, False))
v = ch
fl = True
else:
v += ch
if v != '':
lst.append((v, False))
# Выводим результат
if len(variables) == 0: #Если переменных нет, сразу выводим solve(s)
print('F:', solve(s))
return
variables = sorted(variables)
maxlen = max([len(v) for v in variables])
for v in variables:
print(v.rjust(maxlen), end=' ')
print('| F')
n = len(variables)
for swap in gen([], n):
change = {}
for i in range(n):
change[variables[i]] = swap[i]
print(swap[i].rjust(maxlen), end=' ')
s1 = ''
for elem in lst:
if elem[1]:
s1 += change[elem[0]]
else:
s1 += elem[0]
print('|', solve(s1))
while True:
s = input()
solution(s)