اسپم
⏱️ محدودیت زمان
۲ ثانیه
💾 محدودیت حافظه
۲۵۶ مگابایت
یکی از چالشهای رایج در شبکههای اجتماعی، شناسایی و فیلتر کردن پیامهای اسپم (Spam) است. در این تمرین، ما پیامها را بر اساس دو معیار دستهبندی میکنیم: اعتبار شناسهی فرستنده و اعتبار محتوای پیام.
📋 معیارهای اعتبار
یک شناسه فرستنده نامعتبر است اگر فقط شامل ارقام (0 تا 9) باشد. در غیر این صورت، معتبر است.
محتوای یک پیام نامعتبر است اگر هر دو شرط زیر را داشته باشد:
- تعداد کاراکترهایی که نه حرف الفبا هستند، نه رقم و نه کاراکتر فاصله (space)، بیشتر از نصف طول کل محتوای پیام باشد.
- حداقل یک بار زیررشتهی
spam(بدون توجه به بزرگی یا کوچکی حروف) در محتوای پیام وجود داشته باشد.در غیر این صورت، محتوای پیام معتبر است.
📊 دستهبندی پیامها
بر اساس معیارهای بالا، پیامها در یکی از چهار دستهی زیر قرار میگیرند:
| دسته | شناسه | محتوا |
|---|---|---|
| Not Spam | ✅ معتبر | ✅ معتبر |
| Invalid Sender | ❌ نامعتبر | ✅ معتبر |
| Invalid Content | ✅ معتبر | ❌ نامعتبر |
| Fully Invalid | ❌ نامعتبر | ❌ نامعتبر |
💡 راهنمایی ۱: بررسی کاراکترهای خاص
برای بررسی اینکه یک کاراکتر، جزو حروف الفبا، اعداد یا فاصله نیست، میتوانید از روشهای مختلفی استفاده کنید. یک راه استفاده از عبارات منظم (کتابخانهی re) است.
import re
def is_alnum_or_space(c):
return re.match(r'[a-zA-Z0-9 _]', c) is not None
مثال:
print(is_alnum_or_space('#')) # False
print(is_alnum_or_space('e')) # True
print(is_alnum_or_space(' ')) # True
print(is_alnum_or_space('5')) # True
print(is_alnum_or_space('_')) # True
print(is_alnum_or_space('@')) # False
💡 راهنمایی ۲: بررسی شناسهی فقط عددی
برای بررسی اینکه آیا یک رشته فقط از ارقام تشکیل شده است یا نه، میتوانید از متد isdigit() در پایتون استفاده کنید. این متد اگر تمام کاراکترهای رشته عدد باشند و رشته خالی نباشد، True برمیگرداند.
مثال:
print('12345'.isdigit()) # True
print('user123'.isdigit()) # False
print(''.isdigit()) # False
📥 ورودی و 📤 خروجی
ورودی:
- در خط اول، شناسهی فرستنده بهصورت رشته داده میشود.
- در خط دوم، محتوای پیام بهصورت رشته داده میشود.
خروجی:
برنامهی شما باید دقیقاً یکی از چهار عبارت زیر را در تنها خط خروجی چاپ کند:
- Not Spam
- Invalid Sender
- Invalid Content
- Fully Invalid
🎯 نمونه
ورودی ۱
@first-user1999
$#a@5 Spam)--(*^
خروجی ۱
Invalid Content
- شناسهی فرستنده (
@first-user1999) معتبر است زیرا فقط شامل ارقام نیست (حاوی@،-و حروف است).- محتوای پیام (
$#a@5 Spam)--(*^) نامعتبر است، زیرا طول پیام ۱۶ کاراکتر است و کاراکترهای غیرحرف، غیر عدد و غیرفاصلهی آن ۹تا هستند. پس شرط اول برقرار است. همچنین، زیررشتهیSpamنیز در آن وجود دارد؛ پس شرط دوم نیز برقرار است.- چون شناسه معتبر و محتوا نامعتبر است، خروجی Invalid Content میباشد.
ورودی ۲
190482184
Hello (spam) Python
خروجی ۲
Invalid Sender
- شناسهی فرستنده نامعتبر است، زیرا فقط از ارقام تشکیل شدهاست.
- محتوای پیام (
Hello (spam) Python) معتبر است زیرا طول پیام ۱۹ کاراکتر است و تعداد کاراکترهای غیرحرف، غیرعدد و غیرفاصلهی آن دوتاست. هرچند کلمهیspamدر آن وجود دارد، اما چون شرط اول برقرار نیست، محتوا نامعتبر محسوب نمیشود.- چون شناسه نامعتبر و محتوا معتبر است، خروجی Invalid Sender خواهد بود.
💡 راهنمایی نهایی
ساختار کلی برنامه به این شکل است:
import re
sender = input()
content = input()
# بررسی شناسه
sender_valid = not sender.isdigit()
# بررسی محتوا
special_chars = 0
for ch in content:
if not re.match(r'[a-zA-Z0-9 ]', ch):
special_chars += 1
special_condition = special_chars > len(content) / 2
spam_condition = 'spam' in content.lower()
content_valid = not (special_condition and spam_condition)
# دستهبندی
if sender_valid and content_valid:
print("Not Spam")
elif not sender_valid and content_valid:
print("Invalid Sender")
elif sender_valid and not content_valid:
print("Invalid Content")
else:
print("Fully Invalid")
sender.isdigit()← بررسی شناسه (اگر فقط عدد باشد → نامعتبر)re.match(r'[a-zA-Z0-9 ]', ch)← بررسی کاراکتر مجازspecial_chars > len(content) / 2← شرط اول محتوا'spam' in content.lower()← شرط دوم محتوا- دستهبندی بر اساس ترکیب اعتبار شناسه و محتوا
✅ این تمرین را در ویرایشگر خود پیادهسازی کنید و با ورودیهای مختلف تست کنید.
نمونهها
@first-user1999 $#a@5 Spam)--(*^
Invalid Content
190482184 Hello (spam) Python
Invalid Sender
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود