راه
۶ کیو· متوسطمتوسطPYTHON۴ ثانیه · ۲۵۶ مگابایت

اسپم

⏱️ محدودیت زمان

۲ ثانیه

💾 محدودیت حافظه

۲۵۶ مگابایت

یکی از چالش‌های رایج در شبکه‌های اجتماعی، شناسایی و فیلتر کردن پیام‌های اسپم (Spam) است. در این تمرین، ما پیام‌ها را بر اساس دو معیار دسته‌بندی می‌کنیم: اعتبار شناسه‌ی فرستنده و اعتبار محتوای پیام.


📋 معیارهای اعتبار

یک شناسه فرستنده نامعتبر است اگر فقط شامل ارقام (0 تا 9) باشد. در غیر این صورت، معتبر است.

محتوای یک پیام نامعتبر است اگر هر دو شرط زیر را داشته باشد:

  1. تعداد کاراکترهایی که نه حرف الفبا هستند، نه رقم و نه کاراکتر فاصله (space)، بیشتر از نصف طول کل محتوای پیام باشد.
  2. حداقل یک بار زیررشته‌ی spam (بدون توجه به بزرگی یا کوچکی حروف) در محتوای پیام وجود داشته باشد.

در غیر این صورت، محتوای پیام معتبر است.


📊 دسته‌بندی پیام‌ها

بر اساس معیارهای بالا، پیام‌ها در یکی از چهار دسته‌ی زیر قرار می‌گیرند:

دستهشناسهمحتوا
Not Spam✅ معتبر✅ معتبر
Invalid Sender❌ نامعتبر✅ معتبر
Invalid Content✅ معتبر❌ نامعتبر
Fully Invalid❌ نامعتبر❌ نامعتبر

💡 راهنمایی ۱: بررسی کاراکترهای خاص

برای بررسی این‌که یک کاراکتر، جزو حروف الفبا، اعداد یا فاصله نیست، می‌توانید از روش‌های مختلفی استفاده کنید. یک راه استفاده از عبارات منظم (کتابخانه‌ی re) است.

python
import re

def is_alnum_or_space(c):
    return re.match(r'[a-zA-Z0-9 _]', c) is not None

مثال:

python
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 برمی‌گرداند.

مثال:

python
print('12345'.isdigit())    # True
print('user123'.isdigit())  # False
print(''.isdigit())         # False

📥 ورودی و 📤 خروجی

ورودی:

  • در خط اول، شناسه‌ی فرستنده به‌صورت رشته داده می‌شود.
  • در خط دوم، محتوای پیام به‌صورت رشته داده می‌شود.

خروجی:

برنامه‌ی شما باید دقیقاً یکی از چهار عبارت زیر را در تنها خط خروجی چاپ کند:

  • Not Spam
  • Invalid Sender
  • Invalid Content
  • Fully Invalid

🎯 نمونه

ورودی ۱

text
@first-user1999
$#a@5 Spam)--(*^

خروجی ۱

text
Invalid Content
  • شناسه‌ی فرستنده (@first-user1999) معتبر است زیرا فقط شامل ارقام نیست (حاوی @، - و حروف است).
  • محتوای پیام ($#a@5 Spam)--(*^) نامعتبر است، زیرا طول پیام ۱۶ کاراکتر است و کاراکترهای غیرحرف، غیر عدد و غیرفاصله‌ی آن ۹تا هستند. پس شرط اول برقرار است. هم‌چنین، زیررشته‌ی Spam نیز در آن وجود دارد؛ پس شرط دوم نیز برقرار است.
  • چون شناسه معتبر و محتوا نامعتبر است، خروجی Invalid Content می‌باشد.

ورودی ۲

text
190482184
Hello (spam) Python

خروجی ۲

text
Invalid Sender
  • شناسه‌ی فرستنده نامعتبر است، زیرا فقط از ارقام تشکیل شده‌است.
  • محتوای پیام (Hello (spam) Python) معتبر است زیرا طول پیام ۱۹ کاراکتر است و تعداد کاراکترهای غیرحرف، غیرعدد و غیرفاصله‌ی آن دوتاست. هرچند کلمه‌ی spam در آن وجود دارد، اما چون شرط اول برقرار نیست، محتوا نامعتبر محسوب نمی‌شود.
  • چون شناسه نامعتبر و محتوا معتبر است، خروجی Invalid Sender خواهد بود.

💡 راهنمایی نهایی

ساختار کلی برنامه به این شکل است:

python
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

برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.

ورود