سلام دوست عزیز😃👋

به مسابقه «بله‌کمپ ۷ - مرحله دوم (DevOps)» خوش آمدی!

نکات مفید برای شرکت در مسابقه:

  • هرگونه استفاده از ابزارهای تولید کد، مثل chatGPT و... در مسابقات کوئرا ممنوع است و بعد از شناسایی از لیست شرکت‌کنندگان مسابقه حذف می‌شوید.
  • هر گونه ارتباط با سایر شرکت‌کنندگان ممنوع است.
  • می‌توانید سوال‌ها و مشکلات خود را از بخش «سوال بپرسید» با ما در میان بگذارید.
  • این مسابقه دارای سناریو یک‌ پارچه است، یعنی پروژه سوالات شبیه به هم و دنباله‌دار هستند و روی یک فضا پیش می‌روند.
  • در این مسابقه تلاش شده تا مهارت شما هم در سطح توسعه دهنده یا همان developer و هم در سطح operation سنجیده شود. برای همین شما در برخی سوالات مجبور به توسعه و پیاده‌سازی هستید. در این گونه سوالات تلاش شده تا شما را محدود به استفاده از زبان برنامه‌نویسی مخصوصی نکنیم و دست شما را باز بگذاریم. بنابراین می‌توانید با زبان دلخواه خود به حل سوالات بپردازید.

موفق باشید و بهتون خوش بگذره 😉✌

نقشه گنج بَله


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

سلیب مطمئن بود که سایتی برای خرید بلیط کشتی به ارزان‌ترین حالت ممکن را قبلاً دیده و آن را بوک‌مارک کرده، اما نمی‌دانست که سایت را در کجای کدام مرورگر خود ذخیره کرده‌است. او که به انجام ندادن کارهای خود عادت کرده، از شما خواسته تا اسکریپتی به زبان bash برای او بنویسید تا تمامی بوک‌مارک‌های تمامی مرورگر‌های سلیب را به صورت markdown درون فایلی ذخیره کند. در ادامه به بیان جزئیات بیشتر مسئله می‌پردازیم.

جزئیات پروژه🔗

برای دانلود پروژه‌ی اولیه روی این لینک کلیک کنید.

در لپ‌تاپ شخصی سلیب مرورگر‌های chrome ،opera و operagx موجود هستند.

تمامی مرورگر‌ها بوک‌مارک‌های خود را در ساختاری مختص به خود درون فایل json ذخیره می‌کنند. سلیب جهت آسان‌تر کردن کار شما، آدرس فایل‌های مربوط به هر مرورگر را در فایلی با نام addresses.txt در کنار اسکریپت شما ذخیره کرده‌است. نمونه محتوای این فایل به شکل زیر است:

extensionFromNameaddresses.txt
operagx:./samples/operagx.json
opera:./samples/opera.json
chrome:./samples/chrome.json
Plain text

توجه داشته باشید ممکن است در آدرس کاراکتر‌های اسپیس ()، نقطه (.) و تیلدا (~) موجود باشد، همچنین ترتیب مرورگرها درون فایل همواره ثابت نیست ولی همواره تمامی مرورگر‌ها درون فایل موجود هستند.

اسکریپت شما باید آدرس و تایتل تمامی سایت‌های بوک‌مارک موجود در هر یک از این مرورگرها را بیابد و سپس موارد تکراری موجود را حذف کند و در نهایت مطابق شکل زیر، موارد را درون فایلی با نام unique_bookmarks.md ذخیره کند.

extensionFromNameunique_bookmarks.md
# Unique bookmarks:

| Name | URL |
|------|-----|
| {NAME} | {URL} |
| {NAME} | {URL} |
| {NAME} | {URL} |
...
Markdown

توجه داشته باشید ممکن است تایتل یا نام آدرس‌ها با " شروع یا تمام شوند. نیاز است تا شما این کاراکتر‌ها را از تایتل یا نام آدرس حذف کنید؛ اما اگر " در وسط کلمه وجود داشت شما مجاز به حذف آن نیستید. مثلاً اسکریپت شما باید تایتل """"""""I love "IRAN" so much" را به I love "IRAN" so much تبدیل کند. همچنین دقت کنید که ممکن است در بیین تایتل آن‌ها | وجود داشته باشد؛ که این مورد هم باید حذف شود. برای مثال نام جامعه برنامه‌نویسان ایران | Quera در فایل opera.json باید به جامعه برنامه‌نویسان ایران Quera تبدیل شود.

به علامت‌های نگارشی و بزرگی و کوچکی توجه کنید. خروجی اسکریپت شما باید دقیقاً برابر مقدار خواسته‌شده باشد.

راه‌حل خود را درون فایل script.sh موجود در پروژه اولیه، پیاده‌سازی کنید.

برای حل مسئله تنها مجاز به استفاده از دستور jq برای پارس کردن فایل‌های جیسون می‌باشید. داکیومنتیشن این دستور در این لینک قابل مشاهده است.

نمونه اجرا

برای مثال در پروژه‌ی اولیه، نمونه‌ای از فایل ذخیره‌شده‌ی بوک‌مارک در تمامی مرورگر‌های مسئله موجود است. با اجرای اسکریپت شما، باید خروجی خواسته‌شده مشاهده شود:

extensionFromNameTerminal
$ ./script.sh
Reading bookmark file addresses from addresses.txt
Terminal

همچنین محتوای فایل unique_bookmarks.md هم باید به‌صورت زیر باشد:

extensionFromNameunique_bookmarks.md
# Unique bookmarks:

| Name | URL |
|------|-----|
| test 1 | https://test1.com/ |
| Intro  Putting the "You" in CPU | https://cpu.land/ |
| Amazon | https://www.amazon.com/ |
| Hero Wars | https://www.hero-wars.com/ |
| Walmart | https://walmart.com/ |
| eBay | http://www.ebay.com/ |
| test 2 | https://test2.com/ |
| test 3 | https://test3.com/ |
| test 4 | https://test4.com/ |
| test 5 | https://test5.com/ |
| test 6 | https://test6.com/ |
| test 7 | https://test7.com/ |
| تاکسی اینترنتی تپسی - اپلیکیشن درخواست خودرو و پیک  TAPSI | https://tapsi.ir/ |
| ترب  بهترین قیمت بازار | https://torob.com/ |
| جامعه برنامه‌نویسان ایران  Quera | https://quera.org/ |
| دیوار: بزرگترین سایت نیازمندی های رایگان در ایران | https://divar.ir/ |
| سوپر اپلیکیشن اسنپ  سامانه هوشمند حمل‌ونقل  تاکسی اینترنتی | https://snapp.ir/ |
| فروشگاه اینترنتی دیجی‌کالا | https://www.digikala.com/ |
Markdown

نیازی نیست ترتیب جدول خروجی مشابه ترتیب جدول در صورت سؤال باشد و به هر ترتیب دلخواهی مجاز به تشکیل جدول هستید. تعداد سطرهای خروجی اسکریپت شما باید دقیقاً برابر با تعداد سطرهای جدول بالا باشد.

نکات مهم🔗

  • فراموش نکنید که اسکریپتی کامل را در پاسختان تحویل دهید.
  • فراموش نکنید که اسکریپت خود را درون فایلی با نام script.sh وارد نمایید.
  • برای ارسال پاسخ خود کافی‌ست فایل script.sh را آپلود کنید.
  • خروجی و رفتار دستور jq ممکن است در توزیع‌های مختلف لینوکس رفتار متفاوتی از خود نشان دهد؛ در نتیجه ترجیحا برای تست اسکریپت خود از سیستم‌عامل اوبونتو استفاده کنید.
  • سطح و level ایندنت‌ها و همچنین فیلدهایی که در مرورگرهای مختلف، url یا name را در خود ذخیره کرده‌اند متفاوت است و شما باید به صورت بازگشتی چک کنید تا به پراپرتی url یا name برسید و آن‌ها را استخراج کنید.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.