-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathtable_generator.py
More file actions
102 lines (77 loc) · 2.65 KB
/
table_generator.py
File metadata and controls
102 lines (77 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# generate a truth table for some statements
from expression_evaluator import expr_eval
from latex_from_table import latexify
from collections import OrderedDict
import sys
def table(nv):
arr = list([list([(j//(2**(nv-i-1)))%2 for j in range(2**nv)]) for i in range(nv)])
for j in range(len(arr)):
for k in range(2**nv):
arr[j][k] = True if arr[j][k] == 0 else False
return arr
def array_print(arr):
s = ''
for row in arr:
for i in row: s += '\t' + str(i)
s += '\n'
return s
def table_print(arr):
# transpose
for row in range(len(arr)):
arr[row] = tuple(arr[row])
arr = list(zip(*arr))
return array_print(arr)
# augment matrix by adding another column
# the column should be able to take values from previous rows
def augment(arr, expr):
# first build up columns, then concatenate
# iterate through rows of table and evaluate each one
arr.append([]) # new "column" to be added
var_dict = OrderedDict()
for v in variables: var_dict[v] = None
for i in range(len(arr[0])):
for v in range(len(variables)): var_dict[variables[v]] = arr[v][i]
expression = expr_eval(expr, var_dict)
arr[len(arr)-1].append(expression)
return arr
# get user input
if __name__ == '__main__':
# basic argument parsing without argparse
# (there are only two arguments, argparse would be overkill)
try:
arg_1 = sys.argv[1]
try:
arg_2 = sys.argv[2]
except:
arg_2 = None
except:
arg_1, arg_2 = None, None
variables = input('Enter variable names separated by spaces: ').split(' ')
expr = input('Enter a logical expression of your variables: ')
expressions = [expr]
last = False
while last != '':
last = input('Enter another expression or hit <Return> to proceed: ')
if last != '': expressions.append(last)
s = ''
for v in variables:
s += '\t' + v
for e in expressions:
s += '\t' + e
s += '\n'
out = table(len(variables))
for e in expressions:
out = augment(out,e)
# no arguments
if arg_1 is None and arg_2 is None:
print(s + table_print(out))
elif arg_1 == 'latex' and arg_2 is None:
print(latexify(s + table_print(out)))
elif arg_1 == 'latex' and arg_2 == 'short':
print(latexify(s + table_print(out), False))
else:
print('Invalid arguments detected:',
'First argument: ' + arg_1,
'Second argument: ' + arg_2,
'Printing default output:', sep = '\n')
print(s + table_print(out))