همینک در محله کوئرا هزاران نفر در صف نان ایستاده اند که نان بخرند، و به دلیل تعداد زیاد، صف به هم ریخته و ترتیبی وجود ندارد! در نتیجه امکان ارائه نان هم وجود ندارد. شاطر محله که برنامه نویسی مسلط است تصمیم گرفت سریعا برنامه ای به زبان `PHP` بنویسد تا دوباره به مشتری ها ترتیب ببخشد!
ترتیب مدنظر او به این صورت است که علی در صف جلو تر از رضا است اگر سن علی کمتر باشد، و در صورت برابر بودن سنها، اگر قدش کوتاهتر باشد. فرض کنید شما شاطر برنامه نویس هستید و این برنامه را بنویسید.
شما باید یک فایل `PHP` دارای موارد زیر نوشته و ارسال کنید:
* کلاس `MyClass`
* * متغیر های name و age و height برای ذخیره سازی نام سن و قد افراد (با حروف کوچک) (باید public باشند)
* * دارای تابع سازنده باشد و بشود به صورت زیر یک شی از آن ساخت:
```
new MyClass("name", age, height)
```
* تابع `my_sort`
* * ورودی این تابع یک آرایه از اشیا `MyClass` خواهد بود.
* * خروجی این تابع باید مرتبشدهی آرایه ورودی باشد. (نحوه مرتب شدن در ابتدای سوال توضیح داده شده است)
* * مثال ورودی به تابع `my_sort` :
```
array(
new MyClass("Ahmad", 10, 10),
new MyClass("Ahmae", 10, 12),
new MyClass("Ahmaf", 3, 100)
)
```
* * خروجی تابع در این مثال:
```
array(
MyClass("Ahmaf", 3, 100),
MyClass("Ahmad", 10, 10),
MyClass("Ahmae", 10, 12)
)
```
تضمین می شود که هیچ ۲ نفری وجود ندارند که هم سن یکسان و هم قد یکسانی داشته باشند.
**آنچه باید آپلود کنید:**
یک فایل zip که در آن فایل `submission.php` قرار دارد و در این فایل یک تابع `my_sort` و یک کلاس `MyClass` قرار دارد.
```
<Your-zip-name>.zip
└── submission.php
```
بانک شهر سوییشرت بالا (همسایه شهر باب اسفنجی اینا) تصمیم گرفته که خیلی آهسته به سمت الکترونیکی شدن پیش بره! اولین گامی که در این راستا میخواد برداره اینه که عملیاتهای ابتداییشون مثل ایجاد حساب و انجام تراکنش رو الکترونیکی انجام بدن. برای این کار از عبدالله پسر ایمان (عبدالله بن ایمان) کمک خواستند و عبدالله پسر ایمان (Abdollah Pesar Iman) سیستمی طراحی کرد که این کار رو براشون انجام بده و اسمش رو به صورت مخفف نام خودش گذاشت، API.
از خوش مزه بازی که بگذریم، این API قراره این ۳ تا متد (Method) رو داشته باشه:
1. `add_account`
این متد یک نام ورودی میگیره و یک حساب برای شخصی با اون نام ایجاد میکنه. در خروجی هم آیدی - `id` اون حساب رو بر میگردونه.
آیدی حساب ها چیزی هست که در بقیه متد ها ازش استفاده میشه و طبیعتا باید یکتا باشه. یعنی هیچ ۲ نفری آیدی یکسانی نداشته باشند. اما لزومی نداره آیدی ها ترتیب خاصی داشته باشند...
2. `add_transaction`
این متد یک آیدی حساب و یک مقدار عددی (بین -۵۰ تا +۵۰) ورودی میگیره و کاری که انجام میده اینه که اون مقدار پول به حساب اون آدم اضافه می کنه. (یا اگه مقدار منفی باشه، کم میکنه) و `id` تراکنش را برمیگرداند. تراکنشها به ترتیب ایجاد شدن، `id` های ۱ و ۲ و ۳ و ... میگیرند.
3. `get_info`
این متد یک آیدی حساب میگیره و میزان پولی که در حال حاضر در حساب اون شخص وجود داره رو چاپ می کنه.
برای توضیحات کامل تر نام ورودی های متد ها پاراگراف پایین را ملاحظه کنید.
* کد شما باید خروجی موردنظر رو در صفحه چاپ کند. بدون چیز اضافی ای! می توانید از دستور echo استفاده کنید...
* برنامه شما قرار است یک API باشد، در نتیجه به URL نیازمند هستید. در ابتدای کد خود این خط را اضافه کنید:
```
include 'env.php';
```
در فایل `env.php` کدی مشابه کد زیر است (متغییر `URL` میتواند مقادیر متفاوتی داشته باشد).
```
<?php $URL="get_info?account=10"; ?>
```
در این صورت، یک متغیر با نام `$URL` (با حروف بزرگ) در برنامه تان قابل استفاده خواهد بود. این متغیر حاوی `url` از بعد از نام دامنه خواهد بود.
مثال هایی از مقادیر `$URL` که به برنامه ورودی داده می شود:
```
add_account?name=ali
add_transaction?account=157&amount=44
get_info?account=157
```
در این مثال خط اول 157 را به عنوان خروجی چاپ کرده است. خط دوم آیدی تراکنش را (مثلا 10) چاپ کرده است. و خط سوم 44 چاپ کرده است.
در این سوال دیتابیس در اختیار ندارید و همچنین نمی توانید از متغیر های درون برنامه استفاده کنید زیرا برای هر url مانند یک کد `php` واقعی، برنامه بسته و مجددا اجرا خواهد شد. برای ذخیره اطلاعات می توانید از فایل استفاده کنید و فایل ایجاد کنید.
**آنچه باید آپلود کنید:**
یک فایل zip که در آن فایل `solution.php` قرار دارد و در این فایل خواستههای مسئله را پیاده سازی نمایید (توجه نمایید که در خط اول برنامه `include 'env.php';` را قرار داده باشید).
```
<Your-zip-name>.zip
└── solution.php
```
### توضیحات کلی:
داستان از این قرار می باشد که یک پروژه لاراول موجود است. این پروژه یک وبلاگ است، یعنی مدیران می توانند در آن پست قرار دهند و کاربران پست ها را مشاهده کنند و برای آن ها کامنت بگذارند.
حال قرار است شما یک امکان به آن اضافه کنید، این که کاربران بتوانند پست ها را لایک هم بکنند. پروژه به صورت کامل در اختیار شما قرار خواهد گرفت، تغییراتی در آن ایجاد کنید که بتوان در آن پست لایک کرد، و برای هر پست مشاهده کرد که چند لایک دارد. در هیچ مرحله ای لازم نیست با محیط گرافیکی پروژه درگیر شوید و یک خط کد HTML بزنید. همه فرايند از طریق URL و خروجی شما هم JSON خواهد بود.
در پروژه هر پست یک آدرس دارد که به صورت زیر میشود پست را با آن نمایش داد:
` /blog/post-address`
برای لایک پروژه باید URL زیر را ایجاد کنید:
` /add_like/post-address`
و برای مشاهده تعداد لایک های پروژه:
`/get_post_likes/post-address`
کاربر برای لایک کردن و مشاهده تعداد لایک ها باید لاگین کرده باشد، پس اگر کاربر مهمان قصد انجام لایک یا مشاهده تعداد لایک ها را داشته باشد باید با خطا مواجه شود.
همانطور که پیش تر گفته شد، هر درخواست باید با یک خروجی JSON همراه باشد، که شامل فیلدهای زیر است:
* result
* message
* count
* redirect
فیلد `result` یا برابر ok خواهد بود یا not_ok که اولی به معنای این است که عملیات بدون خطا انجام شد، و دومی به این معنا که خطایی وجود دارد. حالاتی که خطایی وجود ندارد و خروجی باید ok باشد در ادامه توضیحات داخل پرانتز گفته شده است.
در فیلد `message` توضیحات بیشتری برای عملیات داده شود. این رشته باید برابر یکی از رشته های زیر باشد:
* `Liked` در صورتی که پست بدون مشکل لایک شد. (حالت بدون خطا)
* `LikeExists` در صورتی که کاربر قبلا پست را لایک کرده است و لایک تکراری است.
* `NotLoggedIn` در صورتی که کاربر وارد سایت نشده است.
اگر کاربر در حال مشاهده تعداد لایک های یک پست است و مشکلی وجود ندارد، در فیلد `count` تعداد لایک ها نمایش داده خواهد شد (حالت بدون خطا) ، در غیر این صورت این فیلد می تواند وجود نداشته باشد یا مقداری دلخواه داشته باشد.
فیلد `redirect` نشان دهنده URL ای خواهد بود که کاربر به آن جا فرستاده خواهد شد و مقادیر آن به صورت زیر است.
* صفحه لاگین، اگر کاربر لاگین نکرده است و درخواستی ارسال کرده است.
* صفحه نمایش پست مربوطه در بلاگ، در صورتی که کاربر وارد شده. (مستقل از اینکه درخواست با مشکلی مواجه شده یا نه)
توجه کنید شما آدرس دامنه سایت را نمی دانید، همچنین ممکن است URI ها در سمت سرور دچار تغییراتی بشوند، پس برای مقدار دهی `redirect` باید از نام route ها استفاده کنید که می توانید آن ها را در پروژه بیابید. برای مثال نام route لاگین، `login` است.
### لینک دانلود پروژه:
http://bayanbox.ir/info/1317224463893997395/challenge
### برای اجرای پروژه:
ابتدا پروژه را Extract کنید،
بعد از Extract کردن، دستورات زیر را در دایرکتوری پروژه اجرا کنید:
* composer update
* rm database/database.sqlite (!)
* touch database/database.sqlite (!)
* php artisan migrate --seed (!)
* php artisan serve
دستوراتی که با (!) مشخص شده اند، دیتابیس را حذف می کنند و دوباره می سازند. شاید در ابتدا نیازی به انجام این کار نباشد ولی برای تست کردن مکرر برنامه تان، احتمالا بخواهید این کار را انجام دهید. (می توانید هم migration ها را rollback کنید)
علامتهای (!) در دستورات نوشته شده بخشی از دستورات نیستند و نباید آن ها را وارد کنید! صرفا برای مشخص شدن در متن صورت سوال هستند.
### برای ارسال پروژه:
* پوشه vendor را از پروژه خود حذف کنید. در غیر این صورت نمی توانید آپلود کنید.
* همه فایل های پروژه را در یک فایل zip قرار دهید (یعنی باید در فایل zip شما فایل های پروژه قرار داشته باشند نه یک پوشه که فایل ها در آن قرار دارند)
* فایل فشرده شده را آپلود کنید.
### نکات قابل توجه:
* برای انجام تغییرات و اضافه کردن امکان لایک، دیگر قسمت های پروژه نباید از کار بیافتد.
* در صورتی که محتوای فایل composer.json را تغییر دهید تست پروژه شما به درستی انجام نخواهد شد و پاسخ تان غلط تلقی خواهد شد.
* در صورتی که کاربر درخواست لایک یا درخواست مشاهده تعداد لایک ها را برای پستی ارسال کرد که وجود نداشت، باید ارور 404 داده شود. (یعنی status code صفحه response باید ۴۰۴ باشد)
* اگر یک کاربر پستی را ۲ بار لایک کند، تعداد لایک ها نباید ۲ بار زیاد شود. هر کاربر فقط یک بار می تواند لایک کند.
* طبیعتا نیازمند انجام تغییرات در دیتابیس خواهید بود، برای این کار می توانید یک migration جدید ایجاد کنید و تغییراتتان را اعمال کنید. migration های شما روی سرور هم اعمال خواهد شد.
**این سوال به صورت دستی پس از مسابقه تصحیح خواهد شد و نمره نمایش داده شده در جدول امتیازات ملاک نمیباشد.**
فایل : [دانلود فایل پروژه](http://bayanbox.ir/download/1739548845967674860/LoginPage.zip)
شرکت Quera به دنبال تولید اپلیکیشن موبایل اندروید برای سایت خود است، اولین قدم برای این منظور تولید صفحه ورود کاربران است. برای این منظور طراح گرافیکی این شرکت یک قالب اولیه برای این صفحه آماده کرده و بر روی ساختار XML پیاده سازی کرده است، وظیفه شما آن است که فرآیند submit را پیاده سازی نمایید. ابتدا باید کنترل صحت داده های ورودی بررسی شود. کنترل صحت داده ها به این صورت می باشد که:
+ هر کدام از ورودی ها باید مقدار داشته باشد در غیر این صورت پیام راهنمایی درون آن به Enter <FieldName> با رنگ #FF0000 تغیر می کند.
+ مقدار وارد شده در ورودی Email باید آدرس یک ایمیل بر اساس استاندارد RFC 5322 باشد.
+ مقدار وارد شده در Password باید حداقل ۸ کاراکتر باشد، این کارکاتر ها می توانند حروف کوچک و بزرگ، عدد و علائم @#$%& باشد که در هر پسورد حداقل یک حرف کوچک، یک حرف بزرگ، یک عدد و یکی از علائم مجاز باید حضور داشته باشد.
+ در صورت مغایرت مقدار وارد شده درون هر ورودی با شرایط فوق پیام خطای <FieldName> is not valid در بالای صفحه و در قسمت تعیین شده نمایش داده می شود. توجه کنید که در صورت اشتباه بودن هر دو ورودی هر دو پیام باید نمایش داده شوند و با کاراکتر \n از هم جدا شوند (ترتیب اهمیتی ندارد).
پس از بررسی صحت ورودی ها در صورت صحیح بودن آنها یک درخواست HTTP به یک سرور خارجی ارسال می شود. این درخواست از نوع POST می باشد که در بدنه آن یک JOSN شامل کلید های email و password به همراه مقادیر وارد شده می باشد. این درخواست به آدرس quera.ir/accounts/login ارسال می شود و پیام بازگردانی شده با فرمت HTTP درون ResultActivty نمایش داده می شود. برای ارسال این درخواست حتما از HttpURLConnection استفاده نمایید.
برای پاسخ به این سوال ابتدا فایل زیپ مربوط به این سوال را دانلود نمایید، داخل این فایل یک پروژه جاوا وجود دارد، پس از انجام تغییرات فوق پروژه جاوا را دوباره زیپ نموده و بر روی سایت بارگذاری نمایید. توجه نمایید که بجز فایل های مشخص شده به دیگر فایل های موجود در پروژه دست نزنید.**
**این سوال به صورت دستی پس از مسابقه تصحیح خواهد شد و نمره نمایش داده شده در جدول امتیازات ملاک نمیباشد.**
[دانلود فایل پروژه](http://bayanbox.ir/download/899581390630881258/SMSCatcher.zip)
در این سوال می خواهیم اپلیکیشنی برای دریافت پیام های SMS پیاده نماییم.
+ در قدم اول باید پیاده سازی های لازم را طوری انجام دهید که به هنگام رسیدن یک پیام جدید نمونه ای از کلاس SMSReceive پیام را دریافت نماید.
+ در قدم بعد شما باید نمونه ای از MainActivity را از فرا رسیدن این پیام باخبر سازید (توجه نمایید که ممکن است اپلیکیشن در حالت اجرا شده قرار نداشته باشد)، برای انجام این کار از فراخوانی به وسیله Intent استفاده نمایید و درون مقادیر ارسالی آن یک نمونه از کلاس QueraMessage را با کلید QueraMessage ارسال نمایید.
+ پس از مطلع شدن نمونه ی MainActivity از رسیدن پیام جدید نام فرستنده آن را از درون مخاطبان ذخیره شده بر روی تلفن همراه پیدا کنید (در صورت عدم وجود مخاطب مورد نظر شماره تلفن فرستنده را به جای نام فرستنده قرار دهید).
+ و در انتها با کامل نمودن کلاس MessageAdapter پیام ارسال شده رو درون لیست نمایش دهید.
برای پاسخ به این سوال ابتدا فایل زیپ مربوط به این سوال را دانلود نمایید، داخل این فایل یک پروژه جاوا وجود دارد، پس از انجام تغییرات فوق پروژه جاوا را دوباره زیپ نموده و بر روی سایت بارگذاری نمایید. توجه نمایید که بجز فایل های مشخص شده به دیگر فایل های موجود در پروژه دست نزنید.