"""DuckieDai Log/Exponent Solver
for TI-84 Plus CE Python.
"""

from math import log


def intro():
    print("LOG EXP SOLVER")
    print()
    print("      __")
    print("  ___(o )>  quack!")
    print("  \\ <_. )")
    print("   `---'")
    print("  by DuckieDai")
    print()
    print("hiddenwordscanner.com")
    print("Loading...")
    input("Press enter ")
    print("\n"*6)


def num(prompt):
    while True:
        try:
            s=input(prompt).strip()

            if "/" in s:
                a,b=s.split("/")
                return float(a)/float(b)

            return float(s)

        except Exception:
            print("Enter a number.")


def fmt(x):
    # Whole number
    if abs(x-round(x)) < 1e-9:
        return str(int(round(x)))

    # Look for a simple fraction
    for d in range(2,101):
        n=round(x*d)

        if abs(x-n/d) < 1e-8:
            return str(n)+"/"+str(d)

    # Otherwise keep decimal
    return str(round(x,8))


def goodbase(b):
    return b > 0 and b != 1


intro()

while True:

    print("LOG / EXP SOLVER")
    print("1 log_b(A)=x")
    print("2 log_b(x)=y")
    print("3 log_x(A)=y")
    print("4 log_b(ax+c)=d")
    print("5 b^x=y")
    print("6 Convert forms")
    print()

    ch=input("Choice? ")

    print("\n"*6)


    # -------------------------
    # 1. FIND LOG / EXPONENT
    # log_b(A) = x
    # -------------------------

    if ch=="1":

        print("log_b(A) = x")
        print("Find x")
        print()

        b=num("Base b? ")
        A=num("Argument A? ")

        if not goodbase(b):
            print("Bad base.")
            print("b>0 and b!=1")

        elif A<=0:
            print("Argument > 0")

        else:
            x=log(A)/log(b)

            print("\n"*4)
            print("RESULT")
            print("x =",fmt(x))
            print()
            print("Means:")
            print(fmt(b),"^",fmt(x))
            print("=",fmt(A))


    # -------------------------
    # 2. FIND ARGUMENT
    # log_b(x) = y
    # -------------------------

    elif ch=="2":

        print("log_b(x) = y")
        print("Find x")
        print()

        b=num("Base b? ")
        y=num("y? ")

        if not goodbase(b):
            print("Bad base.")
            print("b>0 and b!=1")

        else:
            x=b**y

            print("\n"*4)
            print("RESULT")
            print("x =",fmt(x))
            print()
            print("Because:")
            print("x = b^y")


    # -------------------------
    # 3. FIND BASE
    # log_x(A) = y
    # -------------------------

    elif ch=="3":

        print("log_x(A) = y")
        print("Find base x")
        print()

        A=num("Argument A? ")
        y=num("Exponent y? ")

        if A<=0:
            print("Argument > 0")

        elif y==0:
            print("No valid base")
            print("for y = 0")

        else:
            x=A**(1/y)

            print("\n"*4)

            if goodbase(x):
                print("RESULT")
                print("x =",fmt(x))
                print()
                print("Because:")
                print("x^",fmt(y),"=",fmt(A))

            else:
                print("No valid")
                print("log base.")


    # -------------------------
    # 4. SOLVE ARGUMENT
    # log_b(ax+c) = d
    # -------------------------

    elif ch=="4":

        print("log_b(ax+c)=d")
        print("Find x")
        print()

        b=num("Base b? ")
        a=num("a? ")
        c=num("c? ")
        d=num("d? ")

        if not goodbase(b):
            print("Bad base.")

        elif a==0:
            print("a cannot be 0")

        else:
            value=b**d
            x=(value-c)/a

            print("\n"*4)
            print("RESULT")
            print("x =",fmt(x))
            print()
            print("Step:")
            print("ax+c =",fmt(value))


    # -------------------------
    # 5. EXPONENTIAL
    # b^x = y
    # -------------------------

    elif ch=="5":

        print("b^x = y")
        print("Find x")
        print()

        b=num("Base b? ")
        y=num("Result y? ")

        if not goodbase(b):
            print("Bad base.")

        elif y<=0:
            print("y must be > 0")

        else:
            x=log(y)/log(b)

            print("\n"*4)
            print("RESULT")
            print("x =",fmt(x))
            print()
            print("Log form:")
            print("log_",fmt(b))
            print("(",fmt(y),") =",fmt(x))


    # -------------------------
    # 6. FORM CONVERTER
    # -------------------------

    elif ch=="6":

        print("FORM CONVERTER")
        print()
        print("1 Log -> Exp")
        print("2 Exp -> Log")
        print()

        form=input("Choice? ")

        print("\n"*5)

        if form=="1":

            print("log_b(A)=x")
            print()

            b=input("Base b? ")
            A=input("Argument A? ")
            x=input("Answer x? ")

            print("\n"*4)
            print("EXP FORM:")
            print(A+"="+b+"^"+x)

        elif form=="2":

            print("b^x=A")
            print()

            b=input("Base b? ")
            x=input("Exponent x? ")
            A=input("Result A? ")

            print("\n"*4)
            print("LOG FORM:")
            print("log_"+b+"("+A+")")
            print("="+x)

        else:
            print("Choose 1 or 2.")


    else:
        print("Choose 1-6.")


    print()
    again=input("Again? y/n: ")

    if again.lower()!="y":
        break

    print("\n"*7)


print()
print("DuckieDai says: done!")
print("hiddenwordscanner.com")
