def intro(n):
 print("+----------------------+");print("| "+n+" |");print("|   ___(o )> quack!    |");print("|   by DuckieDai       |");print("+----------------------+");input("ENTER to start: ")
def num(s):
 while 1:
  try:return float(input(s))
  except:print("Enter a number")
def pos(s):
 while 1:
  x=num(s)
  if x>0:return x
  print("Must be positive")
def pick(s,m):
 while 1:
  try:
   x=int(input(s))
   if x>0 and x<=m:return x
  except:pass
  print("Invalid choice")
intro("MICHAELIS-MENTEN")
print("1 v0 2 Vmax 3 Km");print("4 S 5 %Vmax 6 target S")
c=pick("Choose 1-6: ",6)
if c==1:
 m=pos("Vmax: ");s=num("[S]: ");k=pos("Km: ");v=m*s/(k+s)
 print("v0 =",v)
elif c==2:
 v=pos("v0: ");s=pos("[S]: ");k=pos("Km: ");print("Vmax =",v*(k+s)/s)
elif c==3:
 v=pos("v0: ");m=pos("Vmax: ");s=pos("[S]: ")
 if v>=m:print("v0 must be below Vmax")
 else:print("Km =",s*(m-v)/v)
elif c==4:
 v=pos("v0: ");m=pos("Vmax: ");k=pos("Km: ")
 if v>=m:print("v0 must be below Vmax")
 else:print("[S] =",v*k/(m-v))
elif c==5:
 s=num("[S]: ");k=pos("Km: ");print("% Vmax =",100*s/(k+s))
else:
 p=pos("Target %: ")/100;k=pos("Km: ")
 if p>=1:print("Target must be below 100%")
 else:print("[S] =",p*k/(1-p))
input("ENTER for guide: ");print("S=Km gives 50% Vmax");print("DuckieDai: done!");input("ENTER to exit: ")
