راه
۴ کیو· سختپیشرفتهPYTHON۴ ثانیه · ۲۵۶ مگابایت

واحد حفاظت و امنیت

در این تمرین، شما یک کلاس پایتون با نام Security طراحی و پیاده‌سازی خواهید کرد که شامل متدهایی برای رمزنگاری رشته‌ها بر اساس یک الگوریتم مشخص و همچنین شناسایی و ایمن‌سازی اطلاعات حساب‌های شبکه‌های اجتماعی در یک متن است.

وظیفه‌ی شما تکمیل پیاده‌سازی سه متد اصلی این کلاس است که در ادامه توضیح داده شده‌اند.


🔹 متد encrypt(self, s)

این متد یک رشته s را به‌عنوان ورودی دریافت کرده و معادل رمزنگاری‌شده‌ی آن را بر اساس الگوریتم زیر در خروجی بازمی‌گرداند.

📌 الگوریتم رمزنگاری

  • تقسیم به زیررشته‌های یونیفرم: رشته‌ی ورودی s به زیررشته‌های متوالی یونیفرم تقسیم می‌شود. یک زیررشته‌ی یونیفرم رشته‌ای است که تمام کاراکترهای آن یکسان باشند. مثال: 'c'، 'aa' و 'ddd'
  • رمزنگاری هر زیررشته‌ی یونیفرم: وزن کاراکتر: وزن هر کاراکتر انگلیسی کوچک برابر با کد عددی آن کاراکتر منهای عدد ۹۶ است. مثال: 'a' → 1، 'b' → 2، 'c' → 3 محاسبه‌ی مقدار رمزنگاری: برای یک زیررشته‌ی یونیفرم، با پیمایش کاراکترها از چپ به راست: به ازای اولین کاراکتر: (0 + 1) × weight به ازای دومین کاراکتر: (1 + 1) × weight به ازای nامین کاراکتر: (n-1 + 1) × weight
  • الحاق مقادیر رمزنگاری‌شده: مقدار رمزنگاری‌شده رشته اصلی از به هم چسباندن (الحاق) مقادیر رمزنگاری‌شده تمام زیررشته‌های یونیفرم به ترتیب ظاهر شدن آن‌ها به دست می‌آید.

رشته‌ی 'abcccdd' به زیررشته‌های 'a'، 'b'، 'ccc' و 'dd' تقسیم می‌شود.

  • 'a' → وزن 1 → (0+1)×1 = 1 → '1'
  • 'b' → وزن 2 → (0+1)×2 = 2 → '2'
  • 'ccc' → وزن 3 → 3, 6, 9 → '369'
  • 'dd' → وزن 4 → 4, 8 → '48'

خروجی نهایی: '1236948'


🔹 متد is_social_account_info(self, param)

این متد یک رشته param را به‌عنوان ورودی دریافت کرده و بررسی می‌کند که آیا این رشته دقیقاً منطبق با الگوی مشخص‌شده برای اطلاعات یک حساب شبکه اجتماعی هست یا خیر.

📌 قوانین هر بخش

  • نام شبکه اجتماعی (Social Network Name): با یک حرف بزرگ انگلیسی شروع شده و با یک یا چند حرف انگلیسی دیگر ادامه می‌یابد (فقط شامل حروف انگلیسی). مثال: Twitter، Instagram، GitHub
  • دامنه ([domain]): شامل حروف کوچک انگلیسی، اعداد و کاراکتر نقطه (.) است و باید حداقل یک نقطه داشته باشد. مثال: example.com یا dl.example.com
  • نام کاربری ([username]): شامل حروف انگلیسی (کوچک و بزرگ)، اعداد و کاراکتر زیرخط (_) است. مثال: javafan یا user_123

ورودی: Instagram:www.instagram.com/javafan

✅ True

ورودی: Facebook:www.facebook.com/Ali#Alavi

❌ False

دلیل: کاراکتر # در نام کاربری

ورودی: MySite:mysite.net/user123

❌ False

دلیل: نبود بخش www.


🔹 متد secure(self, info)

این متد یک رشته‌ی متنی info را به عنوان ورودی دریافت می‌کند که ممکن است حاوی اطلاعات مختلفی از جمله اطلاعات حساب‌های کاربری شبکه‌های اجتماعی باشد. این متد با استفاده از دو متد قبلی، بخش‌های مربوط به نام کاربری حساب‌های اجتماعی شناسایی‌شده را رمزنگاری می‌کند.

📌 فرایند ایمن‌سازی

  • بخش‌هایی را که دقیقاً منطبق با الگوی اطلاعات حساب شبکه‌ی اجتماعی هستند، پیدا کنید
  • برای هر بخش، قسمت مربوط به نام کاربری ([username]) را استخراج کنید
  • نام کاربری استخراج‌شده را با استفاده از متد encrypt رمزنگاری کنید
  • در رشته‌ی اصلی، نام کاربری را با مقدار رمزنگاری‌شده جایگزین کنید
  • رشته‌ی نهایی را پس از اعمال تمام جایگزینی‌ها برگردانید

💡 فقط نام کاربری رمزنگاری می‌شود، نه کل رشته.

ورودی: "Instagram:www.instagram.com/aalavi Twitter:www.twiter.com/alaviii imdb:www.imdb.com/alavi"

  • Instagram:www.instagram.com/aalavi → نام کاربری aalavi → رمزنگاری: 12121229
  • Twitter:www.twiter.com/alaviii → نام کاربری alaviii → رمزنگاری: 11212291827
  • imdb:www.imdb.com/alavi → با الگو مطابقت ندارد (imdb با حرف بزرگ شروع نشده) → بدون تغییر

خروجی: "Instagram:www.instagram.com/12121229 Twitter:www.twiter.com/11212291827 imdb:www.imdb.com/alavi"


✅ پاسخ نهایی

python
import re


class Security:
    # [Name]:www.[domain with at least one dot]/[username]
    ACCOUNT = r"[A-Z][A-Za-z]+:www\.(?=[a-z0-9.]*\.)[a-z0-9.]+/([A-Za-z0-9_]+)"

    def encrypt(self, s):
        result = []
        i = 0
        while i < len(s):
            ch = s[i]
            weight = ord(ch) - 96
            count = 0
            while i < len(s) and s[i] == ch:
                count += 1
                result.append(str(count * weight))
                i += 1
        return "".join(result)

    def is_social_account_info(self, param):
        return re.fullmatch(self.ACCOUNT, param) is not None

    def secure(self, info):
        def replace(match):
            whole = match.group(0)
            cut = match.start(1) - match.start(0)
            return whole[:cut] + self.encrypt(match.group(1))
        return re.sub(self.ACCOUNT, replace, info)

📄 main.py


📖 توضیح کد

  • متد encrypt: با پیمایش رشته، زیررشته‌های یونیفرم را شناسایی می‌کند وزن هر کاراکتر = ord(ch) - 96 برای هر کاراکتر در زیررشته، (شمارنده + 1) × وزن را محاسبه کرده و به نتیجه اضافه می‌کند
  • متد is_social_account_info: از عبارت منظم (Regular Expression) برای بررسی الگو استفاده می‌کند الگوی ^[A-Z][a-zA-Z]+:www\.[a-z0-9.]+/[a-zA-Z0-9_]+$ اگر رشته دقیقاً با الگو مطابقت داشته باشد، True و در غیر این صورت False برمی‌گرداند
  • متد secure: با استفاده از re.finditer تمام بخش‌های منطبق با الگو را پیدا می‌کند برای هر بخش، نام کاربری را استخراج کرده و با encrypt رمزنگاری می‌کند نام کاربری را با مقدار رمزنگاری‌شده جایگزین می‌کند برای جلوگیری از تداخل جایگزینی، بخش‌ها از انتها به ابتدا پردازش می‌شوند
  • در متد is_social_account_info، دقت کنید که فقط حروف انگلیسی مجاز هستند و نام شبکه اجتماعی باید با حرف بزرگ شروع شود
  • در متد secure، فقط نام کاربری رمزنگاری می‌شود و بقیه‌ی قسمت‌های آدرس بدون تغییر می‌مانند
  • از re برای تطابق الگو و یافتن بخش‌ها استفاده شده است

🚀 پس از تکمیل کلاس، می‌توانید آن را با رشته‌های مختلف تست کنید و از صحت عملکرد آن اطمینان حاصل کنید.

نمونه‌ها

ورودی نمونه ۱
s = Security()
[s.encrypt("abcccdd"), s.encrypt("a"), s.encrypt("zz"), s.encrypt("aalavi"), s.encrypt("")]
خروجی نمونه ۱
['1236948', '1', '2652', '12121229', '']
ورودی نمونه ۲
s = Security()
[s.is_social_account_info("Instagram:www.instagram.com/javafan"),
 s.is_social_account_info("Facebook:www.facebook.com/Ali#Alavi"),
 s.is_social_account_info("MySite:mysite.net/user123")]
خروجی نمونه ۲
[True, False, False]
ورودی نمونه ۳
s = Security()
[s.is_social_account_info("GitHub:www.dl.github.com/user_123"),
 s.is_social_account_info("Twitter:www.twitter/abc"),
 s.is_social_account_info("instagram:www.instagram.com/abc"),
 s.is_social_account_info("X:www.x.com/abc"),
 s.is_social_account_info("Instagram:www.Instagram.com/abc")]
خروجی نمونه ۳
[True, False, False, False, False]
ورودی نمونه ۴
Security().secure("Instagram:www.instagram.com/aalavi Twitter:www.twiter.com/alaviii imdb:www.imdb.com/alavi")
خروجی نمونه ۴
'Instagram:www.instagram.com/12121229 Twitter:www.twiter.com/11212291827 imdb:www.imdb.com/alavi'
ورودی نمونه ۵
s = Security()
s.secure("no accounts here")
s.secure("Twitter:www.twitter/abc and GitHub:www.github.com/bb")
خروجی نمونه ۵
'no accounts here'
'Twitter:www.twitter/abc and GitHub:www.github.com/24'

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

ورود