{}
run-icon
main.py
import itertools import re def harfi_standardize_et(metin): """ Tüm fonksiyonların aynı harfi aynı şekilde görmesi için harf varyasyonlarını en yalın haline indirger. Mukaatta ve Ebced hatalarını engellemek için harf eşleşmeleri düzeltilmiştir. """ if not metin: return "" harekeler = re.compile(r'[\u064B-\u065F\u0670\u06D6-\u06ED]') temiz = harekeler.sub('', metin) temiz = re.sub(r'[\u00A0\u2000-\u200A\u202F\u205F\u3000]', ' ', temiz) temiz = re.sub(r'[\d\u0660-\u0669]', '', temiz) temiz = re.sub(r'ء', '', temiz) temiz = re.sub(r'[^\w\s\u0621-\u064A]', '', temiz) # DOĞRU EBCED VE MUKAATTA İÇİN GÜNCELLENEN DÖNÜŞÜM TABLOSU donusum = { 'آ': 'ا', 'أ': 'ا', 'إ': 'ا', 'ى': 'ي', # HATA DÜZELTİLDİ: Noktasız Ye (ى) Elif değil, Ye (ي) harfidir (Ebced: 10) 'ؤ': 'و', 'ئ': 'ي', 'ة': 'ة' # HATA DÜZELTİLDİ: Te Marbuta (ة) harfinin He (ه) frekansını bozması engellendi } son_metin = [] for harf in temiz: if harf in donusum: son_metin.append(donusum[harf]) else: son_metin.append(harf) return "".join(son_metin).strip() def mukaatta_kontrolu(kelimeler_listesi): """ 14 Mukaatta harfinin frekans tabanlı ebced toplamının 19 katı olup olmadığını doğrular. """ mukaatta_ebced = { 'ا': 1, 'ل': 30, 'م': 40, 'ص': 90, 'ر': 200, 'ك': 20, 'ه': 5, 'ي': 10, 'ع': 70, 'ط': 9, 'س': 60, 'ح': 8, 'ق': 100, 'ن': 50 } birlesik_metin = "".join(kelimeler_listesi) temiz_metin = harfi_standardize_et(birlesik_metin) frekanslar = {} for harf in temiz_metin: if harf in mukaatta_ebced: frekanslar[harf] = frekanslar.get(harf, 0) + 1 toplam_deger = 0 for harf, adet in frekanslar.items(): toplam_deger += adet * mukaatta_ebced[harf] kalan = toplam_deger % 19 return toplam_deger, kalan, (kalan == 0) def arapca_metni_sayiya_cevir(kelimeler_listesi, secenek=19, mod="standart"): standart_alfabe = { 'ا': 1, 'ب': 2, 'ت': 3, 'ث': 4, 'ج': 5, 'ح': 6, 'خ': 7, 'د': 8, 'ذ': 9, 'ر': 10, 'ز': 11, 'س': 12, 'ش': 13, 'ص': 14, 'ض': 15, 'ط': 16, 'ظ': 17, 'ع': 18, 'غ': 19, 'ف': 20, 'ق': 21, 'ك': 22, 'ل': 23, 'م': 24, 'ن': 25, 'ه': 26, 'و': 27, 'ي': 28 } ebced_alfabe = { 'ا': 1, 'ب': 2, 'ج': 3, 'د': 4, 'ه': 5, 'و': 6, 'ز': 7, 'ح': 8, 'ط': 9, 'ي': 10, 'ك': 20, 'ل': 30, 'م': 40, 'ن': 50, 'س': 60, 'ع': 70, 'ف': 80, 'ص': 90, 'ق': 100, 'ر': 200, 'ش': 300, 'ت': 400, 'ث': 500, 'خ': 600, 'ذ': 700, 'ض': 800, 'ظ': 900, 'غ': 1000 } aktif_sozluk = ebced_alfabe if mod == "ebced" else standart_alfabe sayi_gruplari = [] for k in kelimeler_listesi: kelime = harfi_standardize_et(k) harf_sayilari = [] for harf in kelime: if harf in aktif_sozluk: harf_sayilari.append(str(aktif_sozluk[harf])) if harf_sayilari: sayi_gruplari.append("".join(harf_sayilari)) baglac = str(secenek) olusan_sayi_str = baglac.join(sayi_gruplari) if not olusan_sayi_str: return None, 0, False olusan_sayi = int(olusan_sayi_str) kalan = olusan_sayi % 19 bolunur_mu = (kalan == 0) return olusan_sayi_str, kalan, bolunur_mu # ---- PANEL ANA DÖNGÜSÜ ---- print("="*75) print(" ARAPÇA METİN KOMBİNASYON VE ÜÇLÜ KOŞUL PANELİ ") print(" (İlk 4 Kelime Sabit Tutulur) ") print(" Çıkmak için 'çıkış' yazabilirsiniz. ") print("="*75) while True: print("\nLütfen ana Arapça metni girin/yapıştırın:") print("(Giriş bittiğinde boş bir satırda ENTER'a basın veya alt satıra geçip ENTER yapın)") satirlar = [] olur_mu_cikis = False while True: hat = input("> ") if hat.strip().lower() == 'çıkış': olur_mu_cikis = True break if not hat: break satirlar.append(hat) if olur_mu_cikis: print("Sorgu paneli kapatıldı.") break ana_metin = " ".join(satirlar).strip() if not ana_metin: continue ana_kelimeler = [k for k in ana_metin.split() if k] toplam_kelime = len(ana_kelimeler) if toplam_kelime == 0: print("Hata: Geçerli kelime bulunamadı!") continue print(f"\n[BİLGİ] Sistem girilen metinde tam {toplam_kelime} kelime tespit etti.") tum_alternatifler = [] # 1. KISIM: İlk 4 kelime SABİT tutuluyor sabit_sinir = min(4, toplam_kelime) sabitler_ilk = ana_kelimeler[:sabit_sinir] print(f"-> İlk {sabit_sinir} kelime SABİT kalacak: {', '.join(sabitler_ilk)}") for i in range(sabit_sinir): tum_alternatifler.append([ana_kelimeler[i]]) # 2. KISIM: Geriye kalan kelimeler için dinamik alternatif toplama (Sayaç Düzeltildi) if toplam_kelime > 4: print(f"-> Kalan {toplam_kelime - 4} kelime için alternatif sorulacaktır.\n") for i in range(4, toplam_kelime): kelime = ana_kelimeler[i] # Dinamik olarak cümledeki gerçek kelime sırasını gösterir (5. Kelime, 6. Kelime...) kelime_sira_no = i + 1 alt_input = input(f"{kelime_sira_no}. Kelime için alternatifleri girin ({kelime}):\n> ").strip() kelime_havuzu = [kelime] if alt_input: ek_alternatifler = [k.strip() for k in alt_input.split(',') if k.strip()] for ek in ek_alternatifler: if ek not in kelime_havuzu: kelime_havuzu.append(ek) tum_alternatifler.append(kelime_havuzu) else: print("-> Metin 4 veya daha az kelimeden oluştuğu için alternatif sorulmadan doğrudan hesaplanıyor.\n") # Kombinasyonları hesapla olasi_kombinasyonlar = list(itertools.product(*tum_alternatifler)) toplam_kombinasyon = len(olasi_kombinasyonlar) print(f"\nToplam {toplam_kombinasyon} farklı kombinasyon 3 ayrı koşul için test ediliyor...") print("="*75) basarili_sayisi = 0 for komb in olasi_kombinasyonlar: # Koşul 1 & 2: Sayı dizilimleri s_str, s_kalan, s_onay = arapca_metni_sayiya_cevir(komb, 19, "standart") e_str, e_kalan, e_onay = arapca_metni_sayiya_cevir(komb, 19, "ebced") # Koşul 3: 14 Mukaatta Harfi Frekans Ebcedi m_toplam, m_kalan, m_onay = mukaatta_kontrolu(komb) # 3 KOŞULUN AYNI ANDA SAĞLANMASI: if s_onay and e_onay and m_onay: basarili_sayisi += 1 cumle = " ".join(komb) print(f"\n[BAŞARILI KOMBİNASYON #{basarili_sayisi}]") print(f"Metin: {cumle}") print(f"-> 1. Standart Sayı: {s_str} (Kalan: {s_kalan}) ✅") print(f"-> 2. Ebced Sayı: {e_str} (Kalan: {e_kalan}) ✅") print(f"-> 3. Mukaatta Toplamı: {m_toplam} (Kalan: {m_kalan}) ✅") print("-" * 50) if basarili_sayisi == 0: print("Maalesef üç koşulu birden aynı anda sağlayan hiçbir kombinasyon çıkmadı.") else: print(f"\nArama tamamlandı. {toplam_kombinasyon} olasılıktan {basarili_sayisi} tanesi ÜÇLÜ KORUMAYI sağladı.") print("="*75)
Output