سَعَد و حَمَد که در یک خوابگاه، هماتاقی هستند؛ از طبقهی همکف سوار آسانسور میشوند تا به طبقهای که اتاقشان در آن قرار دارد بروند. ولی هنگامی که سوار آسانسور میشوند؛ تصمیم به انجام بازی هیجانانگیزی میگیرند!
آسانسور خوابگاه آنها بدین صورت است که فقط دکمهی بالا و پایین دارد، دکمهی بالا، آسانسور را به یک طبقه بالاتر میبرد و دکمهی پایین، آسانسور را به یک طبقه پایینتر.
بازی به این صورت است که این دو نفر، ۴ بار فرصت دارند تا دکمهی پایین و بالای این آسانسور را فشار دهند. در نهایت، پس از اینکه ۴ بار دکمههای بالا و پایین آسانسور فشار داده شد؛ باید بفهمند که در کدام طبقه قرار دارند.
فرض میکنیم که طبقات منفی نیز داریم و آسانسور، حداکثر تا ۴ طبقه، زیر زمین نیز خواهد رفت.
حال تابع calculate_floor
را بهگونهای تکمیل کنید که با گرفتن یک رشتهی ۴ حرفی که شامل U
به معنای رفتن به طبقهی بالا و D
به معنای رفتن به طبقهی پایین است، شمارهی طبقهای که در نهایت به آن میرویم را بازگرداند.
دقت کنید که در ابتدای حرکت، در طبقهی همکف (شماره ۰) قرار داریم.
ابتدا در طبقهی همکف قرار داریم. سپس با دیدن حرف U
یک طبقه به بالا میرویم و در طبقهی ۱ قرار داریم. مجددا با دیدن حرف U
یک طبقهی دیگر به بالا میرویم و در طبقهی ۲ قرار داریم. حال با دیدن D
یک طبقه به پایین میرویم و در طبقهی ۱ قرار داریم. در نهایت با دیدن U
یک طبقه به بالا میرویم و در نهایت در طبقهی ۲ هستیم. پس عدد ۲ را بازمیگردانیم.
ابتدا در طبقهی همکف قرار داریم. با هر بار مشاهدهی حرف D
، یک طبقه به پایین میرویم. پس با ۴ بار دیدن حرف D
، چهار بار به پایین میرویم و در نهایت در طبقهی ۴- قرار میگیریم. پس ۴- را بازمیگردانیم.
calculate_floor
موجود در فایل calculator.py
را تکمیل و سپس این فایل را ارسال کنید.U
و D
میباشند.تبریک! شما در ژورنالی که سلیب رئیس آن است، استخدام شدهاید. اما سلیب که بسیار سختگیر است، در همان ابتدای کار به شما یک وظیفه محول کرده است. شما باید برنامهای برای اعتبارسنجی اولیهٔ مقالاتی که نویسندگان به ژورنال برای چاپ ارسال کردهاند، بنویسید. فرمت این اعتبارسنجی به شرح زیر است:
extract_paper
🔗در ورودی آدرس فایل مقاله و سایز فونت را می گیرد. باید بتواند با باز کردن و خواندن فایل مقاله، فیلدهای مختلف آن را استخراج کرده و یک دیکشنری از آن بسازد. فرمت مقالهها به شکل زیر است:
در نهایت این تابع باید یک دیکشنری با کلیدهای زیر برگرداند.
title
: از نوع str است.abstract
: از نوع str است.keywords
: از نوع list است.introduction
: از نوع str است.body
: از نوع str است.conclusion
: از نوع str است.references
: از نوع list است.words_count
: از نوع int است.pages_count
: از نوع int است.The abstract section can't be more than 150 words
پرتاب میشود.You can't put more than 5 keywords
پرتاب میشود. Keywords are not sorted
پرتاب میشود.The whole paper can't be more than 9 pages
پرتاب میشود.جداکنندهٔ کلمات از یکدیگر، کاراکترهای «فاصله» و «خط جدید» هستند.
محاسبهٔ تعداد صفحات از طریق تعداد کلمات و اندازهٔ فونت صورت میگیرد. هر ۵۱۲ کلمه با اندازهٔ فونت ۱۶، یک صفحه را تشکیل میدهند. اگر اندازهٔ فونت بزرگتر شود، یک صفحه شامل تعداد کلمات کمتری خواهد بود و اگر اندازهٔ فونت کوچکتر شود، یک صفحه شامل تعداد کلمات بیشتری میشود.
بهطور مثال فرض کنید یک مقاله ۵۱۲ کلمه باشد. اگر اندازهٔ فونت ۱۶ باشد، این مقاله یک صفحه است و اگر اندازهٔ فونت ۳۲ باشد، این مقاله ۲ صفحه خواهد بود زیرا هر صفحه شامل ۲۵۶ کلمه میشود.
واحد جنایی کوئرا که فعالیت خودش را از سال ۱۳۹۹ آغاز کرده بود، فیلمی از کارآگاه فرهاد -یکی از اولین کارآگاههای کوئرا- دریافت کرده است. در این فیلم فرهاد توسط یک باند مافیایی محاصره شده است و از کوئرا درخواست کمک کرده است. فرهاد به سرنخهای مهمی از عملیاتهای این باند مافیایی دست پیدا کرده است و آنها را داخل یکی از سرورهای امن کوئرا و با چند پیچیدگی امنیتی آپلود کرده است. باند مافیایی که از این ماجرا بسیار عصبانی شده بود، فرهاد را به قتل رساند! حال واحد جنایی کوئرا به کارآگاه کیان و کارآگاه آدرینا ماموریت داده است تا دادههایی که فرهاد بر روی سرور قرار داده است را رمزگشایی کنند. از آنجایی که فرهاد چندین لایه امنیتی را بر روی سرور تنظیم کرده است، آنها به کمک شما برای پیدا کردن سرنخها نیاز دارند.
کیان و آدرینا کلاسی به نام Detective
را طراحی کردند که دارای توابع زیر هست:
login
این تابع با دریافت username
و password
و URL
صفحه ورود، وظیفه احراز هویت کاربران را به عهده دارد. در صورتی که عملیات احراز هویت موفقیت آمیز باشد، یک فایل JSON
به فرمت زیر برگردانده میشود:
از آنجایی که token
و upload_url
محرمانه هستند؛ لازم هست که شما یک دیکشنری تنها با دو کلید full_name
و email
برگردانید.
full_name
یک کاربر نام و نام خانوادگی او است که با یک اسپیس از هم جدا شدهاند.و در صورتی که عملیات احراز هویت موفقیت آمیز نبود، باید یک Exception
با پیغام زیر پرتاب کنید:
POST
انجام شوند.upload_clues
سعید و مهدی که موازی با فرهاد در حال کار بر روی این پرونده بودند، مدارکی را جمعآوری و در پوشهای به نام secrets
در کنار فایل کلاینت شما قرار دادند. شما باید تمامی این مدارک را پیدا کرده و از طریق متد PUT
و فیلد uploaded_files
داخل آدرسی که در مرحله قبل دریافت کردهاید در سرور آپلود کنید.
در نهایت، سرور یک فایل JSON
که شامل کلیدهای detail
و download_url
هست را به شما برمیگرداند. از مقدار download_url
برای قسمت بعدی سوال استفاده کنید و مقدار detail
را برای ما برگردانید!
html_scraper
تبریک! شما به اسناد فرهاد دسترسی پیدا کردید. اما عجله نکنید! این تازه اول راه است. فرهاد که هیچوقت نمیخواست باند مافیا به اسناد دست پیدا کند، آنها را در مکانهای مختلفی قرار داد و لینکهایش را در صفحه HTML
ای مخفی کرد. شما در این تابع با استفاده از متد GET
و آدرس صفحهای که در مرحله قبل دریافت کردهاید، میتوانید این صفحه HTML
را دانلود کنید. حال، تمامی لینکهای آن و عنوانهایش را پیدا کنید و در دیکشنریای به تیم جنایی کوئرا برگردانید. کلید دیکشنری شما باید عنوان لینک و مقدار آن آدرس لینک باشد.
در پاسخ ارسالی خود میتوانید از هر کتابخانهای که لازم میدانید استفاده کنید. اما در فایل ارسالی خود، علاوه بر فایل solution.py
که حاوی راهحل شما است، باید فایلی با نام python_requirements.txt
نیز موجود باشد که در آن نام کتابخانههای مورد نیاز و شمارهٔ نسخهٔ آنها به فرمت زیر در آن موجود باشد:
ساختار فایل .zip
ارسالی شما باید به صورت زیر باشد:
فرهاد که به تازگی کتابفروشی آنلاین خود را باز کرده، تصمیم گرفته قابلیت تخفیف را به آن اضافه کند. ولی برای این کار نیاز به کمک شما دارد تا پروژه را طبق توضیحات ادامه تکمیل کنید.
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است:
discounts
🔗اپلیکیشن discounts
شامل مدلهای مختلفی میشود که کتاب میتواند براساس آن شامل تخفیف شود. در ادامه شرایط اعمال آنها را برای کتابها مشخص شده است.
CountryDiscount
اگر کشور کاربر با کشور مشخص شده در این تخفیف یکسان بود، تمامی کتابهای موجود شامل درصد تخفیف مشخص شده میشوند.
AuthorDiscount
تمامی کتابهایی که یکی از نویسندگان آن، نویسنده مشخص شده بود، شامل درصد تخفیف مشخص شده میشوند
CategoryDiscount
تمامی کتابهایی که یکی از دستهبندیهای آن، دستهبندی مشخص شده بود، شامل درصد تخفیف مشخص شده میشوند.
BookDiscount
در این تخیفیف تنها کتاب مشخص شده، شامل درصد تخفیف مشخص شده میشود.
اکیدا توصیه میشود پیش از حل این بخش سایر قسمتهای پروژه را مطالعه کنید.
get_discount
در books/models.py
این تابع باید بهترین تخفیفی که شامل کتاب مورد نظر (self
) میشود. را انتخاب و قیمت بعد از اعمال شدن آن تخفیف را خروجی دهد.
* ممکن است چندین تخفیف مختلف را برای کتاب بتوان اعمال کرد. ولی فقط باید بهترین تخفیف بر روی آن، اعمال شود و در خروجی قیمت پس از اعمال تخفیف برگردانده شود. * دقت کنید ممکن است ریکوئست دریافتی از طرف کاربری که احراز هویت نشده فرستاده شود.
BookViewSet
در books/views.py
شما باید با نوشتن سریالایزر یا سریالایزرهایی در books/serializers.py
برای مدل Book
و تکمیل ویو BookViewSet
ریکوئستهایی مشابه نمونههای آورده شده در فایل BookStore Quera.postman_collection.json (این فایل را با اپلیکیشن postman باز کنید.) مدیریت کنید و پاسخ مشابهی دریافت کنید.
* از فیکسچر postman_sample_fixture.josn برای ایجاد مثالهای موجود در کالکشن پستمن استفاده شده، در صورتی که مایل باشید میتوانید این فیکسچر را load کرده و ریکوئستها را مجدد اجرا کنید.
books/views.py
، books/models.py
و books/serializers.py
و ایجاد فایل جدیدی در books/
را دارید و تمامی تغییرات دیگر شما در فایلهای پروژه نادیده گرفته خواهند شد.testsample.py
با روش تست کردن مدلها، فرمها و ادمینها آشنا شوید.یک فایل ZIP حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.
کوئرا قصد دارد تا آپلودسنتری برای کاربران سامانه LMS اش طراحی کند. بدین ترتیب کاربران میتوانند فایلهای آموزشی موردنیاز خود برای هر کلاس را داخل صفحه کلاس آپلود کنند و لینکش را با بقیه به اشتراک قرار دهند. از آنجایی که همه آپلودسنترها دارای محدودیتهایی برای آپلود فایل هستند و تیم فنی کوئرا وقتی برای پیادهسازی این سامانه ندارند، از شما میخواهیم تا API آپلودسنتر مدنظرشان را طراحی کنید.
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است:
account
🔗اپلیکیشن account
شامل دو مدل میشود که محدودیتهای کاربران را مشخص میکنند. در ادامه فیلدهای هر یک توضیح داده شده است.
User
این مدل شامل فیلدهای زیر است:
account
که مشخص کننده نوع حساب کاربری یک User
است.used_storage
که مقدار فضای اشغال شده در سرور توسط User
را بر حسب بایت نشان میدهد.Account
این مدل شامل فیلدهای زیر است:
title
که عنوان اکانت را مشخص میکند.storage
که حداکثر فضای مربوط به این نوع حساب کاربری را بر حسب بایت مشخص میکند.max_file_transfer
که حداکثر محدودیت حجمی فایلهای آپلود شده مربوط به این نوع حساب کاربری را بر حسب بایت مشخص میکند.اکیدا توصیه میشود پیش از حل این بخش سایر قسمتهای پروژه را مطالعه کنید.
UploadFile
متد PUT
در این ویو، وظیفه آپلود فایل کاربران را بر عهده دارد و در پاسخ یک دیکشنری به صورت فایل JSON
مانند زیر برمیگرداند:
در این دیکشنری، کلیدها نام فایل ذخیره شده در سرور و مقدار آنها آدرس دانلود فایل مربوطه میباشد.
در صورتی که حجم فایل ارسالی از محدودیت مشخص شده (max_file_transfer
) بیشتر باشد، کلید دیکشنری اسم فایل ارسالی و مقدار آن باید عبارت زیر باشد:
و در صورتی که کاربر فضایی برای آپلود فایل جدید نداشت، کلید دیکشنری اسم فایل ارسالی و مقدار آن باید عبارت زیر باشد:
root
پروژه و در دایرکتوری زیر ذخیره شوند.FileManager
GET
در این متد، اطلاعات کاربر به صورت یک فایل JSON
مانند زیر برمیگردد:
Files
قرار دهید:DELETE
در این متد، نام فایلی که قرار است حذف شود در پارامتر file_name
از طریق دیکشنری POST
شئ ریکوئست در دسترس است. در صورتی که فایل موردنظر در سرور وجود داشت، فایل را از سرور حذف کنید، اطلاعات کاربر را بهروز کنید و پاسخ زیر را در قالب JSON
به کاربر نشان دهید:
و در صورتی که فایل در سرور موجود نبود، پاسخ زیر را در قالب JSON
و با استاتوس کد ۴۰۴ به کاربر ارائه دهید:
DownloadFile
در متد GET
این ویو، فایل خواسته شده را به صورت یک FileResponse
برگردانید.
user
نام کاربری کاربر آپلودکننده فایل است و پارامتر filename
نام فایل را مشخص میکند.upload_center/views.py
، config/settings.py
و upload_center/serializers.py
را دارید و تمامی تغییرات دیگر شما در فایلهای پروژه نادیده گرفته خواهند شد.testssample.py
با روش تست کردن مدلها، فرمها و ویوها آشنا شوید.یک فایل ZIP حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.