|
def _calc_func(argc, func): |
|
res = [] |
|
for i in range(2 ** argc): |
|
args = [ i >> n & 1 for n in range(argc) ] |
|
argres = 1 if func(*args) & 1 else 0 |
|
res.append((args, argres)) |
|
return res |
|
|
|
def _print_func(argc, argv, res): |
|
endcol = 'out' |
|
sxcols = argc * 2 + 1 |
|
dxcols = len(endcol) + 2 |
|
sxsep = chr(9472) * sxcols |
|
dxsep = chr(9472) * dxcols |
|
|
|
# ┌───────┬─────┐ |
|
print(chr(9484), end='') |
|
print(sxsep, end='') |
|
print(chr(9516), end='') |
|
print(dxsep, end='') |
|
print(chr(9488)) |
|
|
|
# │ a b c │ out │ |
|
print(chr(9474), end=' ') |
|
for arg in argv: print(arg, end=' ') |
|
print(chr(9474), end=' ') |
|
print(endcol, end=' ') |
|
print(chr(9474)) |
|
|
|
for n, (args, out) in enumerate(res): |
|
if n % 4 == 0: |
|
# ├───────┼─────┤ |
|
print(chr(9500), end='') |
|
print(sxsep, end='') |
|
print(chr(9532), end='') |
|
print(dxsep, end='') |
|
print(chr(9508)) |
|
|
|
# │ 0 1 0 │ 1 │ |
|
print(chr(9474), end=' ') |
|
for arg in args: print(arg, end=' ') |
|
print(chr(9474), end=' ') |
|
print(' ' + str(out) + ' ', end=' ') |
|
print(chr(9474)) |
|
|
|
# └───────┴─────┘ |
|
print(chr(9492), end='') |
|
print(sxsep, end='') |
|
print(chr(9524), end='') |
|
print(dxsep, end='') |
|
print(chr(9496)) |
|
|
|
def _sop(argv, res): |
|
ones = [ args for args, val in res if val ] |
|
return ' + '.join([ ''.join([ |
|
argv[i] if one_v |
|
else argv[i] + '\u0305' |
|
for i, one_v in enumerate(one) |
|
]) for one in ones ]) |
|
|
|
def _pos(argv, res): |
|
zeros = [ args for args, val in res if not val ] |
|
zero_expr = [ '+'.join([ |
|
argv[i] if not zero_v |
|
else argv[i] + '\u0305' |
|
for i, zero_v in enumerate(zero) |
|
]) for zero in zeros ] |
|
return '(' + ') ('.join(zero_expr) + ')' |
|
|
|
def test(func): |
|
argc = func.__code__.co_argcount |
|
argv = func.__code__.co_varnames |
|
argv = [ x[0] for x in argv ] # Cut |
|
res = _calc_func(argc, func) |
|
_print_func(argc, argv, res) |
|
print('SOP:', _sop(argv, res)) |
|
print('POS:', _pos(argv, res)) |
|
|
|
def nand(a, b): |
|
return ~(a & b) & 1 |
|
|
|
def nor(a, b): |
|
return ~(a & b) & 1 |