.لینکهای مفید برای شرکت در مسابقه:
میتوانید سوالهای خود را در رابطه با سوالات و دیگر بخشهای پایتون از قسمت "سوال بپرسید" مطرح کنید.
توجه کنید که نسخه پایتون استفاده در سوالات ۳.۷ است.
برای سَلیب و اِبلیس سوال شده بود که چه کسی در کدنویسی مهارت بیشتری دارد. بنابراین آنها تصمیم گرفتند تا پروژه ای شبیه به بخش مسابقات کوئرا پیادهسازی کنند. سپس در آن به مسابقه بپردازند تا مشخص شود که کدامیک، کُدزن قَهارتری است!
اما در پیادهسازی بخشهایی از پروژه به مشکل خوردهاند و از شما میخواهند تا این بخشها را تکمیل کنید تا هر چه سریعتر بتوانند به مسابقهی خود بپردازند.
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است.
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 که شامل کلیه فایلهای موجود در پروژه است، ارسال کنید.