سلام بر کدکاپ!


سلام!

به مسابقه لینوکس کدکاپ ۶ خوش آمدید.

با فرارسیدن مسابقات کدکاپ ، سلیب به همراه جمعی از دوستانش که منتظر برگزاری کدکاپ امسال بودند، به سرعت دست به کار شدند و تمرینات خود را شروع کردند تا بتوانند شانس خود را برای برنده شدن جوایز نفیس مسابقه افزایش دهند!

سلیب و علی‌رضا و عرشیا باهم تمرینات لینوکسی خود را شروع می‌کنند. سلیب اولین چالش را مطرح می‌کند. او می‌خواهد ابتدای دست‌گرمی را با چالشی ساده شروع کند. سلیب اسکریپتی می‌خواهد تا عبارتی را به عنوان ورودی دریافت کند و در خروجی به معکوس عبارت ورودی سلام کند!

به عبارتی شما باید اسکریپتی بنویسید که رشته‌ی str را از ورودی دریافت کند و عبارت Hello revStr! که در آن، revStr برابر با معکوس رشته‌ی str است را چاپ کند.

توجه کنید که:

  • ورودی از طریق آرگومان به اسکریپت شما داده می‌شود.
  • به کوچکی و بزرگی حروف و فاصله‌ی بین کلمات دقت کنید!
  • در این سوال، مجاز به استفاده از حلقه‌ی for و while نمی‌باشید.

برای فهم بیشتر، به مثال زیر دقت کنید.

مثال🔗

برای مثال اگر اسکریپت شما را مانند زیر اجرا کنیم:

./hello.sh 6puCedoC
Bash

باید خروجی زیر را دهد:

Hello CodeCup6!
Plain text
  • معکوس عبارت 6puCedoC، برابر CodeCup6 است؛ پس عبارت Hello CodeCup6! چاپ می‌شود.

پروژه اولیه🔗

برای دریافت پروژه اولیه این لینک را دانلود کنید. درون لینک ساختار فایلی زیر را مشاهده می‌کنید:

Hello_CodeCup
├── hello.sh
└── test
    └── test_sample.py
Plain text

راه‌حل خود را درون فایل hello.sh پیاده‌سازی کنید. برای اطمینان نسبی از پاسخ‌تان می‌توانید از تست‌های نمونه مسئله استفاده کنید. اگر می‌خواهید درون سیستم خودتان از این تست‌ها استفاده کنید، با ترمینال به دایرکتوری Hello_CodeCup بروید و سپس دستورات زیر را اجرا کنید:

chmod +x hello.sh
python3 -m unittest
Bash

و یا از طریق دکمه «اجرای تست نمونه» پاسخ‌تان را برای کوئرا ارسال کنید.

توجه کنید🔗

  • فراموش نکنید که اسکریپتی کامل را در پاسخ‌تان تحویل دهید.
  • فراموش نکنید که اسکریپت خود را درون فایلی با نام 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 به سرور مورد نظر ما، پاسخی مطابق زیر دریافت می‌شود:

[<STATUS_CODE>]
Plain text

برای مثال اگر درخواست ما با استاتوس‌کد 404 مواجه شود، سرور پاسخ زیر را برای ما ارسال می‌کند:

[404]
Plain text

اسکریپت ارسالی شما باید پاسخ هر ریکوئست را در قالب زیر در ترمینال چاپ کند:

ret is: [<STATUS_CODE>]
Plain text

برای مثال اگر سرور به ما پاسخی با استاتوس‌کد 404 داد، باید خروجی زیر نمایش داده شود:

ret is: [404]
Plain text

مثال🔗

برای مثال اگر اسکریپت شما را مانند زیر اجرا کنیم:

./retry.sh <SERVER_ADDRESS>
Bash

باید خروجی زیر را دهد:

ret is: [403]
ret is: [500]
ret is: [403]
ret is: [400]
ret is: [404]
ret is: [404]
ret is: [200]
Plain text
  • به محض دریافت ریکوئستی با استاتوس‌کد 200، دیگر ریکوئستی ارسال نمی‌شود و برنامه به کار خود خاتمه می‌دهد.

پروژه اولیه🔗

برای دریافت پروژه اولیه این لینک را دانلود کنید. درون لینک ساختار فایلی زیر را مشاهده می‌کنید:

Dobare_Talash_Kon
└── retry.sh
Plain text

راه‌حل خود را درون فایل retry.sh پیاده‌سازی کنید. برای اطمینان نسبی از پاسخ‌تان می‌توانید از تست‌های نمونه مسئله استفاده کنید. برای این کار کافی‌ست از طریق دکمه «اجرای تست نمونه» پاسخ‌تان را برای کوئرا ارسال کنید.

توجه کنید🔗

  • فراموش نکنید که اسکریپتی کامل را در پاسخ‌تان تحویل دهید.
  • فراموش نکنید که اسکریپت خود را درون فایلی با نام retry.sh وارد نمایید.
  • برای ارسال پاسخ خود کافی‌ست فایل retry.sh را آپلود کنید.
  • در نظر داشته باشید که تا وقتی در جواب استاتوس کد 200 دریافت نکرده‌اید باید به ریکوئست زدن ادامه دهید.
  • همچنین پاسخ ارسالی شما باید به محض دریافت استاتوس‌کد 200 و چاپ خروجی خواسته شده به کار خود پایان دهد و هیچ ریکوئست دیگری به سرور ارسال نکند.

کی کجاست؟


سلیب و علی‌رضا و عرشیا این‌بار برای تمرین خود به سراغ کاری جدید رفتند. آن‌ها این‌بار می‌خواهد جزئیات ساختن یوزر و گروه و دسترسی را درون لینوکس تمرین کنند. علی‌رضا سناریویی را مطرح می‌کند:

او از تیم می‌خواهد که درون سیستم، دو کاربر با نام‌های user1 و user2 بسازند. همچنین گروه مشترکی با نام shared بسازند و هر دو کاربر بالا را به آن اضافه کنند. هر یک از این کاربران باید مشخصات زیر را داشته باشند:

  • پوشه‌ی خانه‌ی (یا همان home directory) مخصوص به خود را داشته باشند.
  • نیازی به نوشتن کامنت برای کاربران وجود ندارد.
  • هیچکدام از یوزرها نیازی به پسورد ندارند و نباید پسورد داشته باشند.
  • هر دو یوزر باید عضو گروه shared هم باشند. یعنی گروه shared باید به گروه‌های یوزر اضافه شود.
نکته

پوشه خانه هر یوزر باید هم وجود داشته باشد و هم به او اختصاص داده شده باشد. همچنین شما مجاز به استفاده از دستورات ساخت دایرکتوری مانند mkdir و غیره نیستید و باید از آپشن مخصوص به ساخت دایرکتوری خانه برای یوزر استفاده کنید.

از آنجایی که گروه shared باید به لیست گروه‌های هر دو یوزر اضافه شود، شما نمی‌توانید از آپشن -g استفاده کنید!

سپس تیم باید دایرکتوری‌ای با اسم shared_files در روت (/) بسازند. پس از ایجاد دایرکتوری، یک فایل با اسم shared_file در این دایرکتوری بسازند. در نهایت نیز گروهی که صاحب این فایل و این دایرکتوری است را گروه shared قرار دهند و کاربر صاحب فایل و دایرکتوری را user1 قرار دهند. همچنین تنها دسترسی خواندن و نوشتن را برای گروه و کاربر صاحب این فایل بدهند و به سایر کاربران هیچ دسترسی‌ای ندهند. بعد از اتمام کار نیز کاربران و گروه‌ و همه فایل‌های آنا‌ن را پاک کنند!

از آن‌جایی که سلیب درون تیم نمی‌تواند در این تمرین به تنهایی شرکت کند از شما خواسته تا به او کمک کنید تا پیش از تمامی افراد تیم، این تمرین را تمام کند.

پروژه اولیه🔗

برای دریافت پروژه اولیه این لینک را دانلود کنید. درون لینک ساختار فایلی زیر را مشاهده می‌کنید:

Where_is_Who
└── solution.sh
Plain text

راه‌حل خود را درون فایل solution.sh پیاده‌سازی کنید. برای اطمینان نسبی از پاسخ‌تان می‌توانید از تست‌های نمونه مسئله استفاده کنید. برای این کار کافی‌ست از طریق دکمه «اجرای تست نمونه» پاسخ‌تان را برای کوئرا ارسال کنید.

توجه کنید🔗

  • فراموش نکنید که اسکریپتی کامل را در پاسخ‌تان تحویل دهید.
  • فراموش نکنید که اسکریپت خود را درون فایلی با نام solution.sh وارد نمایید.
  • برای ارسال پاسخ خود کافی‌ست فایل solution.sh را آپلود کنید.

سلیب پر مشغله!


سلیب در میان تمرینات تیمی خود برای آمادگی، از شلوغی برنامه روزانه خود و تعداد زیاد جلساتش خسته شده بود و داشت حسابی اذیت می‌شد. او اخیرا بسیاری از جلسات خود را فراموش می‌کرد. برای همین از تیم جدا شد و تصمیم گرفت به عنوان تمرین چهارم، با کمک شما ابزاری جهت تنظیم آسان‌تر جلسات خود بنویسد. او می‌خواهد ابزاری داشته باشد که با تعامل با آن بتواند اطلاعاتی از روز خود دریافت کند و یا جلسه‌ای به روز خود اضافه کند. ابزار او باید پشتیبانی از ۵ حالت زیر را داشته باشد:

اضافه کردن جلسه🔗

برای این کار از دستور زیر استفاده می‌کنیم:

add <START> <END>
Plain text

پس از افزوده شدن جلسه مورد نظر، برنامه شما باید مقدار زیر را خروجی دهد:

A meeting from <START> to <END> added to your day!
Plain text

برای مثال دستور زیر به معنای افزودن یک جلسه از ساعت ۱۰ صبح تا ساعت ۳ یا همان ۱۵ بعدازظهر است. توجه داشته باشید که ساعت راس ساعت ۱۵ جلسه تمام می‌شود و سلیب می‌تواند بدون تداخل، جلسه‌ای دیگر را از ساعت ۱۵ شروع کند.

add 10 15
Plain text

پس از افزوده شدن جلسه بالا، برنامه شما باید مقدار زیر را خروجی دهد:

A meeting from 10 to 15 added to your day!
Plain text
  • تضمین می‌شود که ساعت شروع و پایان جلسات، اعدادی بین ۰ تا ۲۴ هستند. هم‌چنین تضمین می‌شود که ساعت پایان یک جلسه، حداقل یک ساعت پس از شروع جلسه می‌باشد. تضمین آخر نیز این است که هیچ‌گاه تداخلی بین جلسات پیش نمی‌آید و در هر زمان فقط یک جلسه‌ خواهیم داشت.

چک کردن ساعات روز🔗

فرض کنید می‌خواهیم بدانیم که آیا مثلا سلیب می‌تواند از ساعت ۵ تا ۱۰ جلسه‌ای داشته باشد یا خیر. برای این کار از دستور زیر استفاده می‌کنیم:

check <START> <END>
Plain text

در این حالت، برنامه شما با دو حالت مواجه می‌شود:

  1. بازه زمانی مورد نظر به طور کامل خالی باشد که در این صورت برنامه شما باید در قالب زیر به سلیب بگوید که می‌تواند درون بازه مورد نظر جلسه‌ای داشته باشد:
You can add a meeting from <START> to <END>!
Plain text
  1. تمام بازه و یا بخشی از بازه زمانی مورد نظر پر باشد که در این صورت برنامه شما باید در قالب زیر به سلیب بگوید که نمی‌تواند درون بازه مورد نظر جلسه‌ای داشته باشد:
You can't have a meeting from <START> to <END>!
Plain text

برای مثال فرض کنید به ترتیب، دستورات زیر را به برنامه شما ورودی بدهیم:

check 10 15
add 10 15
check 9 12
check 15 17
Plain text

پس از افزوده شدن جلسه بالا، برنامه شما باید مقدار زیر را خروجی دهد:

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!
Plain text

آزاد کردن ساعات روز🔗

فرض کنید جلسه‌ای کنسل شده و یا کار فوری پیش آمده و ما می‌خواهیم از ساعت ۵ تا ۱۰ روز سلیب را آزاد کنیم. برای این کار از دستور زیر استفاده می‌کنیم:

free <START> <END>
Plain text

پس از افزوده شدن جلسه مورد نظر، برنامه شما باید مقدار زیر را خروجی دهد:

You're now free from <START> to <END>!
Plain text

برای مثال فرض کنید به ترتیب، دستورات زیر را به برنامه شما ورودی بدهیم:

check 10 15
add 10 15
check 9 12
free 9 12
check 9 12
check 12 14
Plain text

پس از افزوده شدن جلسه بالا، برنامه شما باید مقدار زیر را خروجی دهد:

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!
Plain text
  • دقت کنید که پس از آزاد کردن زمان از ساعت ۹ تا ساعت ۱۲، جلسه‌ی اول که از ساعت ۱۰ تا ساعت ۱۵ ایجاد شده بود به‌طور کلی کنسل نمی‌شود و فقط زمان ۱۰ تا ۱۲ آن کنسل می‌شود؛ اما از ۱۲ تا ۱۵، جلسه برقرار است.

دستور اشتباه🔗

اگر دستوری به جز سه دستور بیان‌شده به برنامه شما ورودی داده شود، باید خروجی زیر را نمایش دهید:

Command not found.
Plain text

برای مثال فرض کنید به ترتیب، دستورات زیر را به برنامه شما ورودی بدهیم:

add 1 6
hello
check 3 5
sokdfsjdsfshfc
check 6 7
Plain text

پس از افزوده شدن جلسه بالا، برنامه شما باید مقدار زیر را خروجی دهد:

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!
Plain text

خروج از برنامه🔗

برای خروج از برنامه از دستور زیر استفاده می‌کنیم:

exit
Plain text

در این صورت باید پیش از بسته شدن برنامه، خروجی زیر را چاپ کنید:

Bye Bye!
Plain text

و سپس برنامه را ببندید.

مثال🔗

برای مثال اگر اسکریپت شما را مانند زیر اجرا کنیم:

./checker.sh
add 1 6
check 3 5
free 5 7
check 5 7
add 5 7
check 20 24
SAliB
exit
Plain text

باید خروجی زیر را دهد:

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!
Plain text

پروژه اولیه🔗

برای دریافت پروژه اولیه این لینک را دانلود کنید. درون لینک ساختار فایلی زیر را مشاهده می‌کنید:

Busy_SAliB
├── checker.sh
└── test
    └── test_sample.py
Plain text

راه‌حل خود را درون فایل checker.sh پیاده‌سازی کنید. برای اطمینان نسبی از پاسخ‌تان می‌توانید از تست‌های نمونه مسئله استفاده کنید. اگر می‌خواهید درون سیستم خودتان از این تست‌ها استفاده کنید، با ترمینال به دایرکتوری Busy_SAliB بروید و سپس دستورات زیر را اجرا کنید:

chmod +x checker.sh
python3 -m unittest
Bash

و یا از طریق دکمه «اجرای تست نمونه» پاسخ‌تان را برای کوئرا ارسال کنید.

توجه کنید🔗

  • فراموش نکنید که اسکریپتی کامل را در پاسخ‌تان تحویل دهید.
  • فراموش نکنید که اسکریپت خود را درون فایلی با نام checker.sh وارد نمایید.
  • برای ارسال پاسخ خود کافی‌ست فایل checker.sh را آپلود کنید.
  • راس ساعت پایان، جلسه تمام می‌شود و سلیب می‌تواند بدون تداخل، جلسه‌ای دیگر را از ساعت آن ساعت شروع کند.
  • تضمین می‌شود که ساعت شروع و پایان جلسات، اعدادی بین ۰ تا ۲۴ هستند. هم‌چنین تضمین می‌شود که ساعت پایان یک جلسه، حداقل یک ساعت پس از شروع جلسه می‌باشد. تضمین آخر نیز این است که هیچ‌گاه تداخلی بین جلسات پیش نمی‌آید و در هر زمان فقط یک جلسه‌ خواهیم داشت.