CoolFace
Apppublic

torahCodes/Torah_Codes

sourceHugging Faceapache-2.0updated 2y agoView on Hugging Face
4likes
gematria.py211 linesDownload Raw Back to lib
1import json2from prettytable import PrettyTable3from colorama import Fore, Style4from collections import defaultdict5import unicodedata6 7def strip_diacritics(text):8    """9    Entfernt Diakritika von Unicode-Zeichen, um den Basisbuchstaben zu erhalten, und gibt Warnungen10    für tatsächlich unbekannte Zeichen aus.11    """12    stripped_text = ''13    for char in unicodedata.normalize('NFD', text):14        if unicodedata.category(char) not in ['Mn', 'Cf']:15            stripped_text += char16        else:17            print(f"Info: Diakritisches Zeichen '{char}' wird ignoriert.")18    return stripped_text19 20def hebrew_letter_to_value(letter):21    """22    Konvertiert einen einzelnen Buchstaben in seinen Gematria-Wert, ignoriert Leerzeichen23    und Nicht-Buchstaben-Zeichen.24    """25    # Dein vorhandenes Wörterbuch bleibt unverändert26    values = {27    # Lateinische Buchstaben28    'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 'j': 600,29    'k': 10, 'l': 20, 'm': 30, 'n': 40, 'o': 50, 'p': 60, 'q': 70, 'r': 80, 's': 90,30    't': 100, 'u': 200, 'v': 700, 'w': 900, 'x': 300, 'y': 400, 'z': 500,31 32    'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5, 'F': 6, 'G': 7, 'H': 8, 'I': 9, 'J': 600,33    'K': 10, 'L': 20, 'M': 30, 'N': 40, 'O': 50, 'P': 60, 'Q': 70, 'R': 80, 'S': 90,34    'T': 100, 'U': 200, 'V': 700, 'W': 900, 'X': 300, 'Y': 400, 'Z': 500,35 36    # Basisbuchstaben und einige bereits genannte Varianten37    'ا': 1, 'أ': 1, 'إ': 1, 'آ': 1, 'ب': 2, 'ج': 3, 'د': 4, 'ه': 5, 'و': 6, 'ز': 7, 'ح': 8, 'ط': 9,38    'ي': 10, 'ى': 10, 'ك': 20, 'ک': 20, 'ل': 30, 'م': 40, 'ن': 50, 'س': 60, 'ع': 70, 'ف': 80,39    'ص': 90, 'ق': 100, 'ر': 200, 'ش': 300, 'ت': 400, 'ث': 500, 'خ': 600, 'ذ': 700, 'ض': 800, 'ظ': 900, 'غ': 1000,40    'ٱ': 1, # Alif Wasla41    'ـ': 0, # Tatweel42 43    # Zusätzliche Varianten und Sonderzeichen44    'ة': 400, # Taa Marbuta45    'ؤ': 6,  # Waw mit Hamza darüber46    'ئ': 10, # Ya mit Hamza darüber47    'ء': 1,  # Hamza48    'ى': 10, # Alif Maqsurah49    'ٹ': 400, # Taa' marbuta goal50    'پ': 2,  # Pe (Persisch/Urdu)51    'چ': 3,  # Che (Persisch/Urdu)52    'ژ': 7,  # Zhe (Persisch/Urdu)53    'گ': 20, # Gaf (Persisch/Urdu)54    'ڭ': 20, # Ngaf (Kazakh, Uyghur, Uzbek, and in some Arabic dialects)55    'ں': 50, # Noon Ghunna (Persisch/Urdu)56    'ۀ': 5,  # Heh with Yeh above (Persisch/Urdu)57    'ے': 10, # Barree Yeh (Persisch/Urdu)58    '؋': 0,  # Afghani Sign (wird als Währungssymbol verwendet, nicht für Gematria relevant, aber hier zur Vollständigkeit aufgeführt)59 60    # Anmerkung: Das Währungssymbol und ähnliche Zeichen sind in einem Gematria-Kontext normalerweise nicht relevant,61    # werden aber der Vollständigkeit halber aufgeführt. Es gibt noch viele weitere spezifische Zeichen in erweiterten62    # arabischen Schriftsystemen (z.B. für andere Sprachen wie Persisch, Urdu, Pashto usw.), die hier nicht vollständig63    # abgedeckt sind.64 65    # Grund- und Schlussformen hebräischer Buchstaben66 67    'א': 1, 'ב': 2, 'ג': 3, 'ד': 4, 'ה': 5, 'ו': 6, 'ז': 7, 'ח': 8, 'ט': 9, 'י': 10,68    'כ': 20, 'ך': 500, 'ל': 30, 'מ': 40, 'ם': 600, 'נ': 50, 'ן': 700, 'ס': 60, 'ע': 70, 'פ': 80, 'ף': 800,69    'צ': 90, 'ץ': 900, 'ק': 100, 'ר': 200, 'ש': 300, 'ת': 400,70 71    # Griechische Buchstaben72    'α': 1, 'β': 2, 'γ': 3, 'δ': 4, 'ε': 5, 'ϝ': 6, 'ζ': 7, 'η': 8, 'θ': 9, 'ι': 10,73    'κ': 20, 'λ': 30, 'μ': 40, 'ν': 50, 'ξ': 60, 'ο': 70, 'π': 80, 'ϟ': 90, 'ρ': 100,74    'σ': 200, 'τ': 300, 'υ': 400, 'φ': 500, 'χ': 600, 'ψ': 700, 'ω': 800, 'ϡ': 900,75 76        # Griechische Großbuchstaben77    'Α': 1, 'Β': 2, 'Γ': 3, 'Δ': 4, 'Ε': 5, 'Ϝ': 6, 'Ζ': 7, 'Η': 8, 'Θ': 9, 'Ι': 10,78    'Κ': 20, 'Λ': 30, 'Μ': 40, 'Ν': 50, 'Ξ': 60, 'Ο': 70, 'Π': 80, 'Ϟ': 90, 'Ρ': 100,79    'Σ': 200, 'Τ': 300, 'Υ': 400, 'Φ': 500, 'Χ': 600, 'Ψ': 700, 'Ω': 800, 'Ϡ': 900,80    }81 82    # Stelle sicher, dass Diakritika entfernt werden, bevor auf das Wörterbuch zugegriffen wird83    letter_no_diacritics = strip_diacritics(letter)84 85    if letter_no_diacritics in values:86        return values[letter_no_diacritics.lower()]87    elif letter.strip() == "":  # Ignoriere Leerzeichen und leere Zeilen88        return 089    else:90        # Gib eine spezifische Warnung aus, wenn das Zeichen unbekannt ist91        print(f"Warnung: Unbekanntes Zeichen '{letter}' ignoriert.")92        return 093 94 95def calculate_gematria(text):96    """Calculate the Gematria value of a given Hebrew text, ignoring spaces and non-Hebrew characters."""97    return sum(hebrew_letter_to_value(letter) for letter in text if letter.strip() != "")98 99    100# Función para calcular el valor de gematria de una letra hebrea antigua101def gematria(letra):102    valores = {'א': 1, 'ב': 2, 'ג': 3, 'ד': 4, 'ה': 5, 'ו': 6, 'ז': 7, 'ח': 8, 'ט': 9,103               'י': 10, 'כ': 20, 'ל': 30, 'מ': 40, 'נ': 50, 'ס': 60, 'ע': 70, 'פ': 80,104               'צ': 90, 'ק': 100, 'ר': 200, 'ש': 300, 'ת': 400, 'ך': 20, 'ם': 40, 'ן': 50, 'ף': 80, 'ץ': 90}105    return valores.get(letra, 0)106 107# Función para generar todas las combinaciones posibles de dos letras en hebreo antiguo108def generar_combinaciones():109    letras = ['א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז', 'ח', 'ט', 'י', 'כ', 'ל', 'מ', 'נ', 'ס', 'ע', 'פ', 'צ', 'ק', 'ר', 'ש', 'ת',110              'ך', 'ם', 'ן', 'ף', 'ץ']111    combinaciones = []112    for letra1 in letras:113        for letra2 in letras:114            combinaciones.append(letra1 + letra2)115    return combinaciones116 117# Función para calcular la suma de los valores de gematria y el producto de los valores de gematria de una combinación118def calcular_valores(combinacion):119    valor1 = gematria(combinacion[0])120    valor2 = gematria(combinacion[1])121    suma = valor1 + valor2122    producto = valor1 * valor2123    ratio = valor1 / valor2 if valor2 != 0 else float('inf')124    return suma, producto, ratio125 126# Función principal127def main():128    combinaciones = generar_combinaciones()129    table = PrettyTable()130    table.field_names = ["#", Fore.BLUE + "Producto" + Style.RESET_ALL,131                         Fore.BLUE + "Suma" + Style.RESET_ALL,132                         Fore.BLUE + "Ratio" + Style.RESET_ALL,133                         Fore.BLUE + "Valor 2" + Style.RESET_ALL,134                         Fore.BLUE + "Valor 1" + Style.RESET_ALL,135                         Fore.BLUE + "Combinación" + Style.RESET_ALL]136    137    # Diccionario de combinaciones agrupadas por ratio138    combinaciones_por_ratio = defaultdict(set)139    140    # Versos del Génesis Sefardí (ejemplo)141    versos_genesis_sefardi = [142        "בראשית ברא אלהים את השמים ואת הארץ",143        "והארץ היתה תהו ובהו וחשך על־פני תהום ורוח אלהים מרחפת על־פני המים",144        "ויאמר אלהים יהי אור ויהי־אור",145        "וירא אלהים את־האור כי־טוב ויבדל אלהים בין האור ובין החשך",146        "ויקרא אלהים לאור יום ולחשך קרא לילה ויהי־ערב ויהי־בקר יום אחד"147        # Agrega más versos según sea necesario...148    ]149    150    # Función para obtener el primer par de letras de un verso151    def obtener_primer_par_letras(verso):152        for i in range(len(verso) - 1):153            if verso[i].isalpha() and verso[i+1].isalpha():154                return verso[i:i+2]155        return None156    157    # Diccionario para almacenar el primer par de letras y su ratio por verso158    primer_par_por_verso = {}159    for verso in versos_genesis_sefardi:160        primer_par = obtener_primer_par_letras(verso)161        if primer_par:162            suma, producto, ratio = calcular_valores(primer_par)163            primer_par_por_verso[verso] = (primer_par, ratio)164    165    # Diccionario para agrupar los primeros pares de letras por ratio166    primer_par_por_ratio = defaultdict(list)167    for verso, (primer_par, ratio) in primer_par_por_verso.items():168        primer_par_por_ratio[ratio].append((primer_par, verso))169    170    # Crear la tabla de primeros pares de letras por ratio171    table_primer_par = PrettyTable()172    table_primer_par.field_names = [Fore.BLUE + "Primer Par" + Style.RESET_ALL, Fore.BLUE + "Ratio" + Style.RESET_ALL, Fore.BLUE + "Verso" + Style.RESET_ALL]173    for ratio, pares_verso in sorted(primer_par_por_ratio.items(), key=lambda x: x[0], reverse=True):174        for primer_par, verso in pares_verso:175            table_primer_par.add_row([primer_par, f"{ratio:.2f}", verso])176    177    print(table_primer_par)178    179    # Procesar combinaciones y crear la tabla principal180    for idx, combinacion in enumerate(combinaciones, start=1):181        suma, producto, ratio = calcular_valores(combinacion)182        combinacion_str = combinacion183        # Resaltar en verde si la combinación está en el conjunto de combinaciones del Génesis Sefardí184        if combinacion in set(''.join(obtener_primer_par_letras(verso)) for verso in versos_genesis_sefardi):185            combinacion_str = Fore.GREEN + combinacion + Style.RESET_ALL186        table.add_row([idx, producto, suma, f"{ratio:.2f}", gematria(combinacion[1]), gematria(combinacion[0]), combinacion_str])187        combinaciones_por_ratio[ratio].add(combinacion)188    189    # Mostrar la tabla de combinaciones190    print("\nTabla de combinaciones:")191    print(table)192    193    # Mostrar la tabla de combinaciones agrupadas por ratio194    print("\nTabla de combinaciones agrupadas por ratio:")195    table_ratio = PrettyTable()196    table_ratio.field_names = [Fore.BLUE + "Ratio" + Style.RESET_ALL, Fore.BLUE + "Combinaciones" + Style.RESET_ALL]197    for ratio, combinaciones in sorted(combinaciones_por_ratio.items(), key=lambda x: x[0], reverse=True):198        combinaciones_str = ", ".join(combinaciones)199        table_ratio.add_row([f"{ratio:.2f}", combinaciones_str])200    print(table_ratio)201    202    # Calcular el número de combinaciones únicas de primeros pares de letras203    primeros_pares_unicos = set(primer_par for primer_par, _ in primer_par_por_verso.values())204    num_primeros_pares_unicos = len(primeros_pares_unicos)205    num_combinaciones_totales = len(combinaciones)206    print(f"\nNúmero de primeros pares de letras únicos: {num_primeros_pares_unicos}")207    print(f"Número de combinaciones totales posibles: {num_combinaciones_totales}")208 209if __name__ == "__main__":210    main()211