File size: 1,715 Bytes
63f6453 | 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | """Metin yardımcıları."""
import re
from collections import Counter
TR_LOWER = str.maketrans("İIÇĞÖŞÜ", "iıçğöşü")
def tr_lower(text: str) -> str:
"""Türkçe kurallarına uygun küçük harfe çevirme (İ→i, I→ı)."""
return text.translate(TR_LOWER).lower()
def is_palindrome(text: str) -> bool:
"""Harf ve rakamlar dışındaki karakterleri ve büyük/küçük harf farkını yok sayar."""
cleaned = [c for c in tr_lower(text) if c.isalnum()]
return len(cleaned) > 0 and cleaned == cleaned[::-1]
def word_frequencies(text: str, top: int = 3) -> list[tuple[str, int]]:
"""En sık geçen `top` kelimeyi (eşitlikte alfabetik) döndürür."""
if top < 1:
raise ValueError("top en az 1 olmalı")
words = re.findall(r"\w+", tr_lower(text))
counts = Counter(words)
return sorted(counts.items(), key=lambda kv: (-kv[1], kv[0]))[:top]
def caesar(text: str, shift: int) -> str:
"""Yalnızca ASCII harfleri kaydırır, diğer karakterleri korur."""
out = []
for ch in text:
if "a" <= ch <= "z":
out.append(chr((ord(ch) - 97 + shift) % 26 + 97))
elif "A" <= ch <= "Z":
out.append(chr((ord(ch) - 65 + shift) % 26 + 65))
else:
out.append(ch)
return "".join(out)
def truncate(text: str, limit: int, suffix: str = "...") -> str:
"""Metni `limit` karakteri aşmayacak şekilde, kelime sınırında kısaltır."""
if limit <= len(suffix):
raise ValueError("limit sonekten uzun olmalı")
if len(text) <= limit:
return text
cut = text[: limit - len(suffix)]
if " " in cut:
cut = cut[: cut.rfind(" ")]
return cut.rstrip() + suffix
|