def find_non_0_ohne(A):
    prec = std.get_prec("int")
    if type(A[0]) == list:
        A = transp_ohne(A)
        for row in A:
            n = 0
            for item in row:
                if round(item, prec) != 0:
                    return n
                n += 1
        return False

    elif isinstance(A[0], Number):
        n = 0
        for item in A:
            if item != 0:
                return n
            n += 1
        return False
    else:
        err_far = std.get_color("err")
        raise cla.InputError(
            colored(
                f"Ich hab ehrlich keine Ahnung was falsch ist. Die Funktion sollte sowieso nicht benutzt werden und keine Ahnung. Hier noch das A:\n{A}",
                err_far))
def absvec(v, prec, color=None):
    summe = sum(item**2 for item in v.v)
    wert = math.sqrt(summe)
    v_darst = std.format_prec(v.v, prec, mehrere=False, klammer=True)
    summe_darst = std.format_prec(summe, prec)
    wert_darst = std.format_prec(wert, prec)
    sqrt_1, sqrt_2 = f"√{v_darst[0]}² + {v_darst[1]}²", f"√{summe_darst}"
    if v.dim == 3:
        sqrt_1 += f" + {v_darst[2]}²"

    forma_1 = f"_<{len(sqrt_1)}"
    forma_2 = f"_<{len(sqrt_2)}"

    cprint(f"{' ':{forma_1}}   {' ':{forma_2}}", color)
    cprint(f"{sqrt_1} = {sqrt_2} = {wert_darst}", color)

    return
def conv_norm0_formel(n, prec, color=None, print_=True):
    bruch = std.format_prec(["1", f"|{n.buchst}|"],
                            mehrere=False,
                            bruch=True,
                            string=True,
                            ausrichtung="mitte")
    out = [
        "Die allgemeine Formel für den Normaleneinheitsvektor lautet:\n",
        f"{' ' * len(f'{n.buchst}₀ = ')}{n.pfeil}   {bruch[0]}",
        f"{n.buchst}₀ = {n.buchst} ∙ {bruch[1]}"
    ]
    if n.has_pfeil:
        out.append(
            f"{' ' * len(f'{n.buchst}₀ = ')}{' ' * len(n.buchst)}     {n.pfeil}"
        )
    out.append(
        f"{' ' * len(f'{n.buchst}₀ = ')}{' ' * len(n.buchst)}   {bruch[2]}")

    if print_:
        for item in out:
            cprint(item, color)

    return out
Esempio n. 4
0
def main():
    config = std.load_config()
    prec_1 = config["Nachkommastellen 1"]
    prec_2 = config["Nachkommastellen 2"]
    prec_3 = config["Nachkommastellen 3"]
    prec_parser = config["Nachkommastellen Parser"]
    prec_int = config["Nachkommastellen Intern"]

    zwi_far, zwi_zwi_far, end_far, abs_far, men_far, err_far, ein_far = std.get_color(
        value=False)
    err = cla.Input()

    while err.error:
        cprint(
            "Willkommen bei dem Analytischen Geometrie-Rechner von Mattis Seebeck.\n",
            men_far.en)
        cprint("Welche Funktionalität möchtest du benutzen?", men_far.en)
        cprint("Zur Auswahl steht:\n", men_far.en)
        cprint("0: Standardeinsetellungen ändern", men_far.en)
        cprint("1: Standard Operationen ohne Rechenweg", men_far.en)
        cprint("2: Standard Operationen mit  Rechenweg", men_far.en)
        cprint("3: Lineare Algebra ohne Rechenweg", men_far.en)
        cprint("4: Lineare Algebra mit  Rechenweg", men_far.en)

        func = std.user_input(err, max_amount=4, min_amount=0)

    err.error = True
    darst = None
    if func == 0:
        while True:
            err.error = True
            while err.error:
                cprint("Veränderbare Einstellungen:\n", men_far.en)
                cprint("0: Standards wiederherstellen", men_far.en)
                cprint("1: Farben verändern", men_far.en)
                cprint("2: Anzahl der Nachkommastellen verändern", men_far.en)
                cprint("3: Variablen verändern", men_far.en)
                cprint("4: Diverses", men_far.en)
                cprint("5: Rechen- und Lösungswege", men_far.en)

                einst = std.user_input(err, max_amount=5, min_amount=0)

            err.error = True
            standards = False

            if einst == 0:
                standards = True
                std.save_config_standard()

            elif einst == 1:
                while err.error:
                    for i, (color, item) in enumerate(zip(
                            std.get_color(value=False),
                            std.format_prec(
                                std.get_iter("config_farben_darst"),
                                string=True,
                                ausrichtung="links",
                                dotted=True,
                                dotted_len=2)),
                                                      start=1):
                        cprint(f"{i}: {item}", men_far.en, end="")
                        cprint(color.de, color.en)
                        print()

                    einst = std.user_input(err, max_amount=7)

                err.error = True
                while err.error:
                    cprint("Welche Farbe möchtest du wählen?\n")
                    std.display_farben()

                    far, darst = std.user_input(err, string=True, farben=True)

                neu_far = cla.Farbe(far, darst)

                for i, item in enumerate(std.get_iter("config_farben"),
                                         start=1):
                    if einst == i:
                        std.save_config(item, neu_far.de)
                        break

            elif einst == 2:
                while err.error:
                    for i, (prec, item) in enumerate(zip(
                            std.get_prec(),
                            std.format_prec(std.get_iter("config_prec_darst"),
                                            string=True,
                                            ausrichtung="links",
                                            dotted=True,
                                            dotted_len=4)),
                                                     start=1):
                        cprint(f"{i}: {item}{prec}", men_far.en)
                        print()

                    einst = std.user_input(err, max_amount=5)

                err.error = True
                while err.error:
                    if einst == 5:
                        cprint(
                            "Mit wie vielen Nachkommastellen soll gerechnet werden?",
                            men_far.en)

                    else:
                        cprint(
                            "Wie viele Nachkommastellen sollen angezeigt werden? Maximal 15",
                            men_far.en)

                    prec = std.user_input(err, max_amount=15)

                for i, item in enumerate(std.get_iter("config_prec")):
                    if einst == i:
                        std.save_config(item, prec)
                        break

            elif einst == 3:
                while err.error:
                    for i, (conf, item) in enumerate(zip(
                            std.get_iter("config_buchst"),
                            std.format_prec(
                                std.get_iter("config_buchst_darst"),
                                string=True,
                                ausrichtung="links",
                                dotted=True,
                                dotted_len=4)),
                                                     start=1):
                        pass
                    for i, (conf, item) in enumerate(zip(
                            std.get_iter("config_buchst"),
                            std.format_prec(
                                std.get_iter("config_buchst_darst"),
                                string=True,
                                ausrichtung="links",
                                dotted=True,
                                dotted_len=4)),
                                                     start=1):
                        if isinstance(config[conf], list):
                            cprint(f"    {' ' * len(item)}{config[conf][0]}",
                                   men_far.en)
                            cprint(f"{i:<2}: {item}{config[conf][1]}",
                                   men_far.en)
                            print()

                        else:
                            cprint(f"{i:<2}: {item}{config[conf]}", men_far.en)
                            print()

                    einst = std.user_input(err, max_amount=19)

                err.error = True
                pfeil = False
                while err.error:
                    cprint(
                        'Tipp: Wenn du "pfeil" in die Eingabe schreibst, wird der Buchstabe mit pfeil angezeigt\n',
                        men_far.en)
                    cprint("Was für ein Buchstabe soll zugewiesen werden?")

                    buchst = std.user_input(err, string=True)
                    if buchst == "pfeil":
                        pfeil = True
                        err.error = True

                buchst = std.format_prec(buchst,
                                         ausrichtung="links",
                                         string=True,
                                         pfeil=pfeil)

                for i, item in enumerate(std.get_iter("config_buchst"),
                                         start=1):
                    if einst == i:
                        std.save_config(item, buchst)
                        break

            elif einst == 4:
                while err.error:
                    for i, (conf, item) in enumerate(zip(
                            std.get_iter("config_divers"),
                            std.format_prec(
                                std.get_iter("config_divers_darst"),
                                string=True,
                                ausrichtung="links",
                                dotted=True,
                                dotted_len=4)),
                                                     start=1):
                        if isinstance(config[conf], bool):
                            if config[conf]:
                                conf = "Ja"
                            else:
                                conf = "Nein"
                        else:
                            conf = config[conf]
                        cprint(f"{i}: {item}{conf}", men_far.en)
                        print()

                    einst = std.user_input(err, max_amount=i)

                err.error = True
                while err.error:
                    cprint("Ja oder Nein?", men_far.en)

                    wert = std.user_input(err, string=True, ja=True, nein=True)

                if einst == 1:
                    std.save_config("Bruch", wert)

                elif einst == 2:
                    std.save_config("Komma", wert)

                elif einst == 3:
                    std.save_config("Gauss Pretty", wert)

                elif einst == 4:
                    std.save_config("Gauss Fast", wert)

            elif einst == 5:
                while err.error:
                    for i, (conf, item) in enumerate(zip(
                            std.get_iter("config_lösung"),
                            std.format_prec(
                                std.get_iter("config_lösung_darst"),
                                string=True,
                                ausrichtung="links",
                                dotted=True,
                                dotted_len=4)),
                                                     start=1):
                        if isinstance(config[conf], bool):
                            if config[conf]:
                                conf = "Ja"
                            else:
                                conf = "Nein"
                        else:
                            conf = config[conf]
                        cprint(f"{f' {i}' if i < 10 else i}: {item}{conf}",
                               men_far.en)
                        print()

                    einst = std.user_input(err, max_amount=i)

                err.error = True

                if 1 <= einst <= 10:
                    while err.error:
                        cprint(
                            f"Soll ein {std.get_iter('config_lösung_darst')[einst - 1]} angezeigt werden?",
                            men_far.en)

                        wert = std.user_input(err,
                                              ja=True,
                                              nein=True,
                                              string=True)

                elif 11 <= einst <= 13:
                    while err.error:
                        cprint(
                            f"Welcher {std.get_iter('config_lösung_darst')[einst - 1]} soll gewählt werden?\n",
                            men_far.en)
                        cprint("1: Lineares Gleichungsystem", men_far.en)
                        cprint("2: Einsetzen in die Koordinatenform",
                               men_far.en)
                        if einst > 11:
                            cprint("3: Passend")

                        wert = std.user_input(
                            err,
                            max_amount=3 if einst > 11 else 2,
                            erlaubte_werte=["lgs", "koor", "passend"])

                    if wert == 1:
                        wert = "lgs"
                    elif wert == 2:
                        wert = "koor"
                    elif wert == 3:
                        wert = "passend"

                elif 14 <= einst <= 19:
                    lsg = []
                    if einst in [14, 16]:
                        lsg = ["hilf", "geo"]
                    else:
                        lsg = ["hnf", "lfp"]
                    while err.error:
                        cprint(
                            f"Welcher {std.get_iter('config_lösung_darst')[einst - 1]} soll gewählt werden?\n",
                            men_far.en)
                        for i, item in enumerate(lsg, start=1):
                            if item == "lfp":
                                cprint(f"{i}: Lotfußpunkt", men_far.en)
                            elif item == "hnf":
                                cprint(f"{i}: Hessesche Normalenform",
                                       men_far.en)
                            elif item == "hilf":
                                cprint(f"{i}: Hilfsebene", men_far.en)
                            elif item == "geo":
                                cprint(f"{i}: Geometrischer Ansatz",
                                       men_far.en)

                        wert = std.user_input(err,
                                              max_amount=i,
                                              erlaubte_werte=lsg)

                    wert = lsg[wert - 1]

                for i, item in enumerate(std.get_iter("config_lösung"),
                                         start=1):
                    if einst == i:
                        std.save_config(item, wert)
                        break

            config = std.load_config()
            prec_1 = config["Nachkommastellen 1"]
            prec_2 = config["Nachkommastellen 2"]
            prec_3 = config["Nachkommastellen 3"]
            prec_parser = config["Nachkommastellen Parser"]
            prec_int = config["Nachkommastellen Intern"]

            zwi_far, zwi_zwi_far, end_far, abs_far, men_far, err_far, ein_far = std.get_color(
                value=False)
            std.cls()

            if standards:
                cprint("Standards erfolgreich wiederhergestellt!", men_far.en)
            else:
                cprint("Einstellung erfolgreich verändert!", men_far.en)

            cprint("\nMöchtest du noch etwas verändern?", men_far.en)
            err.error = True
            back = std.user_input(err,
                                  string=True,
                                  ja=True,
                                  nein=True,
                                  random=True,
                                  erlaubte_werte="")
            if back == "r":
                if random.randint(0, 1):
                    return

            elif not back:
                return

    elif func in [1, 2]:
        if func == 1:
            rweg = "Ohne"
            rechenweg = False
        else:
            rweg = "Mit"
            rechenweg = "force"

        while err.error:
            cprint(
                f"Welche Operation möchtest du benutzen ({rweg} Rechenweg)?\n",
                men_far.en)
            cprint("1:  Vektor aus zwei Punkten berechnen", men_far.en)
            cprint("2:  Gerade aus zwei Punkten berechnen", men_far.en)
            cprint("3:  Ebene aus drei Punkten berechnen", men_far.en)
            cprint("4:  Betrag eines Vektors berechnen", men_far.en)
            cprint("5:  Normalenvektor berechnen", men_far.en)
            cprint("6:  Normaleneinheitsvektor berechnen", men_far.en)
            cprint("7:  Skalarprodukt berechnen", men_far.en)
            cprint("8:  Lineare Abhängigkeit testen", men_far.en)
            cprint("9:  Punktprobe von Punkt und Gerade", men_far.en)
            cprint("10: Punktprobe von Punkt Ebene", men_far.en)
            cprint("11: Schnittpunkt zweier Geraden berechnen", men_far.en)
            cprint("12: Schnittpunkt von Gerade und Ebene berechnen",
                   men_far.en)
            cprint("13: Schnittgerade zweier Ebenen berechnen", men_far.en)
            cprint("14: Schnittwinkel zweier Geraden berechnen", men_far.en)
            cprint("15: Schnittwinkel von Gerade und Ebene berechnen",
                   men_far.en)
            cprint("16: Schnittwinkel zweier Ebenen berechnen", men_far.en)
            cprint("17: Umrechnung zwischen Ebenengleichungen", men_far.en)
            cprint("18: Sind die eingegebenen Ebenen gleich?", men_far.en)
            cprint("19: Abstand zwischen Punkt und Gerade berechnen",
                   men_far.en)
            cprint("20: Abstand zwischen zwei Geraden berechnen", men_far.en)
            cprint("21: Abstand zwischen Punkt und Ebene berechnen",
                   men_far.en)
            cprint("22: Abstand zwischen Gerade und Ebene berechnen",
                   men_far.en)
            cprint("23: Abstand zwischen Ebene und Ebene berechnen",
                   men_far.en)
            operation = std.user_input(err, max_amount=23)

        if operation in [1, 2]:
            P = std.parser("punkt")
            Q = std.parser("punkt", buchst="Q", weitere=P)
            parsed = [P, Q]

        elif operation == 3:
            P = std.parser("punkt")
            Q = std.parser("punkt", buchst="Q", weitere=P)
            T = std.parser("punkt", buchst="T", weitere=(P, Q))
            parsed = [P, Q, T]

        elif operation == 4:
            parsed = [std.parser("vektor")]

        elif operation in [5, 6, 7]:
            u = std.parser("vektor", buchst="u")
            v = std.parser("vektor", weitere=u)
            parsed = [u, v]

        elif operation == 8:
            parsed = std.parser("linear abhängig")

        elif operation in [9, 19]:
            P = std.parser("punkt")
            g = std.parser("gerade", weitere=P)
            parsed = [P, g]

        elif operation in [10, 21]:
            darst = std.input_darst_ebene()
            P = std.parser("punkt")
            E = std.parser("ebene", darst=darst, weitere=P)
            parsed = [P, E]

        elif operation in [11, 14, 20]:
            g = std.parser("gerade")
            h = std.parser("gerade", buchst="h", weitere=g, param="s")
            parsed = [g, h]

        elif operation in [12, 15, 22]:
            darst = std.input_darst_ebene()
            g = std.parser("gerade")
            E = std.parser("ebene", darst=darst, weitere=g)
            parsed = [g, E]

        elif operation in [13, 16, 18, 23]:
            darst = std.input_darst_ebene(erste=True, zweite=True)
            E = std.parser("ebene", darst=darst[0])
            F = std.parser("ebene",
                           darst=darst[1],
                           buchst="F",
                           weitere=E,
                           param=["u", "v"])
            parsed = [E, F]

        elif operation == 17:
            darst = std.input_umrechnen(von=True, nach=True)
            E = std.parser("ebene", darst=darst[0])
            parsed = [E]

        stdop.standardoperationen(parsed, operation, rechenweg, darst)

    elif func in [3, 4]:
        if func == 3:
            Rweg = "Ohne"
            rechenweg = False

        else:
            Rweg = "Mit"
            rechenweg = "force"

        while err.error:
            cprint(
                f"Welche Operation möchtest du benutzen ({Rweg} Rechenweg)?\n",
                men_far.en)
            for i, item in enumerate(std.get_iter("operation_lagl_darst"),
                                     start=1):
                cprint(f"{i}: {item}", men_far.en)

            operation = std.user_input(err, max_amount=i)

        A, B = None, None
        if operation == 1:
            darst = std.input_nxm_mat(num="erste"), std.input_nxm_mat(
                num="zweite")
            A = std.parser("matrix", darst[0], True)
            std.cls()
            B = std.parser("matrix", darst[1], True, buchst="B", weitere=A)

        elif operation == 2:
            darst = std.input_nxm_mat()
            cprint(f"Die Matrix hat eine {darst[0]} × {darst[1]} Dimension",
                   men_far.en)
            A = std.parser("matrix", darst, True, param=True)

        s = time.time()
        stdop.standardoperationen_lagl([A, B], operation, rechenweg, darst)

    return True
Esempio n. 5
0
            B = std.parser("matrix", darst[1], True, buchst="B", weitere=A)

        elif operation == 2:
            darst = std.input_nxm_mat()
            cprint(f"Die Matrix hat eine {darst[0]} × {darst[1]} Dimension",
                   men_far.en)
            A = std.parser("matrix", darst, True, param=True)

        s = time.time()
        stdop.standardoperationen_lagl([A, B], operation, rechenweg, darst)

    return True


if __name__ == "__main__":
    std.cls()
    menu_far = std.get_color("men")

    y = True

    error = cla.Input()
    while y:
        x = main()
        if x:
            cprint("\n", menu_far)
            cprint("Nochmal?", menu_far)
            error.error = True
            y = std.user_input(error,
                               string=True,
                               ja=True,
                               nein=True,
def lgs_probe(A_1, A_2, x, b, prec, nummer=2, color=None, print_=True):
    prec_int = std.get_prec("int")
    A_1_darst = std.format_prec(A_1[nummer], prec, mehrere=False)
    A_2_darst = std.format_prec(A_2[nummer], prec, mehrere=False, absval=True)
    x_darst = std.format_prec(x, prec, mehrere=False, klammer=True)
    b_darst = std.format_prec(b[nummer], prec, mehrere=False)
    nchk = std.negcheck(A_2[nummer])

    out = [
        f"Einsetzen in {std.roman(nummer + 1)}:\n",
        f"{std.roman(nummer + 1)}.  {A_1_darst} ∙ {x_darst[0]} {nchk[0]} {A_2_darst} ∙ {x_darst[1]} = {b_darst}"
    ]

    A_1_darst = std.format_prec(A_1[nummer] * x[0], prec, mehrere=False)
    A_2_darst = std.format_prec(A_2[nummer] * x[1],
                                prec,
                                mehrere=False,
                                absval=True)
    b_darst = std.format_prec(b[nummer], prec, mehrere=False)
    nchk = std.negcheck(A_2[nummer] * x[1])
    out.append("\n")
    out.append("Vereinfachen:\n")
    out.append(
        f"{std.roman(nummer + 1)}.  {A_1_darst} {nchk[0]} {A_2_darst} = {b_darst}"
    )

    wert = A_1[nummer] * x[0] + A_2[nummer] * x[1]
    wert_darst = std.format_prec(wert, prec)

    if round(wert, prec_int) == round(b[nummer], prec_int):
        zeichen = "="
    else:
        zeichen = "≠"
    out.append("\n")
    out.append("Zusammenfassen:\n")
    out.append(
        colored(f"{std.roman(nummer + 1)}.  {wert_darst} {zeichen} {b_darst}",
                color))

    if print_:
        for item in out:
            print(item)

    return out
def schnittwinkel_formel(inp_1,
                         inp_2,
                         typ=None,
                         print_=True,
                         ausrechnen=False,
                         umstellen=False,
                         winkel="α",
                         color=None):
    buchst = [None, None]
    if typ is None:
        typ = [None, None]

    if ausrechnen is True:
        ausrechnen = "F"

    # Buchstaben Parsen
    if isinstance(inp_1, cla.Gerade):
        buchst[0] = inp_1.param
        typ[0] = "gerade"

    elif isinstance(inp_1, cla.Ebene):
        if typ[1] == "ebene" or isinstance(inp_2, cla.Ebene):
            buchst[0] = "n₁"
        else:
            buchst[0] = "n"

    else:
        if typ[0] == "gerade":
            buchst[0] = "r"
        elif typ[0] == "ebene":
            if typ[1] == "ebene" or isinstance(inp_2, cla.Ebene):
                buchst[0] = "n₁"
            else:
                buchst[0] = "n"

    if isinstance(inp_2, cla.Gerade):
        buchst[1] = inp_2.param
        typ[1] = "gerade"

    elif isinstance(inp_2, cla.Ebene):
        if typ[0] == "ebene":
            buchst[1] = "n₂"
        else:
            buchst[1] = "n"

    else:
        if typ[1] == "gerade":
            buchst[1] = "r"
        elif typ[1] == "ebene":
            if typ[0] == "ebene":
                buchst[1] = "n₁"
            else:
                buchst[1] = "n"

    if ausrechnen:
        prec, prec_2 = std.get_prec([1, 2])

        if typ[0] == "gerade":
            v1 = inp_1.rv.copy()
            inp_1_darst = inp_1.display(prec=prec, nur="rv", print_=False)
        else:
            v1 = inp_1.nv.copy()
            inp_1_darst = inp_1.display(prec=prec,
                                        nur="nv",
                                        darst="norm",
                                        print_=False)

        if typ[1] == "gerade":
            v2 = inp_2.rv.copy()
            inp_2_darst = inp_2.display(prec=prec, nur="rv", print_=False)
        else:
            v2 = inp_2.nv.copy()
            inp_2_darst = inp_2.display(prec=prec,
                                        nur="nv",
                                        darst="norm",
                                        print_=False)

        if "bruch" in ausrechnen:
            bruch_darst = std.format_prec(abs(ber.skalarprodukt(v1, v2)) /
                                          (ber.absvec(v1) * ber.absvec(v2)),
                                          prec_2,
                                          liste=True)

        else:
            if "oben" in ausrechnen:
                forma_list = [f"|{ber.skalarprodukt(v1, v2)}|"]
                if "unten" not in ausrechnen:
                    forma_list.insert(0, "")

                bruch_oben = std.format_prec(forma_list, prec, liste=True)

            else:
                bruch_oben = []
                offen_kringel = [
                    "∘" if i == int(inp_1.dim / 2) else " "
                    for i in range(inp_1.dim)
                ]

                for i in range(inp_1.dim):
                    bruch_oben.append(
                        f"┃ {inp_1_darst[i]} {offen_kringel[i]} {inp_2_darst[i]} ┃"
                    )

            if "unten" in ausrechnen:
                forma_list = [ber.absvec(v1) * ber.absvec(v2)]
                if "oben" not in ausrechnen:
                    forma_list.append("")
                    forma_list.append("")

                bruch_unten = std.format_prec(forma_list, prec, liste=True)

            else:
                bruch_unten = []
                zu_kringel = [
                    "∙" if i == int(inp_1.dim / 2) else " "
                    for i in range(inp_1.dim)
                ]

                for i in range(inp_1.dim):
                    bruch_unten.append(
                        f"┃{inp_1_darst[i]}┃ {zu_kringel[i]} ┃{inp_2_darst[i]}┃"
                    )

            bruch_darst = std.format_prec(bruch_oben + bruch_unten,
                                          bruch=True,
                                          mehrere=False,
                                          string=True,
                                          ausrichtung="mitte")

    else:
        pfeile = [std.get_pfeil(len(_)) for _ in buchst]
        bruch = [
            f" {pfeile[0]}   {pfeile[1]}", f"|{buchst[0]} ∘ {buchst[1]}|",
            f" {pfeile[0]}     {pfeile[1]}", f"|{buchst[0]}| ∙ |{buchst[1]}|"
        ]
        bruch_darst = std.format_prec(bruch,
                                      bruch=True,
                                      mehrere=False,
                                      string=True,
                                      ausrichtung="mitte")

    formel = "sin" if typ.count("gerade") == 1 and typ.count(
        "ebene") == 1 else "cos"

    formel_darst = []
    mitte = int(len(bruch_darst) / 2)
    for i in range(len(bruch_darst)):
        if umstellen:
            st = f"{winkel} = {formel}⁻¹ "
            if i == mitte:
                formel_darst.append(st)
            else:
                formel_darst.append(f" " * len(st))

        else:
            st = f"{formel}({winkel}) = "
            if i == mitte:
                formel_darst.append(st)
            else:
                formel_darst.append(" " * len(st))

    out = []
    if umstellen:
        klam = std.get_klam(inp_1.dim if "bruch" not in ausrechnen else 1)
        for fo, kl0, da, kl1 in zip(formel_darst, klam[0], bruch_darst,
                                    klam[1]):
            out.append(fo + kl0 + da + kl1)
    else:
        for a, b in zip(formel_darst, bruch_darst):
            out.append(a + b)

    if print_:
        for _ in out:
            cprint(_, color)

    return out
def lgs_lösung(inp,
               prec,
               zeilen=True,
               color=None,
               param_list=None,
               print_=True):

    if isinstance(inp, (list, tuple)):
        if inp[0] == "eind":
            spez_lsg = True
            inp = inp[1:]

        elif inp[0] == "unend":
            if any(row[0] == "spez" for row in inp[1]):
                spez_lsg = True
            else:
                spez_lsg = False

            if any(isinstance(row[0], str) for row in inp[1]):
                param_list = []

            for row in inp[1]:
                if isinstance(row[0], str) and row[0] != "spez":
                    param_list.append(row[0])

            inp = [item[1:] for item in inp[1]]

        elif inp[0] == "keine":
            cprint("L = ∅", color)
            return

    if not isinstance(inp[0], (list, tuple)):
        inp = [inp]

    if zeilen is True:
        inp = transp_ohne(inp)

    # inp wird in Spaltenform bearbeitet

    prec_1, prec_int = std.get_prec([1, "int"])

    dim_n = len(inp[0])  # dim_n = Anzahl der Zeilen
    dim_m = len(inp)  # dim_m = Anzahl der Spalten

    mitte = int(dim_n / 2)

    prec = std.prec_auffüllen(prec, dim_m)

    if param_list is None:
        param_list = []
        for i in range(1, dim_m):
            param_list.append(f" {std.übersetzung_zahl_param(i)}")

    else:
        for i, item in enumerate(param_list):
            if item == "":
                continue
            if item[0] != " ":
                param_list[i] = f" {item}"

    if len(param_list) + 1 < dim_m:
        i = len(param_list) + 1
        while i < dim_m:
            param_list.append(f" {std.übersetzung_zahl_param(i)}")
            i += 1

    if spez_lsg:
        param_list.append("")

    klam_r, klam_g = std.get_klam(dim_n, "r"), std.get_klam(dim_n, "g")

    inp_darst = [std.format_prec(inp[i], prec_1) for i in range(dim_m)]

    # Strings für Darstellung:
    L_str = std.format_prec(
        ["L = " if i == mitte else "" for i in range(dim_n)],
        prec_1,
        string=True)
    param_list_str_1 = [
        std.format_prec([
            f"{param_list[i]} ∙ " if j == mitte else "" for j in range(dim_n)
        ],
                        prec_1,
                        string=True) for i in range(len(param_list))
    ]
    param_str = ""
    for i, item in enumerate(param_list):
        if i == 0:
            param_str = item.strip()
        elif item:
            param_str += f", {item.strip()}"

    if param_list:
        param_str += f" ∈ ℝ"

    param_list_str_2 = std.format_prec(
        [param_str if _ == mitte else "" for _ in range(dim_n)], string=True)

    plus_str = std.format_prec(
        [f" +" if j == mitte else "" for j in range(dim_n)], string=True)
    strich = [" │ " for i in range(dim_n)]

    out = []
    if spez_lsg:
        anfang = 1
    else:
        anfang = 0

    for i in range(dim_n):
        out.append(f"{L_str[i]}{klam_g[0][i]}")
        if spez_lsg:
            out[i] += f" {klam_r[0][i]}{inp_darst[0][i]}{klam_r[1][i]}"

        for j in range(anfang, dim_m):
            out[i] += f"{plus_str[i] if spez_lsg or j != anfang else ''}{param_list_str_1[j - 1 if spez_lsg else j][i]}{klam_r[0][i]}{inp_darst[j][i]}{klam_r[1][i]}"

        if any(param_list):
            out[i] += f"{strich[i]}{param_list_str_2[i]}"

        out[i] += f" {klam_g[1][i]}"

    if print_:
        for item in out:
            cprint(item, color)

    return out
def gauss_overset(zeile_1,
                  zeile_2,
                  operation,
                  div=None,
                  bruch_zahl_1=None,
                  bruch_zahl_2=None):
    """Gibt den Pfeil vor dem Gauss Algorithmus wieder"""
    bruch = std.get_divers("bruch")
    prec = std.get_prec(1)

    if operation in ["+", "-"]:
        operation = "+" if round(eval(f"{operation}{div}"), ) >= 0 else "-"
        div = std.format_prec(div, prec, absval=True)

        if bruch_zahl_1 is None or bruch_zahl_2 is None:
            out = f"{std.roman(zeile_1)}. {operation} {div} ∙ {std.roman(zeile_2)}."

        else:
            pfeil = std.format_prec(
                ["", f"{std.roman(zeile_1)}. {operation} ", ""],
                1,
                string=True)
            bruch_darst = std.format_prec([bruch_zahl_1, bruch_zahl_2],
                                          bruch=True,
                                          absval=True)

            out = []

            for a, b in zip(pfeil, bruch_darst):
                out.append(a + b)

            out = [
                f"{item} ∙ {std.roman(zeile_2)}."
                if i == 1 else f"{item}{' ' * (len(std.roman(zeile_2)) + 4)}"
                for i, item in enumerate(out)
            ]

    elif operation == "*":
        if bruch_zahl_1 is None or bruch_zahl_2 is None:
            div = std.format_prec(div, prec, klammer=True)
            out = f"{std.roman(zeile_2)}. ∙ {div}"

        else:
            pfeil = std.format_prec(["", f"{std.roman(zeile_1)}. ∙ ", ""],
                                    1,
                                    string=True)

            bruch_zahl_1 = (-1 if div < 0 else 1) * abs(bruch_zahl_1)
            bruch_darst = std.format_prec(
                [bruch_zahl_1, abs(bruch_zahl_2)], bruch=True, mehrere=True)

            out = []
            for a, b in zip(pfeil, bruch_darst):
                out.append(a + b)

            out = [
                f"{item} ∙ {std.roman(zeile_2)}."
                if i == 1 else f"{item}{' ' * (len(std.roman(zeile_2)) + 4)}"
                for i, item in enumerate(out)
            ]

    elif operation == "tausch":
        out = [f"{std.roman(zeile_1)}. <─> {std.roman(zeile_2)}."]

    return out
def lgs(inp,
        prec,
        b_len=1,
        operation="+",
        zeilen=False,
        b_berechnen=False,
        rev=False,
        print_param_str=True,
        color=None,
        param_list=None,
        print_param=True,
        nach_KV_umstellen=False,
        print_=True,
        string_ausrichtung=None):
    """

    Parameters
    ----------
    inp                 Darzustellende Werte. Der letzte (b_len) wert wird als b interpretiert
    prec                Anzahl der Nachkommastellen
    b_len               Die länge von b
    operation           Welche Operation angezeigt (und ggf. per b_berechnen berchnet) wird
    zeilen              Soll inp als zeilen interpretiert werden?
    b_berechnen         Soll b berechnet werden
    rev                 Soll b auf der linken Seite stehen?
    print_param_str     Soll bei leeren Strings die Parameter geprinted werden?
    color               In welcher Farbe soll alles angezeigt werden?
    param_list          Welche Parameter sollen angezeigt werden
    print_param         Sollen dei Parameter angezeigt werden
    nach_KV_umstellen   Soll nach den Kopfvariablen (einer Matrix) umgestellt werden?
    print_              Soll der Output angezeigt werden?
    string_ausrichtung  Mit welcher Ausrichtung sollen die str angezeigt werden?

    Returns
    -------
    list von Strings die geprinted werden
    """
    inp = copy.deepcopy(inp)
    if not isinstance(inp[0], list):
        inp = [inp]

    if zeilen is True:
        inp = transp_ohne(inp)
    else:
        pass
    # inp wird in Spaltenform bearbeitet
    if b_berechnen:
        inp.append([])

    prec_1, prec_int = std.get_prec([1, "int"])

    dim_n = len(inp[0])  # dim_n = Anzahl der Zeilen
    dim_m = len(inp)  # dim_m = Anzahl der Spalten

    prec = std.prec_auffüllen(prec, dim_m)

    if print_param:
        if param_list is None:
            param_list = []
            for i in range(1, dim_m):
                param_list.append(f" {std.übersetzung_zahl_param(i)}")

        else:
            for i, item in enumerate(param_list):
                if item == "":
                    continue
                if item[0] != " ":
                    param_list[i] = f" {item}"

        if len(param_list) + 1 < dim_m:
            i = len(param_list) + 1
            while i < dim_m:
                param_list.append(f" {std.übersetzung_zahl_param(i)}")
                i += 1
        param_list.append("")

    else:
        param_list = ["" for _ in range(dim_m)]

    if b_berechnen:
        neu_b = [
            inp[0][i] if operation in ["+", "-", "/"] else 1
            for i in range(dim_n)
        ]

        start = 1 if operation in ["+", "-", "/"] else 0
        for i in range(dim_n):
            for j in range(start, dim_m - 1):
                if operation == "+":
                    neu_b[i] += inp[j][i]

                elif operation == "-":
                    neu_b[i] -= inp[j][i]

                elif operation == "*":
                    neu_b[i] *= inp[j][i]

                elif operation == "/":
                    if round(inp[j][i], prec_int) == 0:
                        if neu_b[i] == 0:
                            neu_b[i] = "*"
                        else:
                            neu_b[i] = 0
                    else:
                        neu_b[i] /= inp[j][i]

        inp[-1] = neu_b

    if nach_KV_umstellen:
        n = find_NKV_ohne(ohne_b_ohne(inp, False), False)

        neu_inp = [inp[i] for i in range(len(inp)) if i not in n]
        neu_param = [param_list[i] for i in range(len(inp)) if i not in n]
        for i in range(len(inp)):
            if i in n:
                neu_inp.append([-inp[i][j] for j in range(dim_n)])
                neu_param.append(param_list[i])

        inp = neu_inp
        param_list = neu_param

        b_len += len(n)

    inp_darst, inp_darst_abs, inp_darst_vorne, inp_darst_klam = [], [], [], []
    if string_ausrichtung is None:
        string_ausrichtung = "rechts"
    for i in range(dim_m):
        inp_darst.append(
            std.format_prec(inp[i],
                            prec[i],
                            True,
                            string_ausrichtung=string_ausrichtung))
        inp_darst_abs.append(
            std.format_prec(inp[i],
                            prec[i],
                            absval=True,
                            string_ausrichtung=string_ausrichtung))
        inp_darst_vorne.append(
            std.format_prec(inp[i],
                            prec[i],
                            vorne=True,
                            string_ausrichtung=string_ausrichtung))
        inp_darst_klam.append(
            std.format_prec(inp[i],
                            prec[i],
                            klammer=True,
                            string=True,
                            string_ausrichtung=string_ausrichtung))

    if operation == "*":
        nchk = ["∙" for _ in range(dim_n)]
    elif operation == "/":
        nchk = ["/" for _ in range(dim_n)]

    if operation == "-":
        for i in range(dim_n):
            for j in range(1, dim_m - 1):
                inp[j][i] *= -1

    out = []
    for i in range(dim_n):
        # i = Counter über Zeilen
        out.append("")
        if rev:
            out[i] += colored(f"{inp_darst_vorne[-1][i]} = ", color)

        out[i] += colored(
            f"{inp_darst_vorne[0][i]}{param_list[0] if print_param_str or inp_darst_vorne[0][i].strip() else ''}",
            color)
        for j in range(1, len(inp)):
            # j = Counter über die Spalten
            if operation in ["+", "-"]:
                nchk = std.negcheck(inp[j][i])

            if j >= dim_m - b_len:
                if j == dim_m - b_len:
                    if not rev:
                        out[i] += colored(f" = {inp_darst_vorne[j][i]}", color)
                else:
                    if nach_KV_umstellen:
                        if operation in ["+", "/"]:
                            out[i] += colored(
                                f" {nchk[0]} {inp_darst_abs[j][i]}{param_list[j] if print_param_str or inp_darst_abs[j][i].strip() else ''}",
                                color)
                        else:
                            out[i] += colored(
                                f" {nchk[0]} {inp_darst_abs[j][i]}{param_list[j] if print_param_str or inp_darst_abs[j][i].strip() else ''}",
                                color)

                    else:
                        if operation in ["+", "/"]:
                            out[i] += colored(
                                f" {nchk[0]} {inp_darst_klam[j][i]}{param_list[j] if print_param_str or inp_darst_klam[j][i].strip() else ''}",
                                color)
                        else:
                            out[i] += colored(
                                f" {nchk[0]} {inp_darst_abs[j][i]}{param_list[j] if print_param_str or inp_darst_abs[j][i].strip() else ''}",
                                color)

            else:
                if operation in ["*", "/"]:
                    out[i] += colored(
                        f" {nchk[0]} {inp_darst_klam[j][i]}{param_list[j] if print_param_str or inp_darst_klam[j][i].strip() else ''}",
                        color)
                else:
                    out[i] += colored(
                        f" {nchk[0]} {inp_darst_abs[j][i]}{param_list[j] if print_param_str or inp_darst_abs[j][i].strip() else ''}",
                        color)

    if print_:
        for item in out:
            print(item)

    return out