from math import log
def intro(n):
 t=n[:16];l=(16-len(t))//2;r=16-len(t)-l
 print("+----------------------+");print("|   "+" "*l+t+" "*r+"   |");print("|       __             |");print("|   ___(o )>  quack!   |");print("|   \\ <_. )           |");print("|    `---'             |");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("BUFFER PH")
print("HENDERSON-HASSELBALCH");print("1 pH  2 pKa");print("3 A-/HA  4 find A or HA")
c=pick("Choose 1-4: ",4)
if c==1:
 p=num("pKa: ");r=pos("[A-]: ")/pos("[HA]: ");print("pH =",p+log(r,10))
elif c==2:
 p=num("pH: ");r=pos("[A-]: ")/pos("[HA]: ");pk=p-log(r,10);print("pKa =",pk);print("Ka =",10**(-pk))
elif c==3:
 r=10**(num("pH: ")-num("pKa: "));print("A-/HA =",r)
else:
 r=10**(num("pH: ")-num("pKa: "));q=pick("1 A- 2 HA: ",2)
 if q==1:print("[A-] =",pos("[HA]: ")*r)
 else:print("[HA] =",pos("[A-]: ")/r)
if r==1:print("pH=pKa")
elif r>1:print("Base form dominates")
else:print("Acid form dominates")
input("ENTER for guide: ");print("Best buffer: pH near pKa");print("DuckieDai: done!");input("ENTER to exit: ")
