سلیب که از طراحی سوالات ورودی و خروجی کوئرا خسته شده بود، تصمیم گرفت تا با پیادهسازی اسکریپتی این فرآیند طاقتفرسا را برای خود سهل کند! ابتدا با ساختار فایل داوری ورودی خروجی آشنا شویم، ساختار فایلی که برای کوئرا مورد پذیرش است، به فرم زیر است:
کوئرا برای هر ورودی مثل i، محتویات فایل in/input{i}.txt
را به کد ارسالی کاربر میدهد و خروجی را با محتویات فایل out/output{i}.txt
مقایسه میکند و در صورت برابر بودن، نمره را به پاسخ ارسالی کاربر میدهد.
تا پیشاز این سلیب به طور کاملا دستی محتوای تمامی output{i}.txt
ها را پر میکرد، حال از شما میخواهد تا اسکریپتی بنویسید که این کار را برای او انجام دهد. او میخواهد تا اسکریپت شما با دریافت تعداد ورودی، ورودیها را از فایل مربوطه بخواند و به عنوان ورودی (stdin) به برنامه main.py
دهد و خروجی برنامه را در فایل خروجی مربوط به تست کیس بنویسد. برای درک بهتر مثالی را پیش میبریم.
برای مثالی با 3
تست کیس، اسکریپت generator.sh
شما ابتدا در ساختار زیر قرار دارد:
سلیب میخواهد که وقتی اسکریپت شما را مانند زیر اجرا کند:
in/input1.txt
درون فایل out/output1.txt
ذخیره شود.in/input2.txt
درون فایل out/output2.txt
ذخیره شود.in/input3.txt
درون فایل out/output3.txt
ذخیره شود.و در نهایت به ساختار زیر برسیم:
برای دریافت پروژه اولیه این لینک را دانلود کنید. درون لینک ساختار فایلی زیر را مشاهده میکنید:
راهحل خود را درون فایل generator.sh
پیادهسازی کنید.
main.py
صرفا برای تست روی سیستم شخصیتان در اختیار شما قرار گرفته و main.py
روی سیستم داوری خروجیهای متفاوتی تولید میکند.main.py
باید از دستور زیر استفاده کنید:in/
قرار دارند و تضمین میشود که هیچ تستکیسی خالی نمیباشد.برای ارسال جواب، دستورات خواسته شده را در فایلی با نام generator.sh
بنویسید و سپس آن را انتخاب و ارسال کنید.
سلیب که به تازگی شرکت خود را تاسیس کرده اکنون با چالش جدیدی مواجه شده، مدیریت کارمندان! در حال حاضر او نیاز دارد تا بتواند هرگاه که اراده کرد به هر کارمند خود به عنوان تشویق پاداش بدهد یا اطلاعات تمامی کارمندان ساکن شهر خاصی را ببیند.
سلیب اطلاعات تمامی کارمندان خود را در یک فایل با نام employee.csv
ذخیره کرده که محتوای آن به فرمت زیر است:
در ستون اول آیدی کارمند، در ستون دوم شهر کارمند، در ستون سوم نام کارمند، در ستون چهارم شماره تلفن کارمند، در ستون پنجم حقوق کارمند و در ستون ششم آدرس کارمند مشاهده میشود.
او که چیزی از ترمینال لینوکس و اسکریپتنویسی نمیداند از شما کمک خواسته تا برای او دو کار زیر را انجام دهید:
bonus
تعریف کنید تا با دریافت آیدی کارمند، به میزان ۵ درصد حقوق او به او پاداش دهد. یعنی با اجرای دستور زیر:خروجی زیر مشاهده شود:
city
تعریف کنید تا با دریافت شهر مورد نظر سلیب، نام و شماره تلفن تمام کارمندان ساکن آن شهر او را خروجی بدهد. یعنی با اجرای دستور زیر:خروجی زیر مشاهده شود:
command not found
را چاپ کند.برای مثال اگر اسکریپت شما را مانند زیر اجرا کنیم:
باید خروجی زیر را دهد:
یا اگر اسکریپت شما را مانند زیر اجرا کنیم:
باید خروجی زیر را دهد:
برای دریافت پروژه اولیه این لینک را دانلود کنید. درون لینک ساختار فایلی زیر را مشاهده میکنید:
راهحل خود را درون فایل manager.sh
پیادهسازی کنید.
employee.csv
در کنار اسکریپت شما قرار دارد.برای ارسال جواب دستورات خواسته شده را درون فایلی با نام manager.sh
وارد کنید و آن را انتخاب و سپس ارسال کنید.
سلیب که به تازگی با داکر آشنا شده قصد دارد تا یک docker-compose
ابتدایی را طراحی کند. در ادامه به بیان جزئیات کانتینر مورد نظر او میپردازیم، به سلیب کمک کنید محدویتهای زیر را در منابع یک container داکر Redis اضافه کند:
6379
اجرا شده باشد.30M
باشد.30M
باشد.برای دانلود پروژهی اولیه روی این لینک کلیک کنید.
۱. شما اجازهی build کردن یک Image جدید نخواهید داشت و باید از Imageهای استاندارد استفاده کنید. بهطور خاص، برای Redis میتوانید از Image با آدرس زیر استفاده کنید:
۲. نام container باید redis
باشد.
۳. سیستم داوری کوئرا بهصورت خودکار فایل docker-compose.yml
را با کامند زیر اجرا میکند. شما نیازی به کد یا اسکریپتی برای اجرای این کار ندارید.
۴. توجه داشته باشید که ورژن docker-compose.yml
باید 2
باشد.
شما تنها مجاز به ارسال فایل docker-compose.yml
هستید.
در تیم زیرساخت دیجیکالا، میکروسرویسهای مختلفی در حال پدید آمدن هستند. برخی از این میکروسرویسها قرار است تنها برای کاربران برخی از کشورها در دسترس باشند. سالار که وظیفهی مدیریت درخواستهای ورودی از کشورهای مختلف را برعهده دارد، لیستی از بازههای آیپیهای کشورهای مدنظرش جمعآوری کرده است. او اکنون از شما میخواهد اسکریپتی برای او بنویسید که با استفاده از آن بتوان درخواستهای ورودی از کشورهای مختلف را مسدود یا آزاد کرد.
پروژهی اولیه را از این لینک دانلود کنید.
ساختار فایلهای پروژه بهصورت زیر است:
اسکریپت country_manager.sh
را مطابق توضیحات زیر پیادهسازی کنید:
./country_manager.sh command ip_list_filepath
است. مثال:command
و یکی برای ip_list_filepath
) بود، اسکریپت باید عبارت not enough arguments
را چاپ کند و متوقف شود.command
برابر با block
یا unblock
نبود، اسکریپت باید عبارت invalid command
را چاپ کند و متوقف شود.ip list file not found
را چاپ کند و متوقف شود.command
برابر با block
باشد، اسکریپت باید لیست بازههای آیپی موجود در فایل را دریافت کند و درخواستهای ورودی مربوط به این آیپیها را بهازای همهی پروتکلها و پورتها DROP
کند. اگر rule مربوط به ACCEPT
کردن این درخواستها از قبل موجود بود، اسکریپت باید آنها را حذف کند.command
برابر با unblock
باشد، اسکریپت باید لیست بازههای آیپی موجود در فایل را دریافت کند و درخواستهای ورودی مربوط به این آیپیها را بهازای همهی پروتکلها و پورتها ACCEPT
کند. اگر rule مربوط به DROP
کردن این درخواستها از قبل موجود بود، اسکریپت باید آنها را حذف کند.iptables
انجام شود.پس از پیادهسازی موارد خواستهشده، فایل country_manager.sh
را آپلود کنید.
روزی روزگاری، محمد از دست گیتلب به کفر آمد و تصمیم گرفت تا سرویسی برای شرکت در همین زمینه راهاندازی کند ولی به دلیل خستگی زیاد از شما خواسته تا به او در راستای این هدف کمک کنید.
در این تمرین، ما از شما میخواهیم یک سرویس gitea
را تنظیم و راهاندازی کنید. برای دانلود پروژه اولیه روی این لینک کلیک کنید.
gitea
شما باید روی پورت 3000
اجرا شده باشد.gitea
نباید به هیچ عنوان از بین برود (یعنی اگر به هر دلیلی سرویس ها متوقف شدند، نباید هیچ دیتایی از دست رفته باشد.).gitea
بلافاصله مجددا اجرا شود. ssh
سرویس برای محمد اهمیتی ندارد، برای اطمینان میتوانید از پورت 222
استفاده کنید.gitea
دسترسی دارند برابر با 1000
باشد.gitea
را اجرا میکند باید برابر با gitea
باشد.۱. شما تمامی تغییرات خود را درون فایل docker-compose.yml
اعمال کنید. شما تنها مجاز به ارسال این فایل خواهید بود و با دستور زیر فایل ارسالی شما درون سیستم داوری اجرا خواهد شد:
پس از اجرای دستور بالا باید تمامی سرویسهای مورد نظر شما تنظیم و راهاندازی و اماده تست کردن باشند.
۲. شما تنها مجاز به استفاده از ایمیجهای موجود در این لینک هستید و میتوانید هر تعداد سرویس که نیاز دارید تنظیم و راهاندازی کنید تا به خواسته مسئله برسید. توجه داشته باشید که شما مجاز به استفاده از ایمیجهای دیگر نیستید و فقط میتونید از مجموعه ایمیجهای موجود در همین ایمیجرجیستری استفاده کنید.
۳. شما اجازهی build کردن یک Image جدید نخواهید داشت و باید از Imageهای استاندارد کوئرا استفاده کنید. بهطور خاص، برای gitea میتوانید از Image با آدرس زیر استفاده کنید:
۴. در صورت نیاز به دیتابیس، از ایمیجهای زیر نیز میتوانید استفاده کنید:
توجه کنید که هر فایل و محتوای دیگری به جز docker-compose.yml
که در فایل ارسالی شما قرار داشته باشد حذف خواهد شد.
در صورتی که نیاز دارید که فایلی علاوهبر docker-compose.yml
به سیستم داوری کوئرا ارسال کرده و در راهحل خود از آنها استفاده کنید، میتوانید از پوشهی data
استفاده کنید. برای این کار کافیست که پوشهای به نام data
در کنار docker-compose.yml
ایجاد کرده و برای سیستم داوری کوئرا ارسال نمایید.
فراموش نکنید که در این حالت، فایل extrafile
که volume شده است را درون پوشهی data
قرار داده و آن را برای سیستم داوری ارسال نمایید. برای مثال، پوشهی ارسالی شما برای داوری کوئرا به شکل زیر میتواند باشد:
توجه: سیستم داوری کوئرا بهصورت خودکار فایل docker-compose.yml
را با کامند up
اجرا میکند. شما نیازی به کد یا اسکریپتی برای اجرای این کار ندارید.
توجه: استفاده کردن از پوشهی data
، کاملاً به خواست شما بوده و ممکن است این سؤال بدون نیاز به استفاده از پوشهی data
حل شود.
شما تنها مجاز به تغییر در فایل docker-compose.yml
هستید و در صورت نیاز در کنار آن میتوانید پوشهای با نام data
نیز قرار داده و ارسال نمایید. تمامی فایلها یا پوشههای دیگر حذف خواهند شد!
این سؤال تنها با زبانهای PHP ، Python ، Go و JS (Node.js) قابل حل است.
دیجیکالا قصد دارد برای بخش تحویل محصولات خود یک سامانهی سادهی ثبت پیشنهادات و انتقادات راهاندازی کند. از شما میخواهیم یک API برای این سامانه طراحی کنید.
پروژهی اولیه را از این لینک دانلود کنید.
در این سؤال، یک REST API شامل endpoint های زیر باید پیادهسازی شود:
آدرس | عنوان |
---|---|
GET / |
بررسی up بودن سرویس |
POST /signup |
ثبتنام |
POST /login |
ورود به حساب کاربری |
POST /suggestions |
درج پیشنهاد یا انتقاد |
GET /suggestions |
دریافت لیست پیشنهادات و انتقادات |
در این API هر کاربر باید یک توکن داشته باشد. این توکن برای هر کاربر ثابت است.
در همهی endpoint ها، پاسخ باید بهصورت JSON باشد.
اطلاعات ورودی بهصورت application/x-www-form-urlencoded
به endpoint ها ارسال میشوند.
پاسخ این endpoint باید بهصورت زیر باشد:
200
{"ok":true}
دو پارامتر username
و password
باید به این endpoint ارسال شوند. در صورتی که حداقل یکی از این پارامترها ارسال نشده باشد یا برابر با رشتهی خالی باشد، پاسخ باید بهصورت زیر باشد:
400
{"ok":false,"error":"no username or password provided"}
اگر کاربری با نام کاربری واردشده از قبل موجود باشد، پاسخ باید بهصورت زیر باشد:
400
{"ok":false,"error":"user already exists"}
در غیر اینصورت، کاربر باید ساخته شود، یک توکن یکتا برایش تولید شود و پاسخ بهصورت زیر باشد:
201
{"ok":true,"token":"USER_TOKEN"}
دو پارامتر username
و password
باید به این endpoint ارسال شوند. در صورتی که حداقل یکی از این پارامترها ارسال نشده باشد یا برابر با رشتهی خالی باشد، پاسخ باید بهصورت زیر باشد:
400
{"ok":false,"error":"no username or password provided"}
اگر نام کاربری یا رمز عبور نادرست باشد، پاسخ باید بهصورت زیر باشد:
400
{"ok":false,"error":"invalid username or password"}
در غیر اینصورت، پاسخ باید بهصورت زیر باشد:
200
{"ok":true,"token":"USER_TOKEN"}
این endpoint نیازمند authentication است. در ریکوئست ارسالی مقدار هدر Authorization
باید برابر با توکن کاربر باشد (بدون Bearer
یا موارد مشابه).
پارامتر text
(متن پیشنهاد یا انتقاد) باید به این endpoint ارسال شود. در صورتی که این پارامتر ارسال نشده باشد یا برابر با رشتهی خالی باشد، پاسخ باید بهصورت زیر باشد:
400
{"ok":false,"error":"no text provided"}
در غیر اینصورت، پیشنهاد یا انتقاد باید ثبت شود و پاسخ بهصورت زیر باشد:
201
{"ok":true}
این endpoint باید لیست پیشنهادات و انتقادات ثبتشده در سامانه را در قالب یک لیست برگرداند. این لیست شامل پیشنهادات و انتقادات ثبتشده توسط همهی کاربران است.
200
برای حل این سؤال میتوانید از هر زبان و هر تکنولوژیای که میخواهید استفاده کنید. بهصورتی که در یک پوشه به نام api
کد برنامه را نوشته و در فایلی به نام runner.sh
که توسط sh
اجرا میشود، باید برنامهی خود را اجرا کنید. توجه کنید که حتماً باید Dockerfile
مربوط به پروژهی خود را برای ما ارسال کنید.
در پروژهی اولیه، ۴ داکرفایل برای php
، python
، golang
و node
قرار دادیم که میتوانید از آنها مستقیماً استفاده کنید. در صورتی که از یکی از این زبانها برای حل سؤال استفاده میکنید، کافیست که Dockerfile
مربوط به آن را در پوشهی api
کپی کنید و طبق توضیحات داده شده، سؤال را حل کنید. برای نصب نیازمندیهای پایتون از requirements.txt
، برای پیاچپی از composer.json
، برای گولنگ از go.mod
و برای نودجیاس از package.json
استفاده کنید.
در صورتی که زبان مورد استفادهی شما، چیزی به جز این ۴ مورد است، باید خودتان داکرفایلی در پوشهی api
بهشکلی بنویسید که بتواند نیازمندیهای پروژهی شما را نصب کرده و برنامهی شما را مانند داکرفایلهای موجود اجرا کند.
docker-compose.yml
زیر را خارج از فولدر api
پاسخ شما قرار میدهد و با دستور docker-compose up --build
آن را اجرا میکند.docker-compose.yml
دلخواه نیستید.80
آدرس localhost
قابل دسترسی باشد.runner.sh
خود APIتان را روی 0.0.0.0:80
اجرا کنید.Dockerfile
امکان تغییر فایل Dockerfile
وجود ندارد، اما در اسکریپت runner.sh
میتوانید هر دستوری را اجرا کنید.
شما میتوانید تمامی محتوای موجود در پوشهی api
را تغییر دهید و هر فایلی که میخواهید اضافه یا کم کنید.
توجه کنید که نام فایل کد شما برای سیستم داوری اهمیتی ندارد و این خود شما هستید که در runner.sh
از نام آن برای اجرای پروژه استفاده میکنید.
در نهایت این پوشه را zip کرده و ارسال کنید. توجه کنید که پس از extract کردن فایل zip شما، باید پوشهی api
را ببینیم که درون آن Dockerfile
وجود دارد.