torahCodes/Torah_Codes
4
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 