import itertools
import re
def metni_temizle_ve_esitle(metin):
"""
Hesaplama öncesi harekeleri temizler, standart dışı karakterleri uçurur.
"""
if not metin:
return ""
temiz = re.sub(r'[\u00A0\u2000-\u200A\u202F\u205F\u3000]', ' ', metin)
harekeler = re.compile(r'[\u064B-\u065F\u0670\u06D6-\u06ED]')
temiz = harekeler.sub('', temiz)
temiz = re.sub(r'[\d\u0660-\u0669]', '', temiz)
temiz = re.sub(r'ء', '', temiz)
temiz = re.sub(r'[^\w\s\u0621-\u064A]', '', temiz)
return temiz.strip()
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,
'آ': 1, 'أ': 1, 'إ': 1, 'ؤ': 27, 'ئ': 28, 'ء': 1, 'ة': 26, 'ى': 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,
'آ': 1, 'أ': 1, 'إ': 1, 'ؤ': 6, 'ئ': 10, 'ء': 1, 'ة': 5, 'ى': 10
}
aktif_sozluk = ebced_alfabe if mod == "ebced" else standart_alfabe
sayi_gruplari = []
for k in kelimeler_listesi:
kelime = metni_temizle_ve_esitle(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 ÇİFTE 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 tamamen 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 (Sıralı Sayaçlı)
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]
# Cümledeki gerçek kelime sırasını göstermek için dinamik numara (5, 6, 7...)
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 test ediliyor...")
print("="*75)
basarili_sayisi = 0
for komb in olasi_kombinasyonlar:
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")
if s_onay and e_onay:
basarili_sayisi += 1
cumle = " ".join(komb)
print(f"\n[BAŞARILI KOMBİNASYON #{basarili_sayisi}]")
print(f"Metin: {cumle}")
print(f"-> Standart Sayı: {s_str} (Kalan: {s_kalan}) ✅")
print(f"-> Ebced Sayı: {e_str} (Kalan: {e_kalan}) ✅")
print("-" * 50)
if basarili_sayisi == 0:
print("Maalesef iki koşulu aynı anda sağlayan bir kombinasyon çıkmadı.")
else:
print(f"\nArama tamamlandı. {toplam_kombinasyon} olasılıktan {basarili_sayisi} tanesi çifte koşulu sağladı.")
print("="*75)