Skip to content

Instantly share code, notes, and snippets.

@astonm
Created January 13, 2021 04:10
Show Gist options
  • Save astonm/14df5932e0591b33a6148ebbef737cf9 to your computer and use it in GitHub Desktop.
Save astonm/14df5932e0591b33a6148ebbef737cf9 to your computer and use it in GitHub Desktop.
import sys
def gen_digit_packing(a_val, b_val):
a = var("a")
b = var("b")
out = var("out")
p = []
p.extend(assign(a, a_val))
p.extend(assign(b, b_val))
p.extend(assign(out, 0))
for _ in range(4):
p.extend(assign(a, shift_right(a)))
p.extend(assign(b, shift_right(b)))
for _ in range(4):
p.extend(modulo(a, 10))
p.extend(assign(a, shift_right(a)))
p.extend(assign(out, binop(out, "*", 10)))
p.extend(assign(out, binop(out, "+", retvar())))
p.extend(modulo(b, 10))
p.extend(assign(b, shift_right(b)))
p.extend(assign(out, binop(out, "*", 10)))
p.extend(assign(out, binop(out, "+", retvar())))
p.extend(debug(a))
p.extend(debug(b))
p.extend(debug(out))
return p
# -----------------------------------#
def var(name):
# vars are just strings
return name
def retvar():
return var("ret")
def tmpvar(tmpcounter=[0]):
tmpcounter[0] += 1
return var(f"tmp{tmpcounter[0]}")
def binop(expr1, op, expr2):
# expressions return strings
return f"{expr1} {op} {expr2}"
def assign(var, expr):
# statements return lists
return [f"{var} = {expr}"]
def shift_right(var, n=1):
return binop(var, "//", 10) # n.b. rounding integer divide
def modulo(var, expr):
# returns value in retvar
tmp = tmpvar()
return (
assign(tmp, shift_right(var))
+ assign(tmp, binop(tmp, "*", 10))
+ assign(retvar(), binop(var, "-", tmp))
)
def debug(var): # easy way to see the values when running code as python
return ["print(f'{" + var + "=}')"]
def output_program(program):
for line in program:
print(line)
print()
if __name__ == "__main__":
if len(sys.argv) == 3:
a, b = map(int, sys.argv[1:3])
else:
a, b = 24680000, 13570000
output_program(gen_digit_packing(a, b))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment