import itertools
import re
# --- GLOBAL SABİTLER VE SÖZLÜKLER ---
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
}
# 14 Mukatta Harfi
MUKATTA_HARFLERİ = {'ا', 'ح', 'ر', 'س', 'ص', 'ط', 'ع', 'ق', 'ك', 'ل', 'م', 'ن', 'ه', 'ي'}
# RegEx Kalıpları
HAREKE_REGEX = re.compile(r'[\u064B-\u065F\u0670\u06D6-\u06ED]')
BOSLUK_REGEX = re.compile(r'[\u00A0\u2000-\u200A\u202F\u205F\u3000]')
SAYI_REGEX = re.compile(r'[\d\u0660-\u0669]')
LATIN_REGEX = re.compile(r'[a-zA-Z]')
TEMIZLIK_REGEX = re.compile(r'[^\w\s\u0621-\u064A]')
HARF_DONUSUM_SOZLUGU = {
'آ': 'ا', 'أ': 'ا', 'إ': 'ا',
'ى': 'ي',
'ؤ': 'و', 'ئ': 'ي',
'ة': 'ه'
}
def harfi_standardize_et(metin):
if not metin:
return ""
temiz = HAREKE_REGEX.sub('', metin)
temiz = BOSLUK_REGEX.sub(' ', temiz)
temiz = SAYI_REGEX.sub('', temiz)
temiz = re.sub(r'ء', '', temiz)
temiz = LATIN_REGEX.sub('', temiz)
temiz = TEMIZLIK_REGEX.sub('', temiz)
son_metin = [HARF_DONUSUM_SOZLUGU.get(harf, harf) for harf in temiz]
return "".join(son_metin).strip()
def kontrol_19_sistemi(harfleri_hazir_kelimeler, mod="standart"):
aktif_sozluk = EBCED_ALFABE if mod == "ebced" else STANDART_ALFABE
sayi_gruplari = []
for kelime in harfleri_hazir_kelimeler:
harf_sayilari = [str(aktif_sozluk[harf]) for harf in kelime if harf in aktif_sozluk]
if harf_sayilari:
sayi_gruplari.append("".join(harf_sayilari))
olusan_sayi_str = "19".join(sayi_gruplari)
if not olusan_sayi_str:
return None, 0, False
olusan_sayi = int(olusan_sayi_str)
kalan = olusan_sayi % 19
return olusan_sayi_str, kalan, (kalan == 0)
def kontrol_7_mukatta_sistemi(harfleri_hazir_kelimeler, mod="standart"):
aktif_sozluk = EBCED_ALFABE if mod == "ebced" else STANDART_ALFABE
temiz_harf_akisi = []
for kelime in harfleri_hazir_kelimeler:
for harf in kelime:
if harf in MUKATTA_HARFLERİ:
temiz_harf_akisi.append(harf)
if not temiz_harf_akisi:
return None, 0, False
sayi_str = "".join([str(aktif_sozluk[h]) for h in temiz_harf_akisi if h in aktif_sozluk])
if not sayi_str:
return None, 0, False
olusan_sayi = int(sayi_str)
kalan = olusan_sayi % 7
return sayi_str, kalan, (kalan == 0)
# ---- PANEL ANA DÖNGÜSÜ ----
print("="*75)
print(" ARAPÇA METİN 4'LÜ KOŞUL VE KOMBİNASYON PANELİ ")
print(" (Mod 19 Standart/Ebced & Mod 7 Mühür & 80 Harf) ")
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 kapatmak için 'çıkış'/'q' yazın)")
satirlar = []
olur_mu_cikis = False
while True:
hat = input("> ").strip()
if hat.lower() in ['çıkış', 'cikis', 'q', 'quit']:
olur_mu_cikis = True
break
if not hat:
break
satirlar.append(hat)
if olur_mu_cikis:
print("Sorgu paneli kapatıldı. İyi çalışmalar!")
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.")
print("-> Tüm kelimeler için sırayla alternatif sorulacaktır.\n")
tum_alternatifler = []
for i in range(toplam_kelime):
kelime = ana_kelimeler[i]
kelime_sira_no = i + 1
alt_input = input(f"{kelime_sira_no}. Kelime için alternatifleri girin ({kelime}):\n> ").strip()
std_ana_kelime = harfi_standardize_et(kelime)
kelime_havuzu = [std_ana_kelime] if std_ana_kelime else []
if alt_input:
ek_alternatifler = [k.strip() for k in alt_input.split(',') if k.strip()]
for ek in ek_alternatifler:
std_ek = harfi_standardize_et(ek)
if std_ek and std_ek not in kelime_havuzu:
kelime_havuzu.append(std_ek)
if kelime_havuzu:
tum_alternatifler.append(kelime_havuzu)
print("\nKombinasyonlar test ediliyor (Önce 4 Koşul -> Sonra 80 Harf Süzgeci)...")
print("="*75)
basarili_sayisi = 0
if tum_alternatifler:
olasi_kombinasyonlar_gen = itertools.product(*tum_alternatifler)
for komb in olasi_kombinasyonlar_gen:
# KOŞUL 1: 19 - Standart Testi
s19_str, s19_kalan, s19_onay = kontrol_19_sistemi(komb, "standart")
if not s19_onay:
continue
# KOŞUL 2: 19 - Ebced Testi
e19_str, e19_kalan, e19_onay = kontrol_19_sistemi(komb, "ebced")
if not e19_onay:
continue
# KOŞUL 3: 7 - Mukatta Standart Testi
s7_str, s7_kalan, s7_onay = kontrol_7_mukatta_sistemi(komb, "standart")
if not s7_onay:
continue
# KOŞUL 4: 7 - Mukatta Ebced Testi
e7_str, e7_kalan, e7_onay = kontrol_7_mukatta_sistemi(komb, "ebced")
if not e7_onay:
continue
# YENİ DEĞİŞİKLİK: 4 koşulu da sağlayan kombinasyonun toplam harf sayısını hesapla
# Kelimeler arasındaki boşluklar hesaba katılmaz, sadece yalın harfler sayılır.
yalın_harf_sayısı = sum(len(kelime) for kelime in komb)
# Eğer 4 koşulu geçen bu kombinasyonun harf sayısı tam 80 değilse elenir
if yalın_harf_sayısı != 80:
continue
# 4 koşulu GEÇEN VE tam 80 harf olan başarılı kombinasyon:
basarili_sayisi += 1
cumle = " ".join(komb)
print(f"\n[🏆 BAŞARILI KOMBİNASYON #{basarili_sayisi}]")
print(f"Metin: {cumle}")
print(f"-> Yalın Harf Sayısı: {yalın_harf_sayısı} (Tam 80) ✅")
print(f"-> 1. 19-Standart Sayısı: {s19_str} (Kalan: {s19_kalan}) ✅")
print(f"-> 2. 19-Ebced Sayısı: {e19_str} (Kalan: {e19_kalan}) ✅")
print(f"-> 3. 7-Mukatta Standart: {s7_str} (Kalan: {s7_kalan}) ✅")
print(f"-> 4. 7-Mukatta Ebced: {e7_str} (Kalan: {e7_kalan}) ✅")
print("-" * 65)
if basarili_sayisi == 0:
print("4 koşulu birden sağlayan kombinasyonlar bulundu fakat aralarında tam 80 harf olan çıkmadı.")
else:
print(f"\nArama tamamlandı. 4 koşullu VE 80 harfli başarılı kombinasyon sayısı: {basarili_sayisi}")
print("="*75)