Analisis: Berburu Emoji 🕵️‍♂️

Mari kita lihat solusi yang dikirimkan:

import re

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


Apakah berfungsi? Ya. Apakah boleh dibiarkan seperti itu di production? Tidak.

1️⃣ Dosa alokasi
Tanda kurung siku di dalam sum([ ... ]) berarti Python akan membuat daftar lengkap True/False seukuran array asli di memori, baru kemudian menjumlahkannya. Jika inputnya adalah log dengan 10 juta baris, memori Anda akan habis.
Hapus kurung — dapatkan ekspresi generator. Memori O(1) bukan O(n).

2️⃣ Pemeriksaan berlebihan
Konstruksi match(...) is not None memang bisa digunakan, tetapi di Python lebih umum menggunakan "kebenaran" (truthiness) bawaan objek. Plus, kita hanya perlu menghitung jumlah kecocokan. Pendekatan idiomatis: sum(1 for ... if ...)

3️⃣ Kompilasi ulang
Memanggil re.match di dalam loop setiap kali memaksa Python mengakses cache regex. Jika string banyak, pola harus dikompilasi sekali sebelum loop.

Buang sampah dan tulis seperti ini:
import re

# Pindahkan kompilasi ke atas
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))


☝️Tapi masalah utama solusi ini bukan pada sintaksis.
Kenapa kita perlu regex di sini?

Mari kita hitung: ada 2 pilihan mata, 3 pilihan hidung (termasuk tanpa hidung), dan 2 pilihan mulut.
Total ada tepat 12 emoji valid. Seperti yang ditulis @archimage_wiz, daripada menjalankan mesin state regex yang berat untuk setiap baris, kita cukup memeriksa apakah string ada dalam set yang sudah disiapkan (set).

Pencarian di set bekerja dalam waktu konstan O(1) (karena hash table).

Solusi orang waras:
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)


Kode ini tidak perlu mengimpor modul re, jelas bagi junior mana pun pada pandangan pertama, dan pada volume data besar akan mengalahkan regex dalam kecepatan eksekusi.

Alat yang kompleks itu keren. Tapi kemampuan menggunakan yang sederhana adalah skill.

#algosobes