روزهای کم‌جنایت


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

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

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

ورودی🔗

در خط اول ورودی روزی که ماه با آن شروع شده از یکی از روزهای زیر داده می‌شود:

Saturday
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Plain text

سپس در ۳۰ خط بعدی میزان جنایات گزارش شده در هر روز داده می‌شود. 1CrimeRate100 000 1 \le CrimeRate \le 100\ 000 تضمین می‌شود که تعداد روزهای ماه ۳۰ روز خواهد بود.

خروجی🔗

در خروجی، روزی در هفته که به طور میانگین، کمترین میزان جنایت‌های گزارش شده را داشته به همراه مقدار جز صحیح این میانگین چاپ کنید.

مثال🔗

‌ورودی نمونه🔗

Tuesday
53
67
32
73
88
59
78
3
30
15
31
56
32
79
83
17
50
4
49
97
75
2
56
62
77
98
47
97
56
62
Plain text

خروجی نمونه🔗

Tuesday 39
Plain text

مقدار میانگین اصلی ۳۹.۴ است که جز صحیح آن یعنی ۳۹ در خروجی چاپ می‌شود.

پرونده‌های نامرتب


بازرس لستراد که از تعداد پرونده‌های زیاد اسکاتلند یارد خسته شده برای حل برخی از آن‌ها با شرلوک تماس می‌گیرد. شرلوک از بازرس لستراد می‌خواهد که پرونده‌ها را در ساختار مشخصی برای او ارسال کند اما به دلیل بی‌نظمی‌های اسکاتلند یارد و نامشخص بودن ساختار پرونده‌های آن‌ها، بازرس لستراد توانایی انجام این کار را ندارد. با نوشتن یک اسکریپت شل به بازرس لستراد کمک کنید که با گرفتن فایل CSV پرونده‌ها، آن‌ها را در فولدرهای مختلف مرتب کرده و برای شرلوک ارسال کند.

در حال حاضر پرونده‌های اسکاتلند یارد در یک فایل CSV بزرگ با ساختار زیر قرار گرفته‌اند:

Name,Type,Status,Description
Lisa Eaton,Vice,Solved,Tend close bar crime president particular table possible. Seek keep purpose. Drug cultural industry maintain.
Chelsea Johnson,Vice,Not Started,Manager she prove authority. Office physical describe student social. Peace age real contain always wind dream activity. Bring well ask team.
Kimberly Murray,Arson,Solved,Sign whether throw now company full. Perhaps television take may suggest particularly. Happy tax our role. Carry charge ball which expect your.
Billy Stewart,Arson,In Progress,Thank else stay budget media require book tell. Relationship face clear song will. Region whose kind them.
CSV

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

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

  • برای پرونده‌های با وضعیت Solved همه افراد باید توانایی خواندن پرونده را داشته باشند اما فقط صاحب پرونده امکان نوشتن بر روی آن را داشته باشد.

  • برای پرونده‌های با وضعیت In Progress صاحب پرونده و گروه آن باید توانایی خواندن پرونده را داشته باشند اما فقط صاحب پرونده امکان نوشتن بر روی آن را داشته باشد.

  • برای پرونده‌های با وضعیت Not Started فقط صاحب پرونده توانایی خواندن آن را داشته باشد.

دقت کنید که در هیچ حالتی، هیچکس نباید بتواند فایل پرونده را اجرا کند.

دقت داشته باشید که ممکن است در نام افراد کاراکتر اسپیس وجود داشته باشد. در اینصورت باید اسپیس‌های موجود در نام را با کاراکتر _ جایگزین کنید.

مثال🔗

Name,Type,Status,Description
Lisa Eaton,Vice,Solved,Tend close bar crime president particular table possible. Seek keep purpose. Drug cultural industry maintain.
Chelsea Johnson,Vice,Not Started,Manager she prove authority. Office physical describe student social. Peace age real contain always wind dream activity. Bring well ask team.
Kimberly Murray,Arson,Solved,Sign whether throw now company full. Perhaps television take may suggest particularly. Happy tax our role. Carry charge ball which expect your.
Billy Stewart,Arson,In Progress,Thank else stay budget media require book tell. Relationship face clear song will. Region whose kind them.
CSV

با دریافت و پردازش این فایل باید پوشه‌بندی پرونده‌ها به شکل زیر ایجاد شود:

Cases
├── Arson
│   ├ (-rw-r-----) ── Billy_Stewart
│   ├ (-rw-r--r--) ── Kimberly_Murray
└── Vice
    ├ (-r--------) ── Chelsea_Johnson
    ├ (-rw-r--r--) ── Lisa_Eaton
Plain text

محتوای هر فایل نیز باید با ستون Description مربوط به آن پرونده پر شده باشد. برای مثال محتوای درون فایل Lisa_Eaton باید متن زیر باشد:

Tend close bar crime president particular table possible. Seek keep purpose. Drug cultural industry maintain.
Plain text

پروژه اولیه🔗

ساختار فایلی پروژه اولیه به شکل زیر است:

CaseSort
├── cases.csv
└── solution.sh
Plain text

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

نحوه ارسال🔗

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

پرونده‌های بین‌المللی


در حل این سوال بجز پیاده‌سازی صحیح، تمیزی، خوانایی و ساختار صحیح کد شما نیز در ارزیابی و دعوت شما به مصاحبه تاثیرگذار خواهد بود.


شرلوک که وقتش پس از حل پرونده‌های اسکاتلند یارد آزاد شده، تصمیم می‌گیرد به اینترپل کمک کرده و پرونده دیگر سازمان‌های جهان را قبول کرده و به آن‌ها نیز کمک کند. او برای ساده‌تر کردن دریافت پرونده‌ها تصمیم می‌گیرد به API این سازمان‌ها متصل شده و پرونده‌ها را از این راه دریافت کند. اما با توجه به اینکه قرار است به چندین سازمان مختلف متصل شود،‌ در این راه با پیچیدگی‌های مختلفی مواجه می‌شود. به او کمک کنید این پیچیدگی‌ها را حل کرده و به این سازمان‌ها کمک کند. برنامه شما در ابتدا باید با دریافت یک فایل YAML با ساختار زیر که با نام config.yaml در پوشه روت سیستم‌عاملی که کد شما در آن اجرا می‌شود قرار گرفته (یعنی باید فایل را در آدرس \config.yaml بخوانید)، آدرس سازمان‌هایی که شرلوک می‌خواهد به آن‌ها متصل شود را دریافت کند:

organizations:
    vice:
        - Address_1: 65
        - Address_2: 35
        - ...
    arson:
        - Address_3: 30
        - Address_4: 25
        - Address_5: 45
        - ...
YAML

زیربرنامه‌ی اول🔗

در این زیر برنامه، برنامه شما باید با گوش کردن روی آدرس 0.0.0.0:80 با دریافت درخواست‌های GET بر روی اندپوینت / درخواست‌ها را به صورت مساوی و برابر بین سازمان‌های مختلف پخش کرده (به آدرس مشخص شده در فایل YAML درخواست GET ارسال کند) و به شرلوک بازگردانی کند.

زیربرنامه‌ی دوم🔗

شرلوک پس از استفاده از برنامه اول متوجه می‌شود که بررسی پرونده‌ها بدون دسته بندی سخت و پیچیده است. به همین علت تصمیم می‌گیرد با اضافه کردن یک پارامتر کوئری به درخواست‌ها، دسته‌بندی آن‌ها را برای دریافت مشخص کند. برنامه شما باید با گوش کردن روی پورت 0.0.0.0:80 با دریافت درخواست‌های GET بر روی اندپوینت / بر اساس کوئری پارامتر type مشخص شده درخواست‌ها را به صورت مساوی بین آدرس‌های نوع پرونده پخش کنید. برای مثال با دریافت درخواست /?type=vice باید درخواست‌ها بین سازمان‌های ۱ و ۲ به صورت مساوی پخش شود. و اگر تایپ درخواست در بین تایپ‌های موجود در فایل config.yamlنبود، یک پیام با کد HTTP 400 و بدنه The Specified Type is Not Correct برگرداند. در صورتی که درخواستی بدون تایپ به API ارسال شد، شما باید مانند مرحله قبل درخواست‌ها را به صورت مساوی بین همه سازمان‌ها پخش کنید.

زیربرنامه‌ی سوم🔗

پس از بررسی‌های بیشتر، شرلوک متوجه می‌شود که بعضی از سازمان‌ها بیشتر از بقیه نیاز به کمک دارند. برای همین تصمیم می‌گیرد که توجه بیشتری را معطوف به این سازمان‌ها کند. در این زیر برنامه باید زیر برنامه قبلی را طوری تغییر دهید که درخواست‌ها را به جای پخش مساوی، به صورت وزن‌دار و با وزن‌های مشخص شده بین سازمان‌ها پخش کند. تضمین می‌شود که وزن سازمان‌ها عددی صحیح و مجموع آن‌ها در هر نوع برابر ۱۰۰ باشد. برای مشخص کردن اینکه آیا نیاز است درخواست‌ها به طور وزن دار یا بدون وزن تقسیم شوند، یک کوئری پارامتر دیگر با نام weighted اضافه می‌شود که مقدار آن برابر true است. برای مثال با دریافت درخواست /?type=homicide&weighted=true باید درخواست‌ها با وزن ۶۵ و ۳۵ بین سازمان‌های ۱ و ۲ پخش شود. برای پخش درخواست‌ها شما باید کوچکترین چرخه‌ای که می‌تواند درخواست‌ها را با این وزن پخش کند را انتخاب و از آن استفاده کنید. یعنی برای این مثال باید در هر ۲۰ درخواستی که به سمت برنامه ارسال می‌شود، ۱۳ درخواست به سازمان ۱ و ۷ درخواست به سازمان ۲ ارسال شود. در این مرحله در صورتی که درخواستی بدون تایپ به API ارسال شد، شما باید مانند مرحله قبل درخواست‌ها را به صورت مساوی بین همه سازمان‌ها پخش کنید. توجه کنید که در صورتی که کوئری پارامتر weighted وجود نداشت یا هر مقدار دیگری بجز true داشت، برنامه شما باید رفتار قبلی خود را داشته باشد.

زیربرنامه چهارم🔗

شرلوک که از تقسیم بار ورن‌دار خوشش آمده، حالا دیگر نمی‌خواهد نوع درخواست‌ها را مشخص کند. در این مرحله شما باید زیربرنامه سوم را طوری تغییر دهید که در صورتی که درخواستی بدون تایپ و با کوئری پارامتر weighted و مقدار true ارسال شد، درخواست‌ها را در بین تمامی سازمان‌ها بدون توجه به نوع آن‌ها به صورت وزن‌دار پخش کند. در این مرحله نیز شما باید کوچکترین چرخه‌ای که می‌تواند درخواست‌ها را با این وزن پخش کند را انتخاب و از آن استفاده کنید.

نحوه ارسال🔗

برای اجرای کد شما از داکر استفاده می‌شود. برای آشنایی با این ابزار از این لینک کمک بگیرید. شما باید با انتخاب یکی از ایمیج‌های استاندارد کوئرا به عنوان Base Image خود، داکرفایلی بنویسید که پروژه شما را بیلد کند. سیستم داوری کوئرا پس از بیلد کردن پروژه شما، فایل تنظیمات را در آن قرار داده و آن را اجرا کرده و تست می‌کند. برای ارسال پروژه، شما باید پوشه‌ای به شکل زیر ساخته و به صورت فایل ZIP به طوری که پوشه solution درون فایل قرار داشته باشد ارسال نمایید.

solution
├── Dockerfile
└── src
Plain text

کد شما و هر چیز دیگری که برای اجرای کد به آن نیاز دارید، باید در پوشه src قرار بگیرد.

لاگ‌های پرماجرا


  • محدودیت زمان: ۱ ثانیه
  • محدودیت حافظه: ۲۵۶ مگابایت

شرلوک که حالا به استفاده از APIهای مختلف برای اتصال به سازمان‌ها عادت کرده، در هنگام اتصال به APIهای اسکاتلند یارد دچار مشکل می‌شود. او که فرصت کمی برای بررسی مشکل دارد، از واتسون می‌خواهد با بررسی لاگ‌های سرویس‌های اسکاتلند یارد سرویس‌های دچار مشکل را پیدا کرده و مشکل آن‌ها را گزارش کند.

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

در این معماری برای عیب یابی و دنبال کردن مسیر درخواست کاربرها در سرویس‌ها، به هر درخواست یک آیدی منحصر به فرد اختصاص داده شده و با استفاده از این آیدی، اعمالی که هر سرویس در مسیر شروع تا پاسخگویی به درخواست انجام داده ثبت می‌شود. اگر دقت کنیم، متوجه می‌شویم که می‌توان هر یک از این اعمال (ارتباط با یک سرویس دیگر) را به شکل یک درخواست و پاسخ مستقل نگاه کرد. با توجه به این مسئله هر یک از این اعمال را به عنوان یک واحد مستقل به نام Span می‌شناسیم. با این تعریف هر Span می‌تواند شامل Span های متفاوتی شود. برای مثال اگر معماری زیر را داشته باشیم: معماری میکروسرویس مثال مسیر یک درخواست می‌تواند به شکل زیر باشد (خطوط افقی همان Span ها هستند): درخواست نمونه همچنین ممکن است که یک درخواست دچار مشکل شود. در اینصورت، Span آن و تمامی Span های والد آن نیز دچار مشکل می‌شوند. برای مثال می‌توانید مسیر درخواستی که با خطا مواجه شده را در تصویر زیر مشاهده کنید: درخواست نمونه با خطا اسکاتلند یارد، داده‌های درخواست‌های خود را به صورت فایل‌های JSON در اختیار دارد اما ابزاری برای تحلیل آن‌ها ندارد. به واتسون کمک کنید ابزاری توسعه دهد که با استفاده از این اطلاعات مشکل را پیدا کرده و در صورتی که درخواست با خطا مواجه شده، اطلاعات آن خطا و سرویسی که باعث آن خطا بوده را پیدا کرده و چاپ کند و در غیر اینصورت، بگوید که مشکلی در درخواست وجود نداشته. در قدم اول برای آشنایی شما با روند حل این مسئله، می‌توانید با دریافت فایل لاگ نمونه و مشاهده ورودی و خروجی مورد انتظار، رابطه بین آن‌ها را کشف کنید. سپس از شما انتظار می‌رود که برنامه‌ای بنویسید که لاگ‌ها را از stdin دریافت و به صورت اتوماتیک با توجه به ورودی، خروجی مورد انتظار را پیدا کرده و چاپ کند.

ورودی نمونه🔗

فایل درخواست سالم

فایل درخواست با خطا

خروجی نمونه🔗

برای درخواست اول باید برنامه شما عبارت Provided request has no errors را چاپ و برای درخواست دوم اطلاعات زیر را به همین شکل چاپ کند:

Service: CIA
Address: 127.0.0.1:41251
Route: /getCriminalData
Message: Network error
Plain text

هلم دردسرساز


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

او به واتسون می‌گوید که این هلم چارت قبلا کار می‌کرده; اما زمانی که یکی از اعضای تیم فنی اسکاتلند یارد تلاش کرده مقدارهای متغیرهای محیطی درون فایل values.yaml را به دیپلویمنت سرور اضافه کند، آن را خراب کرده و چون این هلم چارت در گیت نبوده،‌ حالا نمی‌توانند آن را بازگردانی کنند. واتسون که هنوز حتی کوبرنیتیز را نیز بلد نیست، نمی‌داند چطور مشکلات هلم را حل کند. به او کمک کنید که ابتدا مشکل چارت را حل کرده و سپس متغیرهای محیطی درون فایل values.yaml را به فایل deployment.yaml اضافه کند.

شما می‌توانید پروژه اولیه را از این لینک دانلود کرده و با استفاده از دستور helm مشکل آن را پیدا کرده و حل کنید. پس از حل مشکل نیز باید فایل deployment.yaml را طوری تغییر دهید که تمامی متغیرهای محیطی موجود در فایل values.yaml و کلید env را به صورت داینامیک در قسمت صحیح دیپلویمنت قرار دهید.
در نهایت و پس از حل مشکلات و اضافه کردن نیازمندی‌ها، فایل deployment.yaml را بارگذاری نمایید.