بازی تفاضل


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

از آن‌جایی که سلیب از دبستان کلاس‌هایش را می‌پیچاند، تفریق را به‌درستی یاد نگرفته است. اما برنامه‌نویس متبحری می‌باشد و برنامه‌ای می‌نویسد که این کار را برایش انجام دهد.

حال از شما می‌خواهیم که همانند سلیب این برنامه را پیاده‌سازی کنید تا شما هم به دانش "عمل تفریق" نیازی نداشته باشید.

شما در این سوال نیاز به پیاده‌سازی تابعی به نام game دارید که یک عدد را به صورت عدد ورودی می‌گیرد.

def game(number):
    pass
Python

خروجی تابع شما باید تفاضل رقم بزرگ‌تر ورودی از رقم کوچک‌تر ورودی را برگرداند.

توجه کنید که باید جواب را در تابع return کنید و نباید آن را print کنید و نباید چیزی را از ورودی بخوانید.

نمونه یک
>> game(17)
> 6
Python

۷ بزرگتر از ۱ است پس در خروجی باید ۱-۷ یعنی ۶ چاپ شود.

نمونه دو
>> game(66)
> 0
Python

وقتی دو رقم برابر با هم می‌باشند تفاوتشان برابر با صفر است.

نمونه سه
>> game(81)
> 7
Python

۸ بزرگتر از ۱ است پس در خروجی باید ۱-۸ یعنی ۷ چاپ شود.

نکات
  • تضمین می‌شود عدد ورودی حتما دو رقمی است.
  • برای ارسال باید یک فایل پایتون ارسال کنید که در آن تابع game به شکل گفته شده وجود داشته باشد.
  • می‌توانید فایل اولیه‌ی خام را از این لینک دانلود کنید.

بازی کلمه‌ها


فرهاد و سلیب که از بازی تفاضل خسته شده بودند، بازی جدیدی را شروع کردند.

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

در واقع فرهاد به سلیب یک رشته می‌دهد که کلمات آن‌ها با کاراکترهای Whitespace از هم جدا شده‌اند؛ برای مثال اگر متن ورودی Hello SAliB! باشد، کلمات آن Hello و SAliB! هستند.

از نظر فرهاد هر کاراکتری که جز حروف انگلیسی نباشد، یک حرف بد است و باید حذف شود. برای مثال کاراکترهای A و b حرف خوب و کاراکتر ! حرف بد هستند.

هم‌چنین به یک کلمه بد می‌گوییم اگر حداقل نیمی از کاراکترهای آن بد باشند. سلیب باید به ازای هر کلمه خوب، کاراکترهای بد آن را حذف کند و سپس کاراکتر اول هر کلمه را بزرگ و دیگر کاراکترها را کوچک کند. برای مثال کلمه A! بد است اما A!A خوب است.

برای مثال اگر متن ورودی به صورت زیر باشد:

"hEllO My FriEnDs!!! thIS i$s A tE%sT For your #p#r#o#b#l#e#m a
Plain text

بعد از این عملیات رشته به صورت زیر در می‌آید:

Hello My Friends This Is A Test For Your A
Plain text

توجه کنید که در این نمونه کلمه #p#r#o#b#l#e#m بد است و حذف شده و از دیگر کلمه‌ها فقط کاراکترهای خوبشان باقی مانده است.

در نهایت سلیب باید در قالب یک لغت‌نامه (Dictionary) که کلیدهای آن کلمات متن و مقادیر هر کلید، تعداد تکرار آن کلمه در متن نهایی است برگرداند.

شما باید تابعی به نام words_check بنویسید که با گرفتن متن ورودی، لغت‌نامه خواسته شده را برگرداند.

نمونه
>> words_check("""hEllO My FriEnDs!!!
thIS is A tEsT For your #p#r#o#b#l#e#m a""")
{'A': 2, 'For': 1, 'Friends': 1, 'Hello': 1, 'Is': 1, 'My': 1, 'Test': 1, 'This': 1, 'Your': 1}
Python
نکات
  • برای این که کلمات رشته s را بر حسب کاراکترهای Whitespace جدا کنید، می‌توانید از تابع s.split() استفاده کنید.
  • برای ارسال باید یک فایل پایتون ارسال کنید که در آن تابع words_check به شکل گفته شده وجود داشته باشد.
  • می‌توانید فایل اولیه‌ی خام را از این لینک دانلود کنید.

بازی اسم‌فامیل


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

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

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

فایل کامل کلمات🔗

دوستان سلیب برای این که در امتیازدهی به مشکل نخورند یک فایل CSV آماده کردند که شامل همه کلمات درست است.

این فایل با نام esm_famil_data.csv به فرمت CSV در اختیار شما قرار دارد که می‌توانید از این لینک آن را دانلود کنید.

نمونه محتوای فایلCSV:

esm,famil,keshvar,rang,ashia,ghaza
اب گوشت,استکان,ابی,المان,اسدی,اوا
اش,ایینه,اجری,البانی,ارمانی,ارزو
برنج خورشت,اره,ارغوانی,انگولا,اکبری,اتنا
باقالی پلو,اره برقی,ارکیده,اتریش,اعظمی,ارش
به پلو,اب پاش,البالویی,امریکا,امینی,امنه
باقلوا,بیل,بژ,ایتالیا,ازادی,ارمین
پیتزا,بمب,بنفش,ارژانتین,بابایی,ایدا
...
Plain text

پیشنهاد می‌کنیم قبل از شروع به پیاده‌سازی یک بار این فایل را باز کنید و محتویات آن را ببینید (اگر با باز کردن این فایل مشکل داشتید می‌توانید از ابزار گوگل‌شیت استفاده کنید).

شما باید سه تابع با نام های ready_up و add_participant و calculate_all را برای سلیب پیاده‌سازی کنید.

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

تابع ready_up

این تابع باید محتویات درون فایل CSV را خوانده و به طور دل‌خواه شما ذخیره کند. فایل CSV با نام ‍esm_famil_data.csv در کنار فایل پایتون شما قرار دارد.

تابع add_participant

این تابع باید یک بازیکن را به بازی اضافه کند. ورودی این تابع به این صورت است:

add_participant(participant = 'salib', answers = {'esm': 'بردیا', 'famil': 'بابایی', 'keshvar': 'باربادوس', 'rang': 'بنفش', 'ashia': 'بمب', 'ghaza': 'باقالیپلو'})
Python
  • شما نیاز دارید جواب‌های تک‌ تک بازیکنان را نیز به نحوی که هر پاسخ مختص یک نفر باشد ذخیره کنید.
تابع calculate_all

این تابع در زمانی فراخوانی می‌شود که تمامی بازیکنان پاسخ‌هایشان را به برنامه شما داده‌اند.

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

نمره‌دهی در انتهای سوال به طور کامل توضیح داده شده است.

قوانین امتیاز دهی بازی:🔗

در هر فیلد ( برای مثال ghaza ) دو حالت امتیازدهی زیر را داریم:

۱- اگر برای این فیلد همه‌ی بازیکنان جوابی را ارائه کرده باشند:

  • اگر بازیکن پاسخی ارائه کرده باشد که در لیست کلمات قابل قبول نیست و یا پاسخی ارائه نکرده باشد، ۰ امتیاز می‌گیرد.
  • اگر بازیکن پاسخی تکراری داده باشد ( مثلا برای غذا سه نفر پیتزا نوشته باشند )، ۵ امتیاز می‌گیرد.
  • اگر بازیکن پاسخ متمایزی داده باشد ۱۰ امتیاز می‌گیرد.

۲- اگر بازیکنی وجود داشته باشد که برای این فیلد پاسخی ارائه نکرده باشد:

  • اگر بازیکن پاسخی ارائه کرده باشد که در لیست کلمات قابل قبول نیست و یا پاسخی ارائه نکرده باشد، ۰ امتیاز می‌گیرد.
  • اگر بازیکن پاسخی تکراری داده باشد ( مثلا برای غذا سه نفر پیتزا نوشته باشند )، ۱۰ امتیاز می‌گیرد.
  • اگر بازیکن پاسخ متمایزی داده باشد ۱۵ امتیاز می‌گیرد.
نمونه بازی
>> ready_up()
>> add_participant(participant = 'salib', answers = {'esm': 'بردیا', 'famil': 'بابایی', 'keshvar': 'باربادوس', 'rang': 'بنفش', 'ashia': 'بمب', 'ghaza': 'باقالیپلو'})
>> add_participant(participant = 'kianoush', answers = {'esm': 'بهرام', 'famil': 'بهرامی', 'keshvar': 'برزیل', 'rang': 'بلوطی', 'ashia': 'بیل', 'ghaza': 'به   پلو'})
>> add_participant(participant = 'sajjad', answers = {'esm': 'بابک', 'famil': 'بهشتی', 'keshvar': 'باهاما', 'rang': 'بژ', 'ashia': '        ', 'ghaza': 'برنج خورشت'})
>> add_participant(participant = 'farhad', answers = {'esm': 'بهرام', 'famil': 'براتی', 'keshvar': 'بببببب', 'rang': 'بژ', 'ashia': 'بیل', 'ghaza': 'باقلوا'})
>> calculate_all()
> {'salib': 65, 'kianoush': 55, 'sajjad': 45, 'farhad': 40}
Python

توضیحات بازی:🔗

  • ممکن است پاسخ های درست به شکل نگارشی دیگری در بازی وجود داشته باشند. برای مثال: در شرکت‌کننده salib برای فیلد ghaza پاسخ باقالیپلو معادل باقالی پلو ایست که در فایل esm_famil_data.csv وجود دارد و در شرکت‌کننده kianoush برای فیلد ghaza پاسخ به پلو معادل به پلو ایست که در فایل esm_famil_data.csv وجود دارد.
  • ممکن است پاسخ خالی به صورت تعدادی کاراکتر اسپیس به شما ارائه شود. برای مثال: در شرکت‌کننده sajjad برای فیلد ashia پاسخ ‌‌‌‌‌‌‌‌ ‌‌‌‌‌‌‌ ‌‌‌‌‌‌‌ ‌‌‌‌‌‌‌ ‌‌‌‌‌‌‌ معادل پاسخ خالیست.
نکات
  • تضمین میشود که ورودی تابع شما شامل آ نمی‌باشد و تمامی الف‌ها به صورت ا می‌باشند. یعنی اگر شرکت‌ کننده‌ای برای esmesm آیدا نوشته باشد، به تابع شما ایدا ورودی داده میشود.
  • تضمین میشود تمامی پاسخ‌ها با یک حرف شروع می‌شوند یعنی اگر بازی با حرف س شروع می‌شود پاسخ‌های تمامی شرکت‌کننده‌ها با س شروع می‌شود.
  • می‌توانید فایل اولیه‌ی خام را از این لینک دانلود کنید.

آن‌چه باید آپلود کنید🔗

فایل کامل شده source.py را ارسال کنید؛ همچنین برای استفاده از کتابخانه‌های مختلف می‌توانید همراه فایل ارسالی، فایلی به نام python_requirements.txt در ZIP خود بگذارید که در آن نام کتاب‌خانه‌های مورد نیاز و شماره نسخه‌ی آن‌ها به فرمت زیر در آن موجود باشد: (اگر شماره نسخه را ننویسید آخرین نسخه‌ی آن کتابخانه نصب می‌شود)

firstlib==1.2.3
secondlib==4.5.6
...
Plain text

در نهایت یک فایل ZIP حاوی دو فایل خواسته شده را آپلود کنید.

بازی فولدرهای خسته


از بین تمامی دوستان سلیب تنها سجاد برای شب در خانه مانده و بقیه رفته‌اند.

بازی قبلی برای دو نفر مناسب نبود به همین دلیل بازی جدیدی ابداء کردند که دو نفری بتوانند آن را اجرا کنند.

سلیب بازی را به سمت دنیای ‌IT پیش می‌برد و به سجاد ایده‌ی بازی جدیدش را می‌گوید.

توضیح بازی🔗

بازی آن‌ها به این صورت است که در ابتدا مسیری از کامپیوتر سلیب به طور تصادفی به نام path انتخاب می‌شود. سپس سلیب و سجاد هر یک پسوندی را برای خود انتخاب می‌کنند (مثلا سلیب mp4 و سجاد jpg انتخاب می‌کند).

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

تقلب او به این صورت است که یک نام انتخاب می‌کند و پسوند تمامی فایل‌هایی که نام برابر با نام انتخابی او دارند را به پسوند انتخابی خودش تغییر می‌دهد.

sajjad.txt    
Bash

در مثال بالا ‍sajjad اسم فایل و txt پسوند فایل می‌باشد.

مثال بازی‌ای که در آن سجاد تقلب نمی‌کند
src_folder
├── My-videos
│   └── video.mp4
├── image.jpg
└── video.mp4
Bash

اگر سلیب jpg و سجاد mp4 انتخاب کرده باشد سجاد برنده بازی است.

مثال بازی‌ای که در آن سجاد تقلب می‌کند
src_folder
├── My-videos
│   ├── video2.mp4
│   └── about.txt
├── about.txt
├── image.jpg
└── video1.mp4
Bash

اگر سلیب mp4 و سجاد jpg را انتخاب کرده باشد، سلیب برنده بازی است؛ اما سجاد با تقلب روی اسم about می‌تواند دو فایل را به پسوند انتخابی خودش (یعنی jpg ) تغییر داده و برنده بازی شود.

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

توضیح تابع combet

این تابع به عنوان ورودی سه متغیر از نوع رشته را می‌پذیرد، و به عنوان خروجی تابع شما باید نتیجه بازی را باز‌گرداند.

def combet(SAliB_format, Sajjad_format, path):
    pass
Python

توجه کنید که نتیجه‌ی بازی بنا به قوانین زیر متغیر هستند پس قوانین را با دقت بخوانید.

قوانین بازی🔗

۱- اگر سجاد به طور عادی برنده‌ی بازی می‌شد تابع شما باید مقدار زیر را برگرداند:

Win! Normally!
Plain text

۲- اگر سجاد به طور عادی برنده‌‌ی بازی نمی‌شد، ولی می‌توانست با تقلب روی اسمی برنده شود، تابع شما باید مقدار زیر را برگرداند:

Win! you can win if you cheat on '{cheat_name}'!
Plain text

توجه کنید که '{cheat_name}' نام کلمه‌ایست که سجاد باید روی آن تقلب کند تا ببرد برای مثال در مثال بازی‌ای که در آن سجاد تقلب می‌کند‍‍ که چند خط بالاتر توضیح داده شده است، باید مقدار زیر را برگردانید:

Win! you can win if you cheat on 'about'!
Plain text

توجه کنید که اگر سجاد با تقلب روی چندین اسم می‌توانست برنده شود، می‌توانید هر یک از اسم‌ها را به دلخواه برگردانید.

۳- اگر سجاد هیچ استراتژی بردی نداشت باید مقدار زیر را برگردانید:

Lose! you can't win this game!
Plain text
نکات
  • تضمین می‌شود اسم فولدری شامل . نمی‌باشد.
  • تضمین می‌شود اگر در فولدری دو فایل هم‌نام با پسوند متفاوت وجود داشت شما اگر بر روی نام آن فایل تقلب کنید مشکلی ایجاد نمی‌شود (یعنی مثلا اگر در یک فولدر SAliB.txt همراه SAliB.mp4 وجود داشت و شما بر روی نام SAliB تقلب کنید تعداد فایل‌ها با پسوند انتخابی سجاد دو واحد به ازای این دو فایل اضافه می‌شود).
  • شما حق rename کردن فایلی را ندارید و تنها باید بگویید که چه کسی بازی را می‌برد.
  • کد شما فقط می‌تواند از کتابخانه‌های استاندارد پایتون استفاده کند.
  • کد شما نباید شامل کلمه‌های shutil یا import sh یا ‍‍from sh یا subprocess یا ‍‍os.popen یا ‍‍os.system باشد.
  • می‌توانید فایل اولیه‌ی خام را از این لینک دانلود کنید.

بازی پول


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

شرکت سلیب از همان ابتدا برای خود هدفی پیدا کرد. این شرکت می‌خواهد برای خود سایتی راه‌اندازی کند تا بتواند مشتری‌های بیشتری را جذب کند. به همین دلیل از علی و کیانوش در این راستا تقاضای کمک کرده است.

آن‌ها هم چون در برنامه‌نویسی تازه‌کارند از شما درخواست کرده‌اند که این پروژه را برای‌شان پیاده‌سازی کنید.

توضیحات پروژه🔗

برای این پروژه ما نیاز به یک کلاس Account و یک کلاس Site داریم.

کلاس Account

هر شی این کلاس دارای پنج ویژگی (AttributeAttribute) است که در تابع ــinitــ مقداردهی می‌شود و به ازای هر شیء مقدار آن فرق دارد:

۱. یوزرنیم username

یوزرنیم کاربر باید به فرمت (نام + آندر لاین + نام خانوادگی) ذخیره شود. توجه کنید که نام و نام خانوادگی فقط باید از حروف انگلیسی باشند.

در صورتی که یوزرنیم دریافتی مانند فرمت بالا نبود باید یک ExceptionException با متن اررور invalid username raise کنید.

مثال:

  • اگر یوزرنیم برابر با ali_babaei بود مشکلی ندارد.
  • اما اگر یوزرنیم برابر با kianoush_nasr_azadani بود باید ExceptionException خواسته شده را raise کنید.
۲. پسورد password

پسورد کاربر باید دارای نکات زیر باشد:

  • طول آن حداقل ۸ کاراکتر باشد.
  • حتما شامل یک حرف بزرگ، یک حرف کوچک، یک عدد باشد.
  • باید حتما به صورت هش(hash) با فرمت sha256 و encode utf-8 ذخیره شود. در صورتی که پسورد دریافتی مانند فرمت بالا نبود باید یک ExceptionException با متن اررور invalid password raise کنید.

مثال:

  • اگر پسورد برابر با Aa123123 بود مشکلی ندارد و صحیح است.
  • ولیکن اگر پسورد برابر با Aa12312 AA123123 aa123123 valid نیست.
۳. کد ملّی user_id

کدملّی کاربر باید اعتبار سنجی شود

الگوریتم اعتبارسنجی کد ملی:

کد ملی شماره‌ای است ۱۰ رقمی که از سمت چپ سه رقم کد شهرستان محل صدور شناسنامه، شش رقم بعدی کد منحصربه‌فرد برای فرد دارنده‌ی شناسنامه در شهرستان محل صدور و رقم آخر آن هم یک رقم کنترل است که از روی ۹ رقم سمت چپ به‌دست می‌آید. برای بررسی کنترل کد کافی‌ست مجدد از روی ۹ رقم سمت چپ رقم کنترل را محاسبه کنیم نمایش جایگاه‌های کدملی

۱- برای محاسبه‌ی رقم کنترل از روی سایر ارقام، هر رقم را در موقعیت آن ضرب کرده و حاصل را با هم جمع می‌کنیم.

۲- مجموع به‌دست آمده از مرحله یک را بر ۱۱ تقسیم می‌کنیم.

۳- اگر باقیمانده کمتر از ۲ باشد، رقم کنترل باید برابر باقیمانده باشد در غیر این‌صورت رقم کنترل باید برابر یازده منهای باقیمانده باشد.

مثال : آیا کد ۷۷۳۱۶۸۹۹۵۱ یک کد ملی معتبر است؟

توضیح مثال کدملی

حاصل جمع ضرب ارقام ۲ الی ۱۰ را در موقعیت آنها محاسبه می‌کنیم:

۱۰+۲۷+۳۶+۴۰+۳۶+۷+۲۴+۶۳+۷۰ = ۳۱۳

باقیمانده تقسیم ۳۱۳ بر ۱۱ = ۵

چون باقیمانده برابر با ۵ و بزرگتر یا مساوی ۲ است پس باید رقم کنترل این کد برابر ۶(یازده منهای پنج برابر است با شش)باشد.

در صورتی که کدملّی دریافتی مانند فرمت بالا نبود باید یک ExceptionException با متن اررور invalid code melli raise کنید.

مثال:

  • اگر کدملّی برابر با 0024848484 بود مشکلی نداشته و valid است.
  • ولیکن اگر کد ملی برابر با 0024848483 valid نیست.
۴. شماره موبایل phone

شماره تلفن کاربر ممکن است به دو فرمت به شما داده شود:

۱- +989xxxxxxxxx

۲- 09xxxxxxxxx

اگر شماره صحیح بود در هر حالتی شما باید آن‌ را به صورت 09xxxxxxxxx ذخیره کنید،

و در صورتی که شماره موبایل دریافتی مانند فرمت بالا نبود باید یک ExceptionException با متن اررور invalid phone number raise کنید.

مثال:

  • اگر شماره‌ی موبایل برابر با 09121212121 باشد مشکلی ندارد.
  • ولیکن اگر شماره‌ی موبایل برابر با 08121212121, 0912121212, +988121212121, +98912121212 باشد valid نیست.
۵. ایمیل email

تضمین می‌شود ایمیل ورودی به فرمت First_Part@Second_Part.Third_Part به شما داده می‌شود.

ایمیل کاربر باید صحیح باشد، ایمیلی را صحیح می‌نامیم اگر و فقط اگر:

  • First_Part و Second_Part تنها شامل حروف بزرگ و کوچک، اعداد، _، -، . باشد و تضمین می‌شود نیازی به چک کردن محدودیت طولی بخش اول و دوم ندارید.
  • Third_Part باید تنها شامل حروف بزرگ و کوچک باشد و طولی میان ۲ تا ۵ کاراکتر داشته باشد.

در صورتی که ایمیل دریافتی مانند فرمت بالا نبود باید یک ExceptionException با متن اررور invalid email raise کنید.

دکوراتورها🔗

تابع show_welcome

این تابع بر اساس آنچه به عنوان کد اولیه پیاده‌سازی شده است شما باید آن را به نحوی پیاده‌سازی کنید که در ابتدا نام کاربری شخص (username) را که شامل آندرلاین است را برداشته و به جای آن space قرار داده و حروف اول آن را به صورت capital (بزرگ) بنویسد.؛

اگر طول این کلمه بیشتر از ۱۵ کاراکتر باشد (به همراه کاراکتر فاصله) هم ادامه آن را حذف کرده و به آخر آن ... قرار دهد و در آخر تابع welcome فراخوانی کند.

مثال:

>> print(user.username)
> kianoush_nasr
>> print(user2.username)
> salib_alibabaeei
>> welcome(user)
> welcome to our site Kianoush Nasr
>> welcome(user2)
> welcome to our site Salib Alibabaee...
Python
تابع verify_change_password

این تابع به عنوان کد اولیه پیاده‌سازی شده است و شما تنها نیاز است که اگر پسورد قبلی شما با old_password یکسان بود پسورد جدید را برای user قرار دهد و در آخر تابع change_password را فراخوانی کند.

توجه
  • پسورد در هنگام تغییر یا در حالت set کردن باید به صورت هش شده ذخیره گردد.
  • کلاس یوزر باید دارای تابعی به نام set_new_password باشد که پسورد یوزر را عوض می‌کند(در این مرحله نیز باید چک کنید پسورد جدید دارای نکات گفته شده باشد و اگر بود باید آن را به صورت هش ذخیره کنید)
کلاس Site

هر شی این کلاس دارای سه ویژگی (AttributeAttribute) است که در تابع ــinitــ مقداردهی می‌شود و به ازای هر شیء مقدار آن فرق دارد:

۱. آدرس سایت url🔗

تضمین می‌شود آدرس سایت صحیحی به شما داده می‌شود و نیازی به چک کردن آن ندارید.

۲. افراد ثبت نام شده register_users🔗

در هنگام ساخت شیء این مقدار را برابر با یک لیست خالی قرار دهید.

۳. افراد فعال در سایت active_users🔗

در هنگام ساخت شیء این مقدار را برابر با یک لیست خالی قرار دهید.

جزئیات🔗

تابع register

کلاس سایت باید دارای تابعی به نام register باشد. این تابع یک شیء از کلاس یوزر ورودی می‌گیرد و اگر آن یوزر در register_users خود سایت بود یک ExceptionException با متن ارور user already registered raise کنید وگرنه آن را به لیست register_users خود سایت بیفزایید و عبارت register successful را برگردانید.

توجه کنید که لیست register_users باید به ترتیب ثبت‌نام کاربران، آن‌ها را در خود ذخیره کند.

تابع login

کلاس سایت باید دارای تابعی به نام login باشد. این تابع ورودی‌های متفاوتی می‌گیرد:

۱- ممکن است email و username و password به آن داده شود. در این حالت شما باید چک کنید یوزری در register_users سایت وجود دارد که هم یوزرنیم و هم ایمیلی برابر با ورودی داشته باشد و پسوردش برابر با هش شده‌ی پسورد ورودی باشد یا خیر. ۲- ممکن است username و password به آن داده شود. در این حالت شما باید چک کنید یوزری در register_users سایت وجود دارد که یوزرنیمی برابر با ورودی داشته باشد و پسوردش برابر با هش شده‌ی پسورد ورودی باشد یا خیر. ۳- ممکن است email و password به آن داده شود. در این حالت شما باید چک کنید یوزری در register_users سایت وجود دارد که ایمیلی برابر با ورودی داشته باشد و پسوردش برابر با هش شده‌ی پسورد ورودی باشد یا خیر.

  • باید با توجه به این‌که ورودی تابع از کدام نوع است لاگین(login) را با اطلاعات ورودی تطبیق دهید.
  • اگر کاربری در هرکدام از حالات بالا یافت شد باید آن شیء یوزر را به لیست active_users اضافه کنید و عبارت login successful را برگردانید.
  • اگر در هر کدام از حالات قبل از تطبیق اطلاعات یوزر در لیست active_users موجود بود باید عبارت user already logged in را برگردانید.
  • اگر اطلاعات ورودی برای هیچ‌کدام از کاربر‌های register_users نبودند باید عبارت invalid login را برگردانید.

توجه کنید که لیست active_users باید به ترتیب ورود کاربران، آن‌ها را در خود ذخیره کند.

تابع logout

کلاس سایت باید دارای تابعی به نام logout باشد. این تابع یک شیء از کلاس یوزر ورودی می‌گیرد و اگر آن یوزر در active_users خود سایت بود آن را از لیست حذف کرده و عبارت logout successful را برگردانید و در صورت عدم وجود آن یوزر در active_users سایت عبارت user is not logged in را برگردانید.

نکات
  • شما می‌توانید با پیاده‌سازی این سوال به صورت بخش‌بخش نمره بگیرید.
  • برای ارسال باید یک فایل پایتون ارسال کنید که در آن تابع Account و Site و دکوراتورها به شکل گفته شده وجود داشته باشد.
  • می‌توانید فایل اولیه‌ی خام را با استفاده از این این لینک دانلود کنید.