سلام!
به مسابقه لینوکس *کدکاپ ۶* خوش آمدید.
با فرارسیدن مسابقات *کدکاپ* ، *سلیب* به همراه جمعی از دوستانش که منتظر برگزاری کدکاپ امسال بودند، به سرعت دست به کار شدند و تمرینات خود را شروع کردند تا بتوانند شانس خود را برای برنده شدن جوایز نفیس مسابقه افزایش دهند!
*سلیب* و *علیرضا* و *عرشیا* باهم تمرینات لینوکسی خود را شروع میکنند. *سلیب* اولین چالش را مطرح میکند. او میخواهد ابتدای دستگرمی را با چالشی ساده شروع کند. *سلیب* اسکریپتی میخواهد تا عبارتی را به عنوان ورودی دریافت کند و در خروجی به معکوس عبارت ورودی سلام کند!
**به عبارتی شما باید اسکریپتی بنویسید که رشتهی `str` را از ورودی دریافت کند و عبارت `Hello revStr!` که در آن، `revStr` برابر با معکوس رشتهی `str` است را چاپ کند.**
توجه کنید که:
+ ورودی از طریق آرگومان به اسکریپت شما داده میشود.
+ به کوچکی و بزرگی حروف و فاصلهی بین کلمات دقت کنید!
+ **در این سوال، مجاز به استفاده از حلقهی `for` و `while` نمیباشید.**
برای فهم بیشتر، به مثال زیر دقت کنید.
## مثال
برای مثال اگر اسکریپت شما را مانند زیر اجرا کنیم:
```bash
./hello.sh 6puCedoC
```
باید خروجی زیر را دهد:
```
Hello CodeCup6!
```
+ معکوس عبارت `6puCedoC`، برابر `CodeCup6` است؛ پس عبارت `Hello CodeCup6!` چاپ میشود.
## پروژه اولیه
برای دریافت پروژه اولیه [این لینک](/contest/assignments/35051/download_problem_initial_project/126021/) را دانلود کنید. درون لینک ساختار فایلی زیر را مشاهده میکنید:
```
Hello_CodeCup
├── hello.sh
└── test
└── test_sample.py
```
راهحل خود را درون فایل `hello.sh` پیادهسازی کنید. برای اطمینان نسبی از پاسختان میتوانید از تستهای نمونه مسئله استفاده کنید. اگر میخواهید درون سیستم خودتان از این تستها استفاده کنید، با ترمینال به دایرکتوری `Hello_CodeCup` بروید و سپس دستورات زیر را اجرا کنید:
```bash
chmod +x hello.sh
python3 -m unittest
```
و یا از طریق دکمه «اجرای تست نمونه» پاسختان را برای کوئرا ارسال کنید.
## توجه کنید
+ فراموش نکنید که اسکریپتی کامل را در پاسختان تحویل دهید.
+ فراموش نکنید که اسکریپت خود را درون فایلی با نام `hello.sh` وارد نمایید.
+ برای ارسال پاسخ خود کافیست فایل `hello.sh` را آپلود کنید.
به عنوان تمرین دوم، *سلیب* و *علیرضا* و *عرشیا* میخواهند یک مشکل از مشکلاتی که در ایران بسیار با آن مواجه میشوند را برای همیشه حل کنند.
آنها همواره در تلاش برای برقراری ارتباط با وبسایتی هستند که به خاطر حجم زیاد درخواستها توان پاسخگویی ندارد.
برای رفع این مشکل به صورت ابدی، سلیب یک سرور درون آدرسی بالا میآورد که یک ویژگی منحصر به فرد دارد. اگر به این سرور هرگونه ریکوئستی از نوع `GET` بزنیم به طور کاملا تصادفی یکی از استاتوسکدهای زیر را برمیگرداند:
* ممکن است استاتوسکد `200` (*HTTP_200_OK*) را برگرداند که در این صورت اتصال ما با موفقیت انجام شده و هیچ مشکلی وجود ندارد.
* ممکن است یکی از استاتوسکدهای `400` (*HTTP_400_BAD_REQUEST*) یا `403` (*HTTP_403_FORBIDDEN*) یا `404` (*HTTP_404_NOT_FOUND*) یا `500` (*HTTP_500_INTERNAL_SERVER_ERROR*) را برگرداند که در هر صورت اتصال ما با چالشهایی مواجه شده و **نیاز داریم تا دوباره به آدرس مورد نظرمان ریکوئست بزنیم و منتظر برقراری ارتباطی صحیح با استاتوسکد** `200` **بمانیم.**
در این تمرین، *علیرضا* و *عرشیا* از شما میخواهند تا به کمک آنها بشتابید و **اسکریپتی بنویسید تا با گرفتن آدرس سرور مورد نظر در ورودی، تا زمانی که به اولین استاتوسکد** `200` **برسد، به ریکوئست زدن ادامه دهد**. **توجه کنید** پاسخ ارسالی شما باید به محض دریافت استاتوسکد `200` و چاپ خروجی خواسته شده به کار خود پایان دهد و **هیچ ریکوئست دیگری به سرور ارسال نکند.**
با ارسال هر ریکوئست از نوع `GET` به سرور مورد نظر ما، پاسخی مطابق زیر دریافت میشود:
```
[<mark class="yellow" title="در این قسمت استاتوس کد سرور قرار داده شود."><STATUS_CODE></mark>]
```
برای مثال اگر درخواست ما با استاتوسکد `404` مواجه شود، سرور پاسخ زیر را برای ما ارسال میکند:
```
[404]
```
اسکریپت ارسالی شما باید پاسخ هر ریکوئست را در قالب زیر در ترمینال چاپ کند:
```
ret is: [<mark class="yellow" title="در این قسمت باید استاتوس کد دریافتی از سرور قرار داده شود."><STATUS_CODE></mark>]
```
برای مثال اگر سرور به ما پاسخی با استاتوسکد `404` داد، باید خروجی زیر نمایش داده شود:
```
ret is: [404]
```
## مثال
برای مثال اگر اسکریپت شما را مانند زیر اجرا کنیم:
```bash
./retry.sh <mark class="red" title="در این قسمت آدرس سرور مورد نظر ما قرار میگیرد."><SERVER_ADDRESS></mark>
```
باید خروجی زیر را دهد:
```
ret is: [403]
ret is: [500]
ret is: [403]
ret is: [400]
ret is: [404]
ret is: [404]
ret is: [200]
```
+ **به محض دریافت ریکوئستی با استاتوسکد `200`، دیگر ریکوئستی ارسال نمیشود و برنامه به کار خود خاتمه میدهد.**
## پروژه اولیه
برای دریافت پروژه اولیه [این لینک](/contest/assignments/35051/download_problem_initial_project/126022/) را دانلود کنید. درون لینک ساختار فایلی زیر را مشاهده میکنید:
```
Dobare_Talash_Kon
└── retry.sh
```
راهحل خود را درون فایل `retry.sh` پیادهسازی کنید. برای اطمینان نسبی از پاسختان میتوانید از تستهای نمونه مسئله استفاده کنید. برای این کار کافیست از طریق دکمه «اجرای تست نمونه» پاسختان را برای کوئرا ارسال کنید.
## توجه کنید
+ فراموش نکنید که اسکریپتی کامل را در پاسختان تحویل دهید.
+ فراموش نکنید که اسکریپت خود را درون فایلی با نام `retry.sh` وارد نمایید.
+ برای ارسال پاسخ خود کافیست فایل `retry.sh` را آپلود کنید.
+ در نظر داشته باشید که تا وقتی در جواب استاتوس کد `200` دریافت نکردهاید باید به ریکوئست زدن ادامه دهید.
+ همچنین پاسخ ارسالی شما باید **به محض** دریافت استاتوسکد `200` و چاپ خروجی خواسته شده به کار خود پایان دهد و **هیچ ریکوئست دیگری به سرور ارسال نکند.**
*سلیب* و *علیرضا* و *عرشیا* اینبار برای تمرین خود به سراغ کاری جدید رفتند. آنها اینبار میخواهد جزئیات ساختن یوزر و گروه و دسترسی را درون لینوکس تمرین کنند. *علیرضا* سناریویی را مطرح میکند:
او از تیم میخواهد که درون سیستم، دو کاربر با نامهای `user1` و `user2` بسازند. همچنین گروه مشترکی با نام `shared` بسازند و هر دو کاربر بالا را به آن اضافه کنند. هر یک از این کاربران **باید** مشخصات زیر را داشته باشند:
+ پوشهی خانهی (یا همان *home directory*) مخصوص به خود را داشته باشند.
+ نیازی به نوشتن کامنت برای کاربران وجود ندارد.
+ هیچکدام از یوزرها نیازی به پسورد ندارند و **نباید پسورد داشته باشند.**
+ هر دو یوزر باید عضو گروه `shared` *هم* باشند. یعنی گروه `shared` باید به گروههای یوزر **اضافه شود**.
<details class="blue">
<summary>
**نکته**
</summary>
پوشه خانه هر یوزر باید هم وجود داشته باشد و هم به او اختصاص داده شده باشد. همچنین شما مجاز به استفاده از دستورات ساخت دایرکتوری مانند `mkdir` و غیره نیستید و باید از آپشن مخصوص به ساخت دایرکتوری خانه برای یوزر استفاده کنید.
از آنجایی که گروه `shared` باید به لیست گروههای هر دو یوزر اضافه شود، شما نمیتوانید از آپشن `-g` استفاده کنید!
</details>
سپس تیم باید دایرکتوریای با اسم `shared_files` در روت (`/`) بسازند. پس از ایجاد دایرکتوری، یک فایل با اسم `shared_file` در این دایرکتوری بسازند. در نهایت نیز گروهی که صاحب این فایل و این دایرکتوری است را گروه `shared` قرار دهند و کاربر صاحب فایل و دایرکتوری را `user1` قرار دهند. همچنین **تنها** دسترسی **خواندن و نوشتن** را برای گروه و کاربر صاحب این فایل بدهند و به سایر کاربران **هیچ** دسترسیای ندهند. بعد از اتمام کار نیز کاربران و گروه و همه فایلهای آنان را پاک کنند!
از آنجایی که *سلیب* درون تیم نمیتواند در این تمرین به تنهایی شرکت کند از شما خواسته تا به او کمک کنید تا پیش از تمامی افراد تیم، این تمرین را تمام کند.
## پروژه اولیه
برای دریافت پروژه اولیه [این لینک](/contest/assignments/35051/download_problem_initial_project/126023/) را دانلود کنید. درون لینک ساختار فایلی زیر را مشاهده میکنید:
```
Where_is_Who
└── solution.sh
```
راهحل خود را درون فایل `solution.sh` پیادهسازی کنید. برای اطمینان نسبی از پاسختان میتوانید از تستهای نمونه مسئله استفاده کنید. برای این کار کافیست از طریق دکمه «اجرای تست نمونه» پاسختان را برای کوئرا ارسال کنید.
## توجه کنید
+ فراموش نکنید که اسکریپتی کامل را در پاسختان تحویل دهید.
+ فراموش نکنید که اسکریپت خود را درون فایلی با نام `solution.sh` وارد نمایید.
+ برای ارسال پاسخ خود کافیست فایل `solution.sh` را آپلود کنید.
*سلیب* در میان تمرینات تیمی خود برای آمادگی، از شلوغی برنامه روزانه خود و تعداد زیاد جلساتش خسته شده بود و داشت حسابی اذیت میشد. او اخیرا بسیاری از جلسات خود را فراموش میکرد. برای همین از تیم جدا شد و تصمیم گرفت به عنوان تمرین چهارم، با کمک شما ابزاری جهت تنظیم آسانتر جلسات خود بنویسد. او میخواهد ابزاری داشته باشد که با تعامل با آن بتواند اطلاعاتی از روز خود دریافت کند و یا جلسهای به روز خود اضافه کند. ابزار او باید پشتیبانی از ۵ حالت زیر را داشته باشد:
## اضافه کردن جلسه
برای این کار از دستور زیر استفاده میکنیم:
```
add <mark class="red" title="ساعت شروع جلسه"><START></mark> <mark class="red" title="ساعت پایان جلسه"><END></mark>
```
پس از افزوده شدن جلسه مورد نظر، برنامه شما باید مقدار زیر را خروجی دهد:
```
A meeting from <mark class="red" title="ساعت شروع جلسه"><START></mark> to <mark class="red" title="ساعت پایان جلسه"><END></mark> added to your day!
```
برای مثال دستور زیر به معنای افزودن یک جلسه از ساعت ۱۰ صبح تا ساعت ۳ یا همان ۱۵ بعدازظهر است. **توجه داشته باشید که ساعت راس ساعت ۱۵ جلسه تمام میشود و سلیب میتواند بدون تداخل، جلسهای دیگر را از ساعت ۱۵ شروع کند.**
```
add 10 15
```
پس از افزوده شدن جلسه بالا، برنامه شما باید مقدار زیر را خروجی دهد:
```
A meeting from 10 to 15 added to your day!
```
+ **تضمین میشود که ساعت شروع و پایان جلسات، اعدادی بین ۰ تا ۲۴ هستند. همچنین تضمین میشود که ساعت پایان یک جلسه، حداقل یک ساعت پس از شروع جلسه میباشد. تضمین آخر نیز این است که هیچگاه تداخلی بین جلسات پیش نمیآید و در هر زمان فقط یک جلسه خواهیم داشت.**
## چک کردن ساعات روز
فرض کنید میخواهیم بدانیم که آیا مثلا *سلیب* میتواند از ساعت ۵ تا ۱۰ جلسهای داشته باشد یا خیر. برای این کار از دستور زیر استفاده میکنیم:
```
check <mark class="red" title="ساعت شروع"><START></mark> <mark class="red" title="ساعت پایان"><END></mark>
```
در این حالت، برنامه شما با دو حالت مواجه میشود:
1. بازه زمانی مورد نظر به طور کامل خالی باشد که در این صورت برنامه شما باید در قالب زیر به *سلیب* بگوید که میتواند درون بازه مورد نظر جلسهای داشته باشد:
```
You can add a meeting from <mark class="red" title="ساعت شروع"><START></mark> to <mark class="red" title="ساعت پایان"><END></mark>!
```
2. تمام بازه و یا بخشی از بازه زمانی مورد نظر پر باشد که در این صورت برنامه شما باید در قالب زیر به *سلیب* بگوید که **نمیتواند** درون بازه مورد نظر جلسهای داشته باشد:
```
You can't have a meeting from <mark class="red" title="ساعت شروع"><START></mark> to <mark class="red" title="ساعت پایان"><END></mark>!
```
برای مثال فرض کنید به ترتیب، دستورات زیر را به برنامه شما ورودی بدهیم:
```
check 10 15
add 10 15
check 9 12
check 15 17
```
پس از افزوده شدن جلسه بالا، برنامه شما باید مقدار زیر را خروجی دهد:
```
You can add a meeting from 10 to 15!
A meeting from 10 to 15 added to your day!
You can't have a meeting from 9 to 12!
You can add a meeting from 15 to 17!
```
## آزاد کردن ساعات روز
فرض کنید جلسهای کنسل شده و یا کار فوری پیش آمده و ما میخواهیم از ساعت ۵ تا ۱۰ روز *سلیب* را آزاد کنیم. برای این کار از دستور زیر استفاده میکنیم:
```
free <mark class="red" title="ساعت شروع"><START></mark> <mark class="red" title="ساعت پایان"><END></mark>
```
پس از افزوده شدن جلسه مورد نظر، برنامه شما باید مقدار زیر را خروجی دهد:
```
You're now free from <mark class="red" title="ساعت شروع جلسه"><START></mark> to <mark class="red" title="ساعت پایان جلسه"><END></mark>!
```
برای مثال فرض کنید به ترتیب، دستورات زیر را به برنامه شما ورودی بدهیم:
```
check 10 15
add 10 15
check 9 12
free 9 12
check 9 12
check 12 14
```
پس از افزوده شدن جلسه بالا، برنامه شما باید مقدار زیر را خروجی دهد:
```
You can add a meeting from 10 to 15!
A meeting from 10 to 15 added to your day!
You can't have a meeting from 9 to 12!
You're now free from 9 to 12!
You can add a meeting from 9 to 12!
You can't have a meeting from 12 to 14!
```
+ **دقت کنید که پس از آزاد کردن زمان از ساعت ۹ تا ساعت ۱۲، جلسهی اول که از ساعت ۱۰ تا ساعت ۱۵ ایجاد شده بود بهطور کلی کنسل نمیشود و فقط زمان ۱۰ تا ۱۲ آن کنسل میشود؛ اما از ۱۲ تا ۱۵، جلسه برقرار است.**
## دستور اشتباه
اگر دستوری به جز سه دستور بیانشده به برنامه شما ورودی داده شود، باید خروجی زیر را نمایش دهید:
```
Command not found.
```
برای مثال فرض کنید به ترتیب، دستورات زیر را به برنامه شما ورودی بدهیم:
```
add 1 6
hello
check 3 5
sokdfsjdsfshfc
check 6 7
```
پس از افزوده شدن جلسه بالا، برنامه شما باید مقدار زیر را خروجی دهد:
```
You can add a meeting from 1 to 6!
Command not found.
You can't have a meeting from 3 to 5!
Command not found.
You can add a meeting from 6 to 7!
```
## خروج از برنامه
برای خروج از برنامه از دستور زیر استفاده میکنیم:
```
exit
```
در این صورت باید پیش از بسته شدن برنامه، خروجی زیر را چاپ کنید:
```
Bye Bye!
```
و سپس برنامه را ببندید.
## مثال
برای مثال اگر اسکریپت شما را مانند زیر اجرا کنیم:
```
./checker.sh
add 1 6
check 3 5
free 5 7
check 5 7
add 5 7
check 20 24
SAliB
exit
```
باید خروجی زیر را دهد:
```
A meeting from 1 to 6 added to your day!
You can't have a meeting from 3 to 5!
You're now free from 5 to 7!
You can add a meeting from 5 to 7!
A meeting from 5 to 7 added to your day!
You can add a meeting from 20 to 24!
Command not found.
Bye Bye!
```
## پروژه اولیه
برای دریافت پروژه اولیه [این لینک](/contest/assignments/35051/download_problem_initial_project/126024/) را دانلود کنید. درون لینک ساختار فایلی زیر را مشاهده میکنید:
```
Busy_SAliB
├── checker.sh
└── test
└── test_sample.py
```
راهحل خود را درون فایل `checker.sh` پیادهسازی کنید. برای اطمینان نسبی از پاسختان میتوانید از تستهای نمونه مسئله استفاده کنید. اگر میخواهید درون سیستم خودتان از این تستها استفاده کنید، با ترمینال به دایرکتوری `Busy_SAliB` بروید و سپس دستورات زیر را اجرا کنید:
```bash
chmod +x checker.sh
python3 -m unittest
```
و یا از طریق دکمه «اجرای تست نمونه» پاسختان را برای کوئرا ارسال کنید.
## توجه کنید
+ فراموش نکنید که اسکریپتی کامل را در پاسختان تحویل دهید.
+ فراموش نکنید که اسکریپت خود را درون فایلی با نام `checker.sh` وارد نمایید.
+ برای ارسال پاسخ خود کافیست فایل `checker.sh` را آپلود کنید.
+ راس ساعت پایان، جلسه تمام میشود و *سلیب* میتواند بدون تداخل، جلسهای دیگر را از ساعت آن ساعت شروع کند.
+ تضمین میشود که ساعت شروع و پایان جلسات، اعدادی بین ۰ تا ۲۴ هستند. همچنین تضمین میشود که ساعت پایان یک جلسه، حداقل یک ساعت پس از شروع جلسه میباشد. تضمین آخر نیز این است که هیچگاه تداخلی بین جلسات پیش نمیآید و در هر زمان فقط یک جلسه خواهیم داشت.