uaveiro-leci/tools/truthtable/truthtable.py

92 lines
2.7 KiB
Python
Raw Normal View History

2022-11-16 15:08:39 +00:00
import os
import sys
import pathlib
import re
def main():
if len(sys.argv) == 1 or sys.argv[1] == 'usage':
print("""Usage:
2022-11-17 12:08:42 +00:00
truthtable '<function>':
Prints the truth table map of the function.
2022-11-16 15:08:39 +00:00
Valid characters:
> Variables: a-z
> Operators: +, *, ~, (, ); You can't use ~ before ()
2022-11-17 12:08:42 +00:00
truthtable usage:
2022-11-16 15:08:39 +00:00
Prints this message.""")
return
function = sys.argv[1]
validVariables = r"[a-z]"
validOperators = ['+', '*', '(', ')', '~', ' ', '0', '1']
2022-11-16 15:08:39 +00:00
for char in function:
if not (re.match(validVariables, char) or char in validOperators):
print("Invalid function, use 'truthtable usage' to see the valid characters.")
return
2022-11-16 15:08:39 +00:00
variables = re.findall(validVariables, function)
variables = list(dict.fromkeys(variables))
variables.sort()
2022-11-16 15:08:39 +00:00
truthTable = getTable(variables, function)
printTable(variables, truthTable)
2022-11-16 15:08:39 +00:00
2022-11-17 12:08:42 +00:00
def getTable(variables, function):
truthTable = {}
2022-11-16 15:08:39 +00:00
for n in range(2 ** len(variables)):
tempFunction = function
binary = bin(n)[2:]
binary = '0' * (len(variables) - len(binary)) + binary
index = 0
for var in tempFunction:
if index == len(tempFunction):
break
if var in "01" and tempFunction[index - 1] == '~':
tempFunction = tempFunction.replace('~' + var, str(1 - int(var) + " "))
try:
if var in variables:
tempFunction = tempFunction[:index] + binary[variables.index(var)] + tempFunction[index+1:] if tempFunction[index - 1] != '~' else tempFunction[:index-1] + str(int(not bool(int(binary[variables.index(tempFunction[index])]))))+" " + tempFunction[index+1:]
index += 1
except ValueError:
index += 1
continue
2022-11-16 15:08:39 +00:00
try:
2022-11-17 12:08:42 +00:00
truthTable[binary] = eval(tempFunction)
2022-11-16 15:08:39 +00:00
except:
2022-11-17 12:08:42 +00:00
print("Invalid function, use 'truthtable usage' to see the valid characters.")
2022-11-16 15:08:39 +00:00
return
2022-11-17 12:08:42 +00:00
if truthTable[binary] > 1:
truthTable[binary] = 1
if truthTable[binary] < 0:
truthTable[binary] = 0
2022-11-16 15:08:39 +00:00
2022-11-17 12:08:42 +00:00
return truthTable
2022-11-16 15:08:39 +00:00
2022-11-17 12:08:42 +00:00
def printTable(variables, truthTable):
2022-11-16 15:08:39 +00:00
for var in variables:
print("|---", end='')
print('|-----|')
for var in variables:
print("| " + var, end=' ')
print(f"{'| f() |'}")
for var in variables:
print("|---", end='')
print('|-----|')
2022-11-17 12:08:42 +00:00
for key, value in truthTable.items():
2022-11-16 15:08:39 +00:00
for char in key:
print("| " + char, end=' ')
print(f"| {value} |")
for var in variables:
print("|---", end='')
print('|-----|')
if __name__ == '__main__':
main()