برای سَلیب و اِبلیس سوال شده بود که چه کسی در کدنویسی مهارت بیشتری دارد. بنابراین آنها تصمیم گرفتند تا پروژه ای شبیه به بخش مسابقات کوئرا پیادهسازی کنند. سپس در آن به مسابقه بپردازند تا مشخص شود که کدامیک، کُدزن قَهارتری است!
اما در پیادهسازی بخشهایی از پروژه به مشکل خوردهاند و از شما میخواهند تا این بخشها را تکمیل کنید تا هر چه سریعتر بتوانند به مسابقهی خود بپردازند.
پروژه اولیه
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است.
quera_contest
├── accounts
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── permissions.py
│ ├── serializers.py
│ ├── tests.py
│ ├── urls.py
│ ├── validators.py
│ └── views.py
├── contests
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── > query.py <
│ ├── tests.py
│ └── views.py
├── fixtures
│ ├── sample_contest.json
│ └── sample_data.json
├── problems
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── > models.py <
│ ├── tests.py
│ └── views.py
├── tests
│ ├── __init__.py
│ └── testsample.py
├── manage.py
└── requirements.txt
جزئیات
مدلهایی که شما باید پیادهسازی کنید
مدل Problem
Problemهر شئ این مدل معادل یک مسئله (problem) در کوئراست.
این مدل دارای ویژٰگیهای زیر است:
- فیلد
name: نشاندهنده نام مسئله میباشد و از نوعCharFieldاست. باید حداکثر طولی برابر با 50 کاراکتر داشته باشد. - فیلد
description: نشاندهنده توضیحات مسئله میباشد و از نوعCharFieldاست. باید حداکثر طولی برابر با 1000 کاراکتر داشته باشد. - فیلد
writer: نشان دهنده طراح و نویسنده مسئله میباشد و از طریق رابطهیmany-to-oneبه مدلUserوصل میشود. توجه داشته باشید مدلUserدرون اپaccountsدر پروژه اولیه پیادهسازی شده و شما نیازی به ایجاد هیچ تغییری در آن ندارید. - فیلد
score: نشاندهنده نمره مسئله میباشد و از نوعPositiveIntegerFieldاست. باید مقدار پیشفرضی برابر با 100 داشته باشد.
مدل Submission
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
list_problemsاین کوئری id یک Contest را ورودی گرفته و تمامی مسائل آن Contest را در قالب یک کوئریست بازمیگرداند.
مثالِ خروجی این تابع به صورت زیر است:
<QuerySet [<Problem: Problem object (1)>, <Problem: Problem object (2)>, <Problem: Problem object (3)>]>
کوئری list_users
list_usersاین کوئری id یک Contest را ورودی گرفته و تمامی کاربرانی که در آن Contest شرکت داشتهاند را در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
<QuerySet [<User: SAliB>, <User: Saeid>, <User: Ali>]>
کوئری list_submissions
list_submissionsاین کوئری id یک Contest را ورودی گرفته و تمامی ارسالهای آن Contest را به ترتیب زمان ارسال (submitted_time در مدل Submission) از آخرین به اولین ارسال در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
<QuerySet [<Submission: Submission object (12)>, <Submission: Submission object (6)>, <Submission: Submission object (16)>, <Submission: Submission object (5)>, <Submission: Submission object (11)>, <Submission: Submission object (15)>, <Submission: Submission object (14)>, <Submission: Submission object (4)>, <Submission: Submission object (10)>, <Submission: Submission object (9)>, <Submission: Submission object (3)>, <Submission: Submission object (8)>, <Submission: Submission object (2)>, <Submission: Submission object (13)>, <Submission: Submission object (1)>, <Submission: Submission object (7)>]>
کوئری list_problem_submissions
list_problem_submissionsاین کوئری id یک Contest و id یک مسئله را ورودی گرفته و تمامی ارسالهای آن مسئله در Contest را به ترتیب زمان ارسال (submitted_time در مدل Submission) از آخرین به اولین ارسال در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
<QuerySet [<Submission: Submission object (9)>, <Submission: Submission object (8)>, <Submission: Submission object (2)>, <Submission: Submission object (13)>, <Submission: Submission object (1)>, <Submission: Submission object (7)>]>
کوئری list_user_submissions
list_user_submissionsاین کوئری id یک Contest و id یک کاربر را ورودی گرفته و تمامی ارسالهای آن کاربر در Contest را به ترتیب زمان ارسال (submitted_time در مدل Submission) از آخرین ارسال به اولین ارسال در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
<QuerySet [<Submission: Submission object (6)>, <Submission: Submission object (5)>, <Submission: Submission object (4)>, <Submission: Submission object (3)>, <Submission: Submission object (2)>, <Submission: Submission object (1)>]>
کوئری list_problem_user_submissions
list_problem_user_submissionsاین کوئری id یک Contest، id یک کاربر و id یک مسئله را ورودی گرفته و تمامی ارسالهای آن کاربر در Contest برای آن مسئله را به ترتیب زمان ارسال (submitted_time در مدل Submission) از آخرین به اولین ارسال در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
<QuerySet [<Submission: Submission object (2)>, <Submission: Submission object (1)>]>
کوئری list_users_solved_problem
list_users_solved_problemاین کوئری id یک Contest و id یک مسئله را ورودی گرفته و تمامی کاربرانی که آن مسئله را در Contest حل کردهاند به ترتیب زمان ارسال (submitted_time در مدل Submission) از آخرین به اولین ارسال در قالب یک کوئریست بازمیگرداند.
توجه کنید تنها در صورتی یک پاسخ ارسالی درست است که نمره آن برابر با نمره اصلی مسئله باشد.
مثال خروجی این تابع به صورت زیر است:
<QuerySet [<User: SAliB>]>
کوئری user_score
user_scoreخروجی این کوئری از جنس عدد است. این کوئری id یک Contest و id یک کاربر را ورودی گرفته و مجموع امتیاز آن کاربر در Contest را خروجی میدهد.
توجه داشته باشید امتیاز هر کاربر در یک Contest برابر با جمع بیشترین امتیازات آن کاربر برای هر سوال است. مثلاً اگر یک کاربر برای سوال اول، امتیازات ۱۰۰، ۱۵۰ و ۲۰۰ را کسب کرده و برای سوال دوم، امتیازات ۵۰ و ۱۰۰ را کسب کرده باشد؛ امتیاز او برابر با بیشترین امتیاز کسب شده در سوال اول (۲۰۰) بعلاوه بیشترین امتیاز کسب شده در سوال دوم (۱۰۰) است (یعنی ۳۰۰).
مثال خروجی این تابع به صورت زیر است:
600
کوئری list_final_submissions
list_final_submissionsاین کوئری id یک Contest را ورودی گرفته و ارسالهای نهایی آن Contest را به ترتیب آیدی شرکتکننده (participant_id در مدل Submission) از آخرین به اولین ارسال، در قالب یک کوئریست بازمیگرداند.
مثال خروجی این تابع به صورت زیر است:
<QuerySet [{'participant_id': 1, 'problem_id': 1, 'score__max': 100}, {'participant_id': 1, 'problem_id': 2, 'score__max': 200}, {'participant_id': 1, 'problem_id': 3, 'score__max': 300}, {'participant_id': 2, 'problem_id': 1, 'score__max': 100}, {'participant_id': 2, 'problem_id': 2, 'score__max': 120}, {'participant_id': 3, 'problem_id': 1, 'score__max': 100}, {'participant_id': 3, 'problem_id': 2, 'score__max': 200}, {'participant_id': 3, 'problem_id': 3, 'score__max': 240}]>
زیرمسئلهها
| امتیاز | بخش |
|---|---|
| ۱۰ | 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، میتوانید آنها را وارد پایگاهدادهی پروژهی خود کنید. به این منظور، دستور زیر را اجرا کنید. میتوانید از این دادهها به جهت تست کردن کوئریهای خود استفاده کنید.
۱. ایجاد پایگاهداده
python manage.py migrate
۲. وارد کردن دادههای از پیش آماده شده (fixture)
python manage.py loaddata fixtures/sample_data.json
python manage.py loaddata fixtures/sample_contest.json
در صورتی که علاقمند به تست نیستید، نیازی به ایجاد پایگاهداده و وارد کردن دادههای آزمایشی نیست، و تنها کافیست که در فایل query.py کوئریهای خود را بنویسید و از کوئرا جهت امتحان کردن درستی کوئریهایتان استفاده کنید.
تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
python manage.py test
نکات
- شما تنها مجوز ایجاد تغییرات در فایلهای زیر را دارید و تمامی تغییرات دیگر شما در فایلهای پروژه نادیده گرفته خواهند شد.
- فایل
contests/query.py - فایل
problems/models.py
- فایل
- فراموش نکنید که میتوانید با مطالعهی
testsample.pyبا روش تست کردن مدلها آشنا شوید.
نحوه ارسال
یک فایل ZIP حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.
ارسال پاسخ برای این سؤال