from math import log,exp

R=.008314

def duckiedai_intro(program_name,wait=True):
 title=program_name[:16]
 empty=16-len(title)
 left=empty//2
 right=empty-left
 print("+----------------------+")
 print("|   "+" "*left+title+" "*right+"   |")
 print("|                      |")
 print("|       __             |")
 print("|   ___(o )>  quack!   |")
 print("|   \\ <_. )           |")
 print("|    `---'             |")
 print("|     by DuckieDai     |")
 print("+----------------------+")
 print("Loading...")
 if wait:
  input("Press enter to start ")
  print("\n"*6)

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 menu():
 while 1:
  try:
   x=int(input("Choose 1-3: "))
   if x>0 and x<4:return x
  except:pass
  print("Choose 1 to 3")

def dg_type(g):
 if abs(g)<1e-7:print("AT EQUILIBRIUM")
 elif g<0:print("SPONTANEOUS")
 else:print("NONSPONTANEOUS")

def k_type(k):
 if abs(k-1)<1e-7:print("K=1 equilibrium")
 elif k>1:print("Products favored")
 else:print("Reactants favored")

duckiedai_intro("GIBBS ENERGY")
print("GIBBS FREE ENERGY")
print("1 DG from H,S,T")
print("2 DG from K")
print("3 K from DG")
c=menu()

if c==1:
 h=num("DH kJ/mol: ")
 s=num("DS J/mol K: ")
 t=pos("Temp K: ")
 g=h-t*s/1000
 print("DG kJ/mol =",g)
 dg_type(g)

elif c==2:
 k=pos("K: ")
 t=pos("Temp K: ")
 g=-R*t*log(k)
 print("DG kJ/mol =",g)
 dg_type(g)
 k_type(k)

else:
 g=num("DG kJ/mol: ")
 t=pos("Temp K: ")
 try:
  k=exp(-g/(R*t))
  print("K =",k)
  k_type(k)
 except:print("K too large")

input("ENTER for guide: ")
print("QUICK GUIDE")
print("DG<0: spontaneous")
print("DG>0: nonspontaneous")
print("K>1: products")
print("K<1: reactants")
print("DuckieDai: done!")
input("ENTER to exit: ")
