عَلی و مِلی و سَلیب و سَمیرا که با یکدیگر همکار هستند؛ به صرف شام به منزل عَلی دعوت شدهاند. ولی از آنجایی که حوصلهشان سر رفته، به دنبال بازی هیجانانگیزی برای افزایش آدرنالین خونشان هستند!
بازی از این قرار است که مِلی ، سَلیب و سَمیرا ، هر کدام از بین اعداد ۱، ۲، ۳ و ۴، یک عدد انتخاب میکنند (اعداد انتخابی متمایز هستند)؛ سپس عَلی باید عددی که از بین این ۴ عدد، انتخاب نشده است را حدس بزند! اگر عددی که عَلی حدس زد درست نبود؛ باید برای مهمانهایش پیتزا بخرد، درغیر اینصورت آنها را با نان و پنیر و سبزی، سیر میکند! عَلی از شما میخواهد که به او کمک کنید تا بتواند برندهی این بازی شود.
حال شما باید تابعی به نام find(num1, num2, num3)
پیادهسازی کنید که با گرفتن سه عدد ورودی (num1
عدد انتخابی مِلی ، num2
عدد انتخابی سَلیب و num3
عدد انتخابی سَمیرا است.)، عددی که در بین این اعداد وجود ندارد را بازگرداند.
find
موجود در فایل peydayesh.py
را تکمیل و سپس این فایل را ارسال کنید.عَلی و سَلیب که با یکدیگر برادر هستند، تصمیم گرفتند یک بازی هیجانانگیز دو نفرهای را انجام دهند تا شاید آدرنالین خونشان افزایش پیدا کند.
بازی از این قرار است که عَلی و سَلیب، هر کدام یک رشته انتخاب میکنند. سپس حرف اول رشتهای که حرف اولش از لحاظ لغتنامهای کوچکتر است را حذف (اگر حرف اول دو رشته برابر بودند، حرف اول هر دو رشته را حذف میکنند.) و هر دو رشته را معکوس میکنند. این کار را تا جایی انجام میدهند که یکی از دو رشته یا هر دو رشته، خالی شوند.
حال شما باید تابع compare(string1, string2)
(که string1
رشتهی انتخابی عَلی و string2
رشتهی انتخابی سَلیب است.) را به گونهای تکمیل کنید که:
Both strings are empty!
را بازگرداند.توجه کنید که اگر یکی از رشتهها خالی شد؛ رشتهی دیگر، نباید مجدداً معکوس شود.
ابتدا حرف اول هر دو رشته بررسی میشود. چون a
از s
کوچکتر است، پس a
از ali
حذف شده و ali
به li
تبدیل میشود. سپس هر دو رشته معکوس (li
به il
و salib
به bilas
) میشوند.
حال از بین دو رشتهی جدید، چون b
از i
کوچکتر است، پس b
از bilas
حذف شده و bilas
به ilas
تبدیل میشود. سپس هر دو رشته معکوس (il
به li
و ilas
به sali
) میشوند.
حال مجددا از بین دو رشتهی جدید، چون l
از s
کوچکتر است، پس l
از li
حذف شده و li
به i
تبدیل میشود. سپس هر دو رشته معکوس (i
به i
و sali
به ilas
) میشوند.
در نهایت، از بین ۲ رشتهی جدید، چون i
و i
با یکدیگر برابر هستند، پس هر دو i
حذف میشود و i
به یک رشتهی خالی و ilas
به las
تبدیل میشوند و چون یکی از رشتهها، خالی شدهاند، محتوای رشتهی دیگر (که برابر las
است.) بازگردانده میشود.
ابتدا حرف اول هر دو رشته بررسی میشود. چون a
از n
کوچکتر است، پس a
از amin
حذف شده و amin
به min
تبدیل میشود. سپس هر دو رشته معکوس (min
به nim
و nima
به amin
) میشوند.
حال از بین دو رشتهی جدید، چون a
از n
کوچکتر است، پس a
از amin
حذف شده و amin
به min
تبدیل میشود. سپس هر دو رشته معکوس (nim
به min
و min
به nim
) میشوند.
حال مجددا از بین دو رشتهی جدید، چون m
از n
کوچکتر است، پس m
از min
حذف شده و min
به in
تبدیل میشود. سپس هر دو رشته معکوس (in
به ni
و nim
به min
) میشوند.
دوباره از بین دو رشتهی جدید، چون m
از n
کوچکتر است، پس m
از min
حذف شده و min
به in
تبدیل میشود. سپس هر دو رشته معکوس (ni
به in
و in
به ni
) میشوند.
سپس از بین دو رشتهی جدید، چون i
از n
کوچکتر است، پس i
از in
حذف شده و in
به n
تبدیل میشود. سپس هر دو رشته معکوس (n
به n
و ni
به in
) میشوند.
مجددا از بین دو رشتهی جدید، چون i
از n
کوچکتر است، پس i
از in
حذف شده و in
به n
تبدیل میشود. سپس هر دو رشته معکوس (n
به n
و n
به n
) میشوند.
در نهایت، از بین ۲ رشتهی جدید، چون n
و n
با یکدیگر برابر هستند، پس هر دو n
حذف میشود و n
به یک رشتهی خالی و n
دوم نیز به یک رشتهی خالی تبدیل میشوند و چون هر دو رشته، خالی شدهاند، عبارت Both strings are empty!
بازگردانده میشود.
compare
موجود در فایل moghayeseGar.py
را تکمیل و سپس این فایل را ارسال کنید.عَلی که با کمک شما توانست از مخمصهی خرید ۳ پیتزا نجات پیدا کند؛ حال میخواهد بعنوان تشکر، پیتزایی که برای شما بفرستد. ولی از آنجایی که شما در شهر دیگری زندگی میکنید؛ دو راه برای فرستادن پیتزا به شما پیشنهاد میکند:
از آنجایی که شما برای حل کردن این سوال و رفتن به سوال بعدی، عجلهی بسیاری دارید؛ گزینهی اول را انتخاب میکنید. ولی امان از دل غافل! شما باید دو کلاس خواسته شده را پیادهسازی کنید تا شرکت راهآهن، این پیتزا را برای شما بفرستد.
کلاس Train
از پیش پیادهسازی شده است ولی دو کلاس Trip
و Passenger
را شما باید پیادهسازی کنید.
Train
__init__
🔗این متد در فایل اولیه مقداردهی شده است و نباید آن را دستکاری کنید. ویژگیهایی که در این متد به شیء اختصاص داده میشوند، عبارتاند از:
last_visited_city
: از نوع str میباشد.weight_capacity
: از نوع float میباشد.is_on_trip
: از نوع bool است؛ در صورتی که True باشد، قطار در حال سفر است و اگر False باشد یعنی در ایستگاه راه آهن مستقر است.Trip
all_cities
: این ویژگی برابر با یک تاپل از همه شهرهایی است که امکان ساخت راه آهن در آنها وجود دارد. این ویژگی در فایل اولیه مقداردهی شده است و نباید آن را دستکاری کنید.__init__
🔗این متد در فایل اولیه مقداردهی شده است و نباید آن را دستکاری کنید. ویژگیهایی که در این متد به شیء اختصاص داده میشوند، عبارتاند از:
train
: از نوع Train میباشد.origin_city
: از نوع str میباشد.destination_city
: از نوع str میباشد.passengers
: از نوع list میباشد.origin_city_validation
این متد یک ورودی به نام origin_city میگیرد:
all_cities
موجود نباشد، یک Exception با پیغام This input is not a verified city!
پرتاب میکند. Origin and destination cities can't be the same!
پرتاب میکند.The train of the trip is not available in the origin city!
پرتاب میکند.در نهایت اگر هیچکدام از حالتهای فوق صادق نبود باید origin_city برگردانده شود.
train_validation
این متد یک ورودی به نام train میگیرد:
Train
) نباشد، یک Exception با پیغام This input is not a train!
پرتاب میکند. This train is not available!
پرتاب میکند.در نهایت اگر هیچکدام از حالتهای فوق صادق نبود باید train برگردانده شود.
داندرمتدی را برای این کلاس بازنویسی کنید که هنگام صدا زدن شیء سفر، «ظرفیتِ وزنِ بارِ باقیمانده از قطارِ سفر» برگردانده شود.
مثلا اگر یک سفر قطاری با ظرفیت وزن 1000 کیلوگرم و دو مسافر با وزن بار 60 و 70 کیلوگرم داشته باشد، هنگام صدا زدن این سفر، عدد 870 برگردانده میشود.
Passenger
__init__
🔗این متد در فایل اولیه مقداردهی شده است و نباید آن را دستکاری کنید. ویژگیهایی که در این متد به شیء اختصاص داده میشوند، عبارتاند از:
fullname
: از نوع str میباشد.load_weight
: از نوع float میباشد.attend_trip
این متد در ورودی یک سفر میگیرد و در صورتی که بار مسافر از «ظرفیتِ وزنِ بارِ باقیمانده از قطارِ سفر» کمتر یا مساوی باشد، مسافر را به لیست مسافران سفر اضافه میکند. در غیر این صورت یک Exception با پیغام Heavy load!
پرتاب میکند.
cancel_trip
این متد در ورودی یک سفر میگیرد و در صورتی که مسافر در لیست مسافران آن سفر موجود باشد، مسافر را از لیست مسافران سفر حذف میکند. در غیر این صورت یک Exception با پیغام This passenger is not attended to this trip!
پرتاب میکند.
داندرمتدی را برای این کلاس بازنویسی کنید که اگر یک شیء مسافر print
شود، به جای آدرس آن شیء در حافظه، نام مسافر چاپ شود.
Passenger
، Train
و Trip
به شکل گفته شده وجود داشته باشند.برای سَلیب و اِبلیس سوال شده بود که چه کسی در کدنویسی مهارت بیشتری دارد. بنابراین آنها تصمیم گرفتند تا پروژه ای شبیه به بخش مسابقات کوئرا پیادهسازی کنند. سپس در آن به مسابقه بپردازند تا مشخص شود که کدامیک، کُدزن قَهارتری است!
اما در پیادهسازی بخشهایی از پروژه به مشکل خوردهاند و از شما میخواهند تا این بخشها را تکمیل کنید تا هر چه سریعتر بتوانند به مسابقهی خود بپردازند.
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است.
Problem
هر شئ این مدل معادل یک مسئله (problem) در کوئراست.
این مدل دارای ویژٰگیهای زیر است:
name
:
نشاندهنده نام مسئله میباشد و از نوع CharField
است. باید حداکثر طولی برابر با 50 کاراکتر داشته باشد.description
:
نشاندهنده توضیحات مسئله میباشد و از نوع CharField
است. باید حداکثر طولی برابر با 1000 کاراکتر داشته باشد.writer
:
نشان دهنده طراح و نویسنده مسئله میباشد و از طریق رابطهی many-to-one
به مدل User
وصل میشود.
توجه داشته باشید مدل User
درون اپ accounts
در پروژه اولیه پیادهسازی شده و شما نیازی به ایجاد هیچ تغییری در آن ندارید.score
:
نشاندهنده نمره مسئله میباشد و از نوع PositiveIntegerField
است. باید مقدار پیشفرضی برابر با 100 داشته باشد.Submission
هر شئ این مدل معادل یک پاسخ ارسال شده برای سیستم داوری کوئراست.
این مدل دارای ویژگیهای زیر است:
submitted_time
:
نشاندهنده زمان پاسخ ارسالی میباشد و از نوع DateTimeField
است.participant
:
نشان دهنده فرستنده پاسخ ارسالی میباشد و از طریق رابطهی many-to-one
به مدل User
وصل میشود و دارای آرگومان related_name="submissions"
است.
توجه داشته باشید مدل User
درون اپ accounts
در پروژه اولیه پیادهسازی شده و شما نیازی به ایجاد هیچ تغییری در آن ندارید.problem
:
نشان دهنده مسئله پاسخ ارسالی میباشد و از طریق رابطهی many-to-one
به مدل Problem
وصل میشود و دارای آرگومان related_name="submissions"
است.code
:
نشاندهنده آدرس ذخیره پاسخ ارسالی میباشد و از نوع URLField
است. باید حداکثر طولی برابر با 200 کاراکتر داشته باشد.score
:
نشاندهنده نمره مسئله میباشد و از نوع PositiveIntegerField
است. باید مقدار پیشفرضی برابر با 0 داشته باشد.اکیداً توصیه میشود پیش از حل این بخش مدل Contest
موجود در اپ contests
را مطالعه کنید و با این مدل به خوبی آشنا شوید.
list_problems
این کوئری id
یک Contest
را ورودی گرفته و تمامی مسائل آن Contest
را در قالب یک کوئریست بازمیگرداند.
مثالِ خروجی این تابع به صورت زیر است:
list_users
این کوئری id
یک Contest
را ورودی گرفته و تمامی کاربرانی که در آن Contest
شرکت داشتهاند را در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
list_submissions
این کوئری id
یک Contest
را ورودی گرفته و تمامی ارسالهای آن Contest
را به ترتیب زمان ارسال (submitted_time
در مدل Submission
) از آخرین به اولین ارسال در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
list_problem_submissions
این کوئری id
یک Contest
و id
یک مسئله را ورودی گرفته و تمامی ارسالهای آن مسئله در Contest
را به ترتیب زمان ارسال (submitted_time
در مدل Submission
) از آخرین به اولین ارسال در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
list_user_submissions
این کوئری id
یک Contest
و id
یک کاربر را ورودی گرفته و تمامی ارسالهای آن کاربر در Contest
را به ترتیب زمان ارسال (submitted_time
در مدل Submission
) از آخرین ارسال به اولین ارسال در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
list_problem_user_submissions
این کوئری id
یک Contest
، id
یک کاربر و id
یک مسئله را ورودی گرفته و تمامی ارسالهای آن کاربر در Contest
برای آن مسئله را به ترتیب زمان ارسال (submitted_time
در مدل Submission
) از آخرین به اولین ارسال در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
list_users_solved_problem
این کوئری id
یک Contest
و id
یک مسئله را ورودی گرفته و تمامی کاربرانی که آن مسئله را در Contest
حل کردهاند به ترتیب زمان ارسال (submitted_time
در مدل Submission
) از آخرین به اولین ارسال در قالب یک کوئریست بازمیگرداند.
توجه کنید تنها در صورتی یک پاسخ ارسالی درست است که نمره آن برابر با نمره اصلی مسئله باشد.
مثال خروجی این تابع به صورت زیر است:
user_score
خروجی این کوئری از جنس عدد است. این کوئری id
یک Contest
و id
یک کاربر را ورودی گرفته و مجموع امتیاز آن کاربر در Contest
را خروجی میدهد.
توجه داشته باشید امتیاز هر کاربر در یک Contest
برابر با جمع بیشترین امتیازات آن کاربر برای هر سوال است. مثلاً اگر یک کاربر برای سوال اول، امتیازات ۱۰۰، ۱۵۰ و ۲۰۰ را کسب کرده و برای سوال دوم، امتیازات ۵۰ و ۱۰۰ را کسب کرده باشد؛ امتیاز او برابر با بیشترین امتیاز کسب شده در سوال اول (۲۰۰) بعلاوه بیشترین امتیاز کسب شده در سوال دوم (۱۰۰) است (یعنی ۳۰۰).
مثال خروجی این تابع به صورت زیر است:
list_final_submissions
این کوئری id
یک Contest
را ورودی گرفته و ارسالهای نهایی آن Contest
را به ترتیب زمان ارسال (submitted_time
در مدل Submission
) از آخرین به اولین ارسال، در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
امتیاز | بخش |
---|---|
۱۰ | Problem Model |
۱۰ | Submission Model |
۱۵ | Query List Problem |
۱۵ | Query List Users |
۱۵ | Query List Submissions |
۲۰ | Query List Problem Submissions |
۲۰ | Query List User Submissions |
۲۵ | Query List Problem User Submissions |
۳۰ | Query List User Solved Problem |
۴۰ | Query User Score |
۴۰ | Query List Final Submissions |
در صورتی که علاقمندید که خودتان به صورت دستی کوئریهای خود را امتحان کنید و از درستی آنها اطمینان حاصل کنید، یا اینکه به بررسی بیشتر از این تمرین بپردازید، برای راحتی بیشتر شما، فایلهای مایگریشنها ساخته شدهاند و شما کافیست پس از پیادهسازی فایل problems/models.py
جهت ایجاد پایگاهداده، یک بار دستور migrate
را اجرا کنید.
علاوهبر این، یک سری دادهی از پیش آماده شده، فراهم شده که بعد از اجرای دستور migrate
، میتوانید آنها را وارد پایگاهدادهی پروژهی خود کنید. به این منظور، دستور زیر را اجرا کنید. میتوانید از این دادهها به جهت تست کردن کوئریهای خود استفاده کنید.
۱. ایجاد پایگاهداده
۲. وارد کردن دادههای از پیش آماده شده (fixture)
در صورتی که علاقمند به تست نیستید، نیازی به ایجاد پایگاهداده و وارد کردن دادههای آزمایشی نیست، و تنها کافیست که در فایل query.py
کوئریهای خود را بنویسید و از کوئرا جهت امتحان کردن درستی کوئریهایتان استفاده کنید.
contests/query.py
problems/models.py
testsample.py
با روش تست کردن مدلها آشنا شوید.این سوال از نوع سوالات چندفایلی است. برای حل سوال میتوانید پروژه را در قالب یک فایل ZIP که شامل کلیه فایلهای موجود در پروژه است، ارسال کنید.
فرهاد که به تازگی در کوئرا استخدام شده، تصمیم گرفته برای کمک به بخش Careers کوئرا تعدادی دستور طراحی کند. او که تسلط کمی به خط فرمان دارد و فقط توانسته مدل شرکت را تکمیل کند و به علت همزمان شدن امتحاناتش با زمان تحویل، به کمک شما برای تکمیل دستورات نیاز دارد.
پروژه اولیه را از این لینک دریافت کنید. ساختار فایلهای این پروژه به صورت زیر است.
برای کمک به فرهاد، دستورات خواسته شده را در فایلهای خواسته شده پیادهسازی کنید.
addCompany
میخواهیم درون فایل addCompany.py
، دستوری برای جنگو بنویسیم که با اجرای آن، به ترتیب مقادیر name, email, phone, description (از چپ به راست) را از کاربر دریافت کند و با این مقادیر، یک نمونه از کلاس Company بسازد.
null=False
هستند، کاربر حتما باید مقداری را وارد کند. در صورتی که کاربر بدون وارد کردن مقداری Enter زد باید خطای Error: This field cannot be blank.
نمایش داده شود و برای فیلدهایی که دارای ویژگی null=True
هستند، با زدن Enter به مرحله بعد رفته و مقدار آن فیلد None شود.فیلد name
باید حداکثر ۵۰ کاراکتر باشد؛ در غیر اینصورت، عبارت
Error: Ensure this value has at most 50 characters (it has COUNT).
نمایش داده شود که به جای کلمهی COUNT، تعداد کاراکترهای عبارت شما قرار میگیرد.
همچنین این فیلد باید یکتا باشد؛ در غیر اینصورت، عبارت
Error: That name is already taken.
نمایش داده شود.
آدرس وارد شده باید یک ایمیل معتبر باشد، در غیر اینصورت باید عبارت
Error: Enter a valid email address.
نمایش داده شود.
یک شماره موبایل در صورتی معتبر است که یکی از حالتهای زیر را دارا باشد:
در غیر این صورت باید عبارت
Error: Phone number format is not valid.
نمایش داده شود.
این فیلد محدودیتی ندارد.
self.stderr.write(error_msg)
استفاده کنید.editCompany
میخواهیم درون فایل editCompany.py
، دستوری برای جنگو بنویسیم که یک positional arguments به عنوان نام شرکت و همچنین چهار optional arguments (--description
,--phone
,--email
,--name
) دریافت و فیلدهای مربوط به آن شرکت را بروز کند.
null=False
هستند، اگر آرگومان آنها برابر ''
بود؛ استثنای CommandError با پیام Field cannot be blank.
رخ دهد (به جای کلمهی Field
، نام فیلد با حرف ابتدای بزرگ قرار میگیرد.) اما برای فیلدهایی که دارای ویژگی null=True
هستند، میتواند برابر ''
باشد؛ ولی مقدار فیلد تغییری نمیکند.در صورتی که شرکتی با این نام وجود نداشت؛ باید یک Exception
با پیام
Company matching query does not exist.
رخ دهد.
آرگومان name
باید حداکثر ۵۰ کاراکتر باشد؛ در غیر اینصورت، یک Exception
با پیام
Error: Ensure this value has at most 50 characters (it has NUM).
رخ دهد که به جای NUM تعداد کاراکترهای عبارت شما قرار میگیرد.
همچنین این فیلد باید یکتا باشد، در غیر اینصورت، باید یک Exception
با پیام
Error: That name is already taken.
رخ دهد.
آدرس وارد شده باید یک ایمیل معتبر باشد در غیر این صورت باید یک Exception
با پیام
Error: Enter a valid email address.
رخ دهد.
یک شماره موبایل در صورتی معتبر است که یکی از حالتهای زیر را دارا باشد:
در غیر این صورت باید یک Exception
با پیام
Error: Phone number format is not valid.
رخ دهد.
این آرگومان محدودیتی ندارد.
rmCompany
میخواهیم درون فایل rmCompany.py
، برای جنگو بنویسیم که نام تعدادی (صفر یا بیشتر) شرکت را دریافت کند و درصورتی که شرکتی با آن نامها وجود داشت آن را از پایگاه داده حذف کند.
در صورتی که شرکتی با این نامها وجود نداشت، به ازای هر نام غیرمعتبر باید عبارت
COMPANY matching query does not exist.
نمایش داده شود، که به جای COMPANY نام شرکت وارد شده قرار میگیرد.
در صورت وجود --all
در دستور، بدون توجه به نام شرکتهای وارد شده (در صورت وجود)، تمام شرکتها حذف میشوند.
self.stderr.write(error_msg)
استفاده کنید.collectCompany
میخواهیم درون فایل collectCompany.py
، دستوری برای جنگو بنویسیم که با اجرای آن، یک فایل CSV به نام company.csv
شامل اطلاعات تماس شرکتها، در ریشهی پروژه ایجاد شود.
self.stderr.write(error_msg)
و در قسمتهایی که گفته شده یک Exception
رخ دهد، از دستور raise
استفاده کنید.career/management/commands/addCompany.py
career/management/commands/collectCompany.py
career/management/commands/editCompany.py
career/management/commands/rmCompany.py
این سوال از نوع سوالات چندفایلی است. برای حل سوال میتوانید پروژه را در قالب یک فایل ZIP که شامل کلیه فایلهای موجود در پروژه است، ارسال کنید.