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
|
|
|
|
|
2023-02-20 22:21:57 +00:00
|
|
|
function = sys.argv[1]
|
|
|
|
|
|
|
|
validVariables = r"[a-z]"
|
|
|
|
validOperators = ['+', '*', '(', ')', '~', ' ', '0', '1']
|
2022-11-16 15:08:39 +00:00
|
|
|
|
2023-02-20 22:21:57 +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
|
|
|
|
2023-02-20 22:21:57 +00:00
|
|
|
variables = re.findall(validVariables, function)
|
|
|
|
variables = list(dict.fromkeys(variables))
|
|
|
|
variables.sort()
|
2022-11-16 15:08:39 +00:00
|
|
|
|
2023-02-20 22:21:57 +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] == '~':
|
2023-02-22 12:01:24 +00:00
|
|
|
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
|
2023-02-22 12:01:24 +00:00
|
|
|
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()
|