diff --git a/app/app.py b/app/app.py index 3d4c30d..c75f308 100644 --- a/app/app.py +++ b/app/app.py @@ -158,6 +158,12 @@ def auswahl_verarbeiten(): elif auswahl == "Kreiszahl PI": st.session_state.output_text = tools.pi_suche(text) st.session_state.map_data = None + elif auswahl == "Eulersche Zahl": + st.session_state.output_text = tools.euler_suche(text) + st.session_state.map_data = None + elif auswahl == "phi (goldener Schnitt)": + st.session_state.output_text = tools.goldener_schnitt_suche(text) + st.session_state.map_data = None elif auswahl == "Anagrammsuche-DE": st.session_state.output_text = tools.anagramm_suche_de(text) st.session_state.map_data = None @@ -261,6 +267,8 @@ option = st.sidebar.radio("hidden_label", "Nak-Nak -> Text", "Navajo -> Text", "Kreiszahl PI", + "Eulersche Zahl", + "phi (goldener Schnitt)", "Anagrammsuche-DE", "Anagrammsuche-EN", "Wortsuche-DE", diff --git a/app/tools.py b/app/tools.py index fef31fd..2ce1cf6 100644 --- a/app/tools.py +++ b/app/tools.py @@ -1448,6 +1448,84 @@ def pi_suche(eingabetext): f'{pistr[pos:pos + 20]}...') return ausgabetext +def euler_suche(eingabetext): + eingabetext = eingabetext.rstrip() + if eingabetext == "": + return ("### Eulersche Zahl - Nachkommastellensuche\n" + "Für die eingegebene Zahl/Zahlenreihe X wird versucht die entsprechende X. Nachkommastelle auszugeben " + "und das erst Vorkommen der Zahlenreihe X innerhalb der Nachkommastellen von e " + "(2.71828182845904523.....) zu ermitteln. Aus Performance- und Speicherplatzgründen " + "ist die Suche auf die ersten 10 Millionen Nachkommastellen beschränkt.") + else: + try: + eread = open("./data/e.txt", "r") + except FileNotFoundError: + return "Sorry es scheint die Datei e.txt zu fehlen, welche von dieser Funktion benötigt wird." + else: + estr = "" + for zeile in eread: + estr = estr + zeile.rstrip() + eread.close() + elen = len(estr) - 2 + try: + zahlx = int(eingabetext) + except ValueError: + return "Sorry aber ohne gültige Zahleneingabe funktioniert das nicht!" + else: + ausgabetext = "_e (Eulersche Zahl)_ \n \n" + pos = estr.find(eingabetext) + if elen >= zahlx > 0: + ausgabetext += (f"_Die {zahlx}. Nachkommstelle lautet:_ {estr[zahlx + 1]} \n_20 Stellen ab " + f"{zahlx}. Nachkommstelle:_ {estr[zahlx + 1:zahlx + 21]}... \n \n") + else: + ausgabetext += f"_Die verwendete pi.txt kennt leider nur {elen:,} Nachkommstellen._ \n \n" + if pos == -1: + ausgabetext += f"_Zahlenreihe in {elen:,} Nachkommastellen nicht zu finden._" + else: + ausgabetext += (f'erstes Vorkommen von Zahlenfolge "{eingabetext.rstrip()}" ab {pos - 1}. ' + f'Nachkommastelle \n20 Stellen ab {pos - 1}. Nachkommstelle: ' + f'{estr[pos:pos + 20]}...') + return ausgabetext + +def goldener_schnitt_suche(eingabetext): + eingabetext = eingabetext.rstrip() + if eingabetext == "": + return ("### phi(Goldener Schnitt) Nachkommastellensuche\n" + "Für die eingegebene Zahl/Zahlenreihe X wird versucht die entsprechende X. Nachkommastelle auszugeben " + "und das erst Vorkommen der Zahlenreihe X innerhalb der Nachkommastellen von phi " + "(1.618033988749894848204586...) zu ermitteln. Aus Performance- und Speicherplatzgründen ist die " + "Suche auf die ersten 10 Millionen Nachkommastellen beschränkt.") + else: + try: + phiread = open("./data/phi.txt", "r") + except ValueError: + return "Sorry es scheint die Datei phi.txt zu fehlen, welche von dieser Funktion benötigt wird." + else: + phistr = "" + for zeile in phiread: + phistr = phistr + zeile.rstrip() + phiread.close() + philen = len(phistr) - 2 + try: + zahlx = int(eingabetext) + except ValueError: + return "Sorry aber ohne gültige Zahleneingabe funktioniert das nicht!" + else: + ausgabetext = "_phi (Goldener Schnitt)_ \n \n" + pos = phistr.find(eingabetext) + if philen >= zahlx > 0: + ausgabetext += (f"_Die {zahlx}. Nachkommstelle lautet:_ {phistr[zahlx + 1]} \n_20 Stellen ab " + f"{zahlx}. Nachkommstelle:_ {phistr[zahlx + 1:zahlx + 21]}... \n \n") + else: + ausgabetext += f"_Die verwendete pi.txt kennt leider nur {philen:,} Nachkommstellen._ \n \n" + if pos == -1: + ausgabetext += f"_Zahlenreihe in {philen:,} Nachkommastellen nicht zu finden._" + else: + ausgabetext += (f'erstes Vorkommen von Zahlenfolge "{eingabetext.rstrip()}" ab {pos - 1}. ' + f'Nachkommastelle \n20 Stellen ab {pos - 1}. Nachkommstelle: ' + f'{phistr[pos:pos + 20]}...') + return ausgabetext + def anagramm_suche_de(eingabetext): eingabetext = eingabetext.rstrip() if eingabetext == "": @@ -2980,119 +3058,6 @@ erkannt. Ausgabe.insert(1.0, "Es konnte keine römische oder arabische Zahl erkannt werden!\n", "re") -def euler_suche(): - hilfetext = """HILFE: [Eulersche Zahl - Nachkommastellensuche] -Für die eingegebene Zahl/Zahlenreihe X wird versucht die -entsprechende X. Nachkommastelle auszugeben und das erst -Vorkommen der Zahlenreihe X innerhalb der Nachkommastellen -von e (2.71828182845904523.....) zu ermitteln. - -Da es deutlich schnneller geht mit einer vorgefertigten -Datei zu suchen als die Nachkommastellen zu berechnen -wird die Datei e.txt im Unterverzeichnis "data" benötigt. -Diese Datei enthält die Zahl e mit den ersten 10 Millionen -Nachkommastellen. Wer mehr Stellen braucht, kann sich mit -dem Tool y-cruncher (http://numberworld.org/y-cruncher/) -auch eine Datei mit deutlich mehr Nachkommastellen erstellen -und e.txt damit ersetzen. (Bei 1 Millarde Stellen ist -die Datei dann allerdings schon knapp 1 GB groß und -die Abfrage dauert auch etwas länger) -""" - - eingabetext = Eingabe.get(1.0, END) - eingabetext = eingabetext.rstrip() - if eingabetext == "": - Ausgabe.insert(1.0, hilfetext + "\n") - else: - try: - eread = open("./data/e.txt", "r") - except FileNotFoundError: - Ausgabe.insert(1.0, hilfetext + "\n") - else: - estr = "" - for zeile in eread: - estr = estr + zeile.rstrip() - eread.close() - elen = len(estr) - 2 - try: - zahlx = int(eingabetext) - except ValueError: - Ausgabe.insert(1.0, "Sorry aber ohne gültige Zahleneingabe funktioniert das nicht!\n", "re") - else: - pos = estr.find(eingabetext) - if pos == -1: - Ausgabe.insert(1.0, "Zahlenreihe in {} Nachkommastellen nicht zu finden.\n\n".format(elen), "re") - else: - Ausgabe.insert(1.0, - "20 Stellen ab {}. Nachkommstelle: {}...\n\n".format(pos - 1, estr[pos:pos + 20])) - Ausgabe.insert(1.0, 'erstes Vorkommen von Zahlenfolge "{}" ab {}. Nachkommastelle\n'.format( - eingabetext.rstrip(), pos - 1)) - if elen >= zahlx > 0: - Ausgabe.insert(1.0, "20 Stellen ab {}. Nachkommstelle:" - " {}...\n\n".format(zahlx, estr[zahlx + 1:zahlx + 21])) - Ausgabe.insert(1.0, "Die {}. Nachkommstelle: lautet {}\n".format(zahlx, estr[zahlx + 1])) - else: - Ausgabe.insert(1.0, "Die verwendete e.txt kennt leider nur {} Nachkommstellen.\n\n".format(elen), - "re") - Ausgabe.insert(1.0, "e (Eulersche Zahl)\n\n", "gr") - - -def goldener_schnitt_suche(): - hilfetext = """HILFE: [phi(Goldener Schnitt) Nachkommastellensuche] -Für die eingegebene Zahl/Zahlenreihe X wird versucht die -entsprechende X. Nachkommastelle auszugeben und das erst -Vorkommen der Zahlenreihe X innerhalb der Nachkommastellen -von phi (1.6180339887498948482045...) zu ermitteln. - -Da es deutlich schnneller geht mit einer vorgefertigten -Datei zu suchen als die Nachkommastellen zu berechnen -wird die Datei phi.txt im Unterverzeichnis "data" benötigt. -Diese Datei enthält die Zahl phi mit den ersten 10 Millionen -Nachkommastellen. Wer mehr Stellen braucht, kann sich mit -dem Tool y-cruncher (http://numberworld.org/y-cruncher/) -auch eine Datei mit deutlich mehr Nachkommastellen erstellen -und phi.txt damit ersetzen. (Bei 1 Millarde Stellen ist -die Datei dann allerdings schon knapp 1 GB groß und -die Abfrage dauert auch etwas länger) -""" - - eingabetext = Eingabe.get(1.0, END) - eingabetext = eingabetext.rstrip() - if eingabetext == "": - Ausgabe.insert(1.0, hilfetext + "\n") - else: - try: - phiread = open("./data/phi.txt", "r") - except ValueError: - Ausgabe.insert(1.0, hilfetext + "\n") - else: - phistr = "" - for zeile in phiread: - phistr = phistr + zeile.rstrip() - phiread.close() - philen = len(phistr) - 2 - try: - zahlx = int(eingabetext) - except ValueError: - Ausgabe.insert(1.0, "Sorry aber ohne gültige Zahleneingabe funktioniert das nicht!\n", "re") - else: - pos = phistr.find(eingabetext) - if pos == -1: - Ausgabe.insert(1.0, "Zahlenreihe in {} Nachkommastellen nicht zu finden.\n\n".format(philen), "re") - else: - Ausgabe.insert(1.0, - "20 Stellen ab {}. Nachkommstelle: {}...\n\n".format(pos - 1, phistr[pos:pos + 20])) - Ausgabe.insert(1.0, 'erstes Vorkommen von Zahlenfolge "{}" ab {}. Nachkommastelle\n'.format( - eingabetext.rstrip(), pos - 1)) - if philen >= zahlx > 0: - Ausgabe.insert(1.0, "20 Stellen ab {}. Nachkommstelle:" - " {}...\n\n".format(zahlx, phistr[zahlx + 1:zahlx + 21])) - Ausgabe.insert(1.0, "Die {}. Nachkommstelle: lautet {}\n".format(zahlx, phistr[zahlx + 1])) - else: - Ausgabe.insert(1.0, "Die verwendete pi.txt kennt leider nur {} Nachkommstellen.\n".format(philen), - "re") - Ausgabe.insert(1.0, "Phi (Goldener Schnitt)\n\n", "gr") - def url_decode():