احمد شش سالش است و در حال یادگیری زبان انگلیسی است. اولین چیزی که او باید یاد بگیرد، الفبای زبان انگلیسی است. به همین خاطر، سؤالهای زیادی از برادرش میپرسد. چون برادر او کارهای زیادی دارد که باید انجام دهد، از شما بهعنوان یک برنامهنویس درخواست کرده است که برای او برنامهای بنویسید که اشتباهات احمد را به او بگوید.
تابعی با نام missingLetter
پیادهسازی کنید که آرایهای از حروف انگلیسی را دریافت و حرف جا افتاده از این دنباله را برگرداند.
امضای این تابع بهصورت زیر است:
به مثال زیر دقت نمایید:
''
) را برگردانید.یک فایل PHP که تابع missingLetter
در آن پیادهسازی شده است آپلود کنید.
علی در حال پیادهسازی سیستم ثبتنام برای یک مرکز آموزشی است و باید سیستمی را پیادهسازی کند تا متقاضیان ثبتنام عکسی را در سیستم آپلود کنند.
از آنجایی که عکسها برای این مرکز مهم است از علی خواسته شده تا قوانین سخت گیرانهای را روی عکسها اعمال کند.
علی برای پیادهسازی این سیستم از شما درخواست کمک کرده است.
پروژهی اولیه را از این لینک دانلود کنید.
برای اجرای پروژه، باید php
و composer
را از قبل نصب کرده باشید.
composer install
را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید.بعد از اجرای پروژه شما در صفحه اصلی یک فرم را ملاحظه میکنید که وظیفه آپلود تصاویر را برعهده دارد و تمامی عکسها را به ImagesController.php
و متد save
میفرستد و شما باید محتوای این متد را طوری پیاده سازی کنید روی قوانین احراز هویت زیر روی عکس ها اعمال شود:
jpeg,jpg,png
باشند.File1.png
و File342.png
و... را بدهد و اگر نام فایل به این فرمت نبود و زبان سایت انگلیسی بود، خطای file name is incorrect
و اگر زبان سایت فارسی بود خطای نام فایل صحیح نیست
را نمایش دهد.storage/app/images
ذخیره شود.app
و resources
هستید.پس از اعمال تغییرات، کل پروژه به غیر از پوشهی vendor
را Zip کرده و آپلود کنید.
توجه کنید که نام فایل Zip اهمیتی ندارد.
پدرام مدیر وبسایت آموزشی کاپآموز است. او در این روزهای کرونایی تصمیم گرفته است که یک نظرسنجی بین کاربران سایتش برگزار کند تا بداند کدام دورهها موردعلاقهی کاربران بودهاند. پدرام استراتژی خاصی را برای این نظرسنجی در نظر گرفته است. چنین نظرسنجیهایی معمولاً به اینصورت برگزار میشوند که هر کاربر دوره یا دورههای موردعلاقهی خود را از میان تمامی دورهها انتخاب میکند. از آنجایی که اکثر کاربران کاپآموز تمامی دورهها را گذراندهاند(!)، او از کاربران میخواهد یک رتبهبندی بین دورهها انجام دهند.
روند برگزاری نظرسنجی به اینصورت است که کاربر در هر مرحله با یک پرسش دوگزینهای مواجه میشود و باید از بین دو دوره، دورهای که علاقهی بیشتری به آن دارد را انتخاب کند. در انتها، رتبهبندی دورهها نمایش داده میشود.
پروژهی اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه بهصورت زیر است:
صفحهای که کاربر با آن تعامل دارد، index.php
است. محتوای این صفحه بر حسب وضعیت فعلی باید تغییر کند.
فایل items.txt
شامل نام دورهها است. در هر خط، نام یک دوره نوشته شده است. تضمین میشود که تا زمان نمایش نتایج، محتوای این فایل تغییر نمیکند.
این صفحه باید بهصورت زیر باشد (به ID المانها و محتوای آنها توجه کنید):
اگر کاربر گزینهی اول را انتخاب کند، فیلد choice
با مقدار 1
با متد POST به index.php
ارسال میشود. در غیر اینصورت، فیلد choice
با مقدار 2
ارسال میشود.
گزینههایی که کاربر انتخاب میکند را به شکل دلخواه در session ذخیره کنید.
نتیجه بهصورت زیر خواهد بود:
این صفحه باید بهصورت زیر باشد (به ID المانها و محتوای آنها توجه کنید):
نتیجه بهصورت زیر خواهد بود:
فرایند رتبهبندی را با استفاده از الگوریتمی نظیر merge sort انجام دهید تا با استفاده از کمترین مقایسهی ممکن بتوان رتبهبندی را انجام داد.
پس از نمایش نتیجهی رتبهبندی، با ارسال مجدد درخواست به index.php
، کاربر همچنان باید با صفحهی نتایج روبهرو شود.
در پروژهی اولیه، محتویات فایل items.txt
بهصورت زیر است:
مقادیر فوق، همان مقادیری هستند که کاربر باید مقایسه را بین آنها انجام دهد.
نمونهای از فرایند مقایسه را در زیر میبینید:
PHPSESSID
در نظر گرفته میشود).فایل index.php
را آپلود کنید. اگر فایلهای دیگری نیز در کنار index.php
به پروژه اضافه کردهاید، همهی فایلها را Zip کرده و ارسال کنید.
نیما در این روزهای کرونایی حوصلهاش به شدت سر رفته. از این رو، تصمیم گرفته است تا با کمک دوست صمیمیاش، محمدرضا، یک وبسایت ساده بسازد که در آن بتوان XO بازی کرد. قرار است نیما API این بازی را طراحی کند و محمدرضا فرانت کار را پیش ببرد. اخیراً نیما درگیر امتحانات پایانترمش شده و میخواهد این وبسایت تا چند روز دیگر آماده شود. بنابراین، او از شما خواسته است تا API این بازی را پیادهسازی کنید.
پروژهی اولیه را از این لینک دانلود کنید.
برای اجرای پروژه، باید php
و composer
را از قبل نصب کرده باشید.
composer install
را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید.php artisan migrate
را برای پیکربندی کامل پایگاه داده اجرا کنید.php artisan passport:install
را برای پیکربندی Laravel Passport اجرا کنید.برای احراز هویت در این پروژه از Laravel Passport استفاده شده است. همچنین، برای پایگاه داده از SQLite استفاده شده است.
این پروژه شامل ۳ مدل به شرح زیر است:
User
:نام فیلد | تعریف |
---|---|
id |
شناسهی کاربر |
username |
نام کاربری |
email |
آدرس ایمیل |
password |
رمز عبور |
Game
:نام فیلد | تعریف |
---|---|
id |
شناسهی بازی |
host_id |
شناسهی کاربر میزبان |
opponent_id |
شناسهی حریف |
is_host_turn |
یک boolean که بیانگر این است که الآن نوبت میزبان است یا خیر (مقدار پیشفرض آن false است)؛ مقدار آن در صورتی که بازی تمام شده باشد اهمیتی ندارد. |
status |
یک enum با مقدار پیشفرض pending به این معنا که بازی در انتظار تأیید است. اگر مقدار آن rejected باشد، یعنی حریف درخواست بازی را رد کرده است. اگر ongoing باشد، یعنی بازی در حال انجام است. اگر win باشد، یعنی میزبان برنده شده است. اگر lose باشد، یعنی حریف برنده شده است. اگر tie باشد، یعنی بازی مساوی شده است. |
Move
:نام فیلد | تعریف |
---|---|
id |
شناسهی حرکت |
game_id |
شناسهی بازی |
position |
یک عدد در بازهی 1 تا 9 که بیانگر موقعیت حرکت است |
is_by_host |
یک boolean که بیانگر این است که این حرکت توسط میزبان صورت گرفته است یا خیر |
دو مورد زیر باید در مدلها پیادهسازی شوند:
games
در مدل User
را طوری پیادهسازی کنید که با اجرای متد get
روی نتیجهی آن، بتوان آرایهای از بازیهایی که کاربر در آنها نقش میزبان یا حریف دارد را در اختیار داشت.getBoardAttribute
در مدل Game
را طوری پیادهسازی کنید که صفحهی بازی را در قالب یک آرایهی ۳×۳ برگرداند. خانههای پرشده توسط شروعکنندهی بازی باید با X
و خانههای پرشده توسط میزبان بازی باید با O
نمایش داده شوند. خانههای خالی نیز باید با حرف _
نمایش داده شوند. مثلاً اگر در یک بازی ابتدا حریف خانهی 9 را پر کند، سپس میزبان خانهی 5 را پر کند و در ادامه حریف خانهی 1 را پر کند، این متد باید چنین چیزی را برگرداند:دو route زیر به کنترلر API\AuthController
متصل هستند و باید پیادهسازی شوند:
POST /register
): سه فیلد username
، email
و password
باید در بدنهی درخواست موجود باشند. همچنین، دو فیلد username
و email
باید در جدول users
یکتا باشند. در صورتی که ورودی شرایط لازم را نداشتند، خطاهای پیشفرض Validator لاراول را در قالب JSON برگردانید. در غیر اینصورت، یک آرایه شامل کلید token
با مقدار توکن تولیدشده توسط Laravel Passport را در پاسخ برگردانید.POST /login
): دو فیلد username
و password
باید در بدنهی درخواست موجود باشند. در صورتی که ورودی شرایط لازم را نداشتند، خطاهای پیشفرض Validator لاراول را در قالب JSON برگردانید. اگر نام کاربری یا رمز عبور نادرست بود، یک آرایه شامل کلید error
با مقدار invalid credentials
را در قالب JSON برگردانید. در غیر اینصورت، یک آرایه شامل کلید token
با مقدار توکن تولیدشده توسط Laravel Passport را در پاسخ برگردانید.پنج route زیر از middleware auth:api
استفاده میکنند و نیازمند هدرهای Accept: application/json
و Authorization: Bearer token
هستند. این route ها به کنترلر API\GameController
متصل هستند و باید پیادهسازی شوند:
GET /games
): بازیهایی که کاربر در آنها میزبان یا حریف دارد را در قالب JSON برگردانید.POST /games/create
): فیلد opponent
باید در بدنهی درخواست موجود باشد. در صورتی که ورودی شرایط لازم را نداشتند، خطاهای پیشفرض Validator لاراول را در قالب JSON برگردانید. در صورتی که کاربری با نام کاربری واردشده وجود نداشت، آرایهای شامل کلید error
با مقدار opponent does not exist
را با کد پاسخ 404 برگردانید. اگر نام کاربری واردشده با نام کاربری کاربر فعلی یکسان بود، آرایهای شامل کلید error
با مقدار you cannot play with yourself
را برگردانید. در غیر اینصورت، بازی را ایجاد کرده و آن را در پاسخ بهصورت JSON برگردانید.GET /games/{id}
): در صورتی که بازیای با شناسهی واردشده وجود نداشت یا کاربر در آن میزبان یا حریف نبود، آرایهای شامل کلید error
با مقدار game does not exist
را با کد پاسخ 404 برگردانید. در غیر اینصورت، آبجکت بازی را در پاسخ برگردانید.GET /games/accept/{id}
): در صورتی که بازیای با شناسهی واردشده وجود نداشت یا کاربر در آن میزبان یا حریف نبود، آرایهای شامل کلید error
با مقدار game does not exist
را با کد پاسخ 404 برگردانید. اگر بازی در حال انجام بود، آرایهای شامل کلید error
با مقدار game is already ongoing
را برگردانید. اگر درخواست بازی قبلاً رد شده بود، آرایهای شامل کلید error
با مقدار game is already rejected
را برگردانید. اگر بازی خاتمه یافته بود، آرایهای شامل کلید error
با مقدار game is already finished
را برگردانید. در غیر اینصورت، وضعیت بازی را به ongoing
تغییر داده و آرایهای شامل مقدار success
را در قالب JSON برگردانید. اگر کاربر میزبان بازی بود، آرایهای شامل کلید error
با مقدار you cannot accept your games
را برگردانید.GET /games/reject/{id}
): در صورتی که بازیای با شناسهی واردشده وجود نداشت یا کاربر در آن میزبان یا حریف نبود، آرایهای شامل کلید error
با مقدار game does not exist
را با کد پاسخ 404 برگردانید. اگر بازی در حال انجام بود، آرایهای شامل کلید error
با مقدار game is already ongoing
را برگردانید. اگر درخواست بازی قبلاً رد شده بود، آرایهای شامل کلید error
با مقدار game is already rejected
را برگردانید. اگر بازی خاتمه یافته بود، آرایهای شامل کلید error
با مقدار game is already finished
را برگردانید. در غیر اینصورت، وضعیت بازی را به rejected
تغییر داده و آرایهای شامل مقدار success
را در قالب JSON برگردانید. اگر کاربر میزبان بازی بود، آرایهای شامل کلید error
با مقدار you cannot reject your games
را برگردانید.POST /games/move/{id}
): فیلد position
باید با مقداری عددی و در بازهی 1 تا 9 در بدنهی درخواست موجود باشد. در صورتی که ورودی شرایط لازم را نداشتند، خطاهای پیشفرض Validator لاراول را در قالب JSON برگردانید. در صورتی که بازیای با شناسهی واردشده وجود نداشت یا کاربر در آن میزبان یا حریف نبود، آرایهای شامل کلید error
با مقدار game does not exist
را با کد پاسخ 404 برگردانید. اگر درخواست بازی در انتظار تأیید حریف بود، آرایهای شامل کلید error
با مقدار game is already pending
را برگردانید. اگر درخواست بازی قبلاً رد شده بود، آرایهای شامل کلید error
با مقدار game is already rejected
را برگردانید. اگر بازی خاتمه یافته بود، آرایهای شامل کلید error
با مقدار game is already finished
را برگردانید. اگر نوبت کاربر نبود، آرایهای شامل کلید error
با مقدار it is not your turn
را برگردانید (توجه کنید که همیشه حریف شروعکنندهی بازی است). اگر موقعیت حرکت در حال حاضر ثبت شده بود، آرایهای شامل کلید error
با مقدار cell is already full
را برگردانید. در غیر اینصورت، حرکت را ثبت کرده و آرایهای شامل مقدار success
را در قالب JSON برگردانید. توجه کنید که پس از ثبت حرکت، باید بررسی کنید که آیا برندهی بازی (یا مساوی شدن بازی) میتواند تعیین شود یا خیر. در صورتی که این مورد قابل تشخیص بود، وضعیت بازی باید تغییر کند.توجه: شما تنها مجاز به تغییر فایلهای موجود در پوشهی /app
هستید.
پس از اعمال تغییرات، کل پروژه به غیر از پوشهی vendor
را Zip کرده و آپلود کنید. نام فایل Zip اهمیتی ندارد.
کد شما باید روی نسخهی استاندارد MySQL قابل اجرا باشد. برای چک کردن سینتکس کد SQL خود میتوانید از این وبسایت کمک بگیرید.
حمید یک برنامهنویس حرفهای است. او اخیراً به آشپزی علاقهمند شده و تصمیم گرفته تا یک وبسایت برای بهاشتراکگذاری دستور پختهای انحصاریاش راهاندازی کند. او میخواهد قابلیتهای پیشرفتهای را در وبسایتش ارائه دهد. برای مثال، این قابلیت که کاربران بتوانند مواد اولیهی موجودشان را در سایت ثبت کرده و سیستم بتواند لیست غذاهایی که با استفاده از مواد اولیهشان قابل پخت هستند را نمایش دهد. همچنین، کاربران امکان امتیازدهی (از ۱ تا ۵) به دستور پختها را دارند.
حمید بهخوبی از پس طراحی جداول دیتابیس سایتش برآمده، اما برای نوشتن کوئریهایش به کمک شما نیاز دارد.
پایگاه دادهی اولیهی سایت حمید شامل ۶ جدول با اسامی و ساختارهای زیر است:
users
):نام ستون | نوع | تعریف | ملاحضات |
---|---|---|---|
id |
int(11) |
شناسهی کاربر | primary key auto_increment |
username |
varchar(255) |
نام کاربری کاربر |
foods
):نام ستون | نوع | تعریف | ملاحضات |
---|---|---|---|
id |
int(11) |
شناسهی غذا | primary key auto_increment |
name |
varchar(255) |
نام غذا | |
recipe |
text |
متن دستور پخت غذا |
ingredients
):نام ستون | نوع | تعریف | ملاحضات |
---|---|---|---|
id |
int(11) |
شناسهی مادهی اولیه | primary key auto_increment |
name |
varchar(255) |
نام مادهی اولیه | |
price_per_unit |
decimal(10,2) |
قیمت واحد مادهی اولیه |
food_ingredients
):نام ستون | نوع | تعریف | ملاحضات |
---|---|---|---|
id |
int(11) |
شناسهی مادهی اولیهی غذا | primary key auto_increment |
food_id |
int(11) |
شناسهی غذا | foreign key (foods) |
ingredient_id |
int(11) |
شناسهی مادهی اولیه | foreign key (ingredients) |
amount |
decimal(10,2) |
مقدار مادهی اولیه |
user_ingredients
):نام ستون | نوع | تعریف | ملاحضات |
---|---|---|---|
id |
int(11) |
شناسهی مادهی اولیهی کاربر | primary key auto_increment |
user_id |
int(11) |
شناسهی کاربر | foreign key (users) |
ingredient_id |
int(11) |
شناسهی مادهی اولیه | foreign key (ingredients) |
amount |
decimal(10,2) |
مقدار مادهی اولیه |
ratings
):نام ستون | نوع | تعریف | ملاحضات |
---|---|---|---|
id |
int(11) |
شناسهی امتیاز | primary key auto_increment |
user_id |
int(11) |
شناسهی کاربر | foreign key (users) |
food_id |
int(11) |
شناسهی غذا | foreign key (foods) |
rate |
tinyint(1) |
امتیاز |
کوئریهای SQL خواستهشده از شما موارد زیر است (توجه کنید که هر کوئری نمرهای جداگانه دارد و اگر کوئری یک قسمت را نتوانستید بزنید، کوئریهایی که حل کردید را بفرستید و قسمت آن کوئری را خالی بگذارید):
@hamid_ashpazbashi2
به اشتراک میگذاشته. حال، نام کاربری کانالش را به @hamid_ashpazbashi
تغییر داده است. او اکنون میخواهد همهی @hamid_ashpazbashi2
های موجود در متن دستور پختها (ستون recipe
جدول foods
) را به @hamid_ashpazbashi
تغییر دهد. این کوئری را برای او بنویسید.rating
و تعداد آرا را در قالب ستونی با نام rate_count
برگردانید. اگر امتیازی به یکی از غذاهای موجود در نتیجه داده نشده بود، مقدار ستونهای rating
و rate_count
باید صفر باشد.total_price
برگردانید. مقدار این ستون باید برابر با جمع حاصلضرب قیمت واحد مواد اولیهی هر غذا در تعدادشان باشد. اگر مادهی اولیهای برای غذا ثبت نشده بود، مقدار این ستون باید صفر باشد.quera
با استفاده از مواد اولیهش میتواند بپزد را در قالب ستونی با نام id
برگردانید. نتایج باید بهترتیب نزولی شناسهی غذاها باشند. اگر مادهی اولیهای برای یک غذا ثبت نشده باشد، این غذا نباید در نتیجه وجود داشته باشد.کد خود را در قالب زیر، در یک فایل با پسوند sql
قرار داده و آن را ارسال کنید.