Analiz: İfade Avı 🕵️‍♂️

Gönderilen çözüme bakalım:

import re

def num_emojis(arg):
return sum([re.match("^[:;][~-]?[)D]$",i) is not None for i in arg])


Çalışıyor mu? Evet. Bunu prodda bırakır mıyız? Hayır.

1️⃣ Bellek tahsis günahı
sum([ ... ]) içindeki köşeli parantezler, Python'un önce True/False listesini tamamen bellekte oluşturacağı ve ancak ondan sonra toplayacağı anlamına gelir. Giriş 10 milyon satırlık bir log olursa, hafızanız uçar.
Parantezleri kaldırın — generator ifadesi elde edersiniz. Bellek O(1) vs O(n).

2️⃣ Gereksiz kontroller
match(...) is not None yapısı kullanılabilir, ancak Python'da nesnelerin doğruluk değerini (truthiness) kullanmak yaygındır. Ayrıca sadece eşleşme sayısını saymamız gerekiyor. İdiyomatik yaklaşım: sum(1 for ... if ...)

3️⃣ Yeniden derleme
Döngü içinde her seferinde re.match çağırmak Python'un regex önbelleğine erişmesine neden olur. Çok sayıda satır varsa, desen döngüden önce bir kez derlenmelidir.

Çöpü atalım ve şöyle yazalım:
import re

# Derlemeyi yukarı taşı
SMILEY_PATTERN = re.compile(r"^[:;][~-]?[)D]$")

def count_smileys(faces: list[str]) -> int:
return sum(1 for face in faces if SMILEY_PATTERN.match(face))


☝️Ama bu çözümün asıl sorunu sözdizimi değil.
Burada neden regex kullanalım ki?

Hadi sayalım: 2 göz seçeneği, 3 burun seçeneği (yok dahil) ve 2 ağız seçeneği.
Tam olarak 12 geçerli ifade var. @archimage_wiz'in yazdığı gibi, her satırda ağır bir regex durum makinesi çalıştırmak yerine, dizeyi önceden hazırlanmış bir kümeye (set) ait olup olmadığını kontrol etmek yeterlidir.

Küme araması sabit zamanlı O(1) çalışır (hash tablosu).

Sağlıklı insan çözümü:
from typing import List

VALID_SMILES = {
':)', ';)', ':-)', ';-)', ':~)', ';~)',
':D', ';D', ':-D', ';-D', ':~D', ';~D'
}

def num_emojis_pro(arr: List[str]) -> int:
return sum(s in VALID_SMILES for s in arr)


Bu kod re modülünü içe aktarmayı gerektirmez, herhangi bir junior için ilk bakışta açıktır ve büyük veri kümelerinde regex'i hız açısından ezer.

Karmaşık araçlar harikadır. Ancak basit olanlarla yetinmek bir beceridir.

#algosoruları