در این سوال به شما دو عدد صحیح مثل و داده میشود. از شما میخواهیم برنامهای بنویسید که مقدار و را دریافت کند و را چاپ کند.
در تنها سطر ورودی، دو عدد صحیح و که با یک فاصله از هم جدا شدهاند، داده میشود.
در تنها سطر خروجی، مقدار را چاپ کنید.
مهیار به ستکردن رنگ لباسها و وسایلش اهمیت زیادی میدهد. او میداند رنگهای مکمل ستهای قشنگی میسازند، ولی نمیتواند با داشتن یک رنگ، رنگ مکمل آن را تشخیص دهد.
مهیار میداند هر رنگ را میتوان از ترکیب سه رنگ اصلی قرمز، سبز و آبی نشان داد. میزان حضور هر کدام از این رنگها را با عددی بین ۰ تا ۲۵۵ نشان میدهند. در واقع هر رنگ را میتوان با سهتایی مرتب که است، نشان داد.
برای نمایش کد رنگها، اعداد و و را با دقیقاً ۲ رقم در مبنای ۱۶ پشت سر هم مینویسیم. همچنین علامت #
قبل از همه این ارقام و حروف به نشانه عدد بودن قرار میگیرد.
برای مطالعهی بیشتر دربارهی اعداد مبنای ۱۶ این پیوند را مطالعه کنید.
دو رنگ مثل و را مکمل مینامیم اگر و تنها اگر و و باشد. به شما کد رنگ داده میشود و از شما میخواهیم کد رنگ مکمل آن را با ساختار گفته شده، چاپ کنید.
در سطر اول ورودی، عدد صحیح و مثبت آمده که تعداد رنگهایی که در یک ورودی داده میشود را نشان میدهد.
در هر کدام از سطر بعدی، یک رشته به معنی کد رنگ، مثل آمده که با کاراکتر #
شروع میشود و در ادامه آن ۶ کاراکتر که میتواند 0
تا 9
یا A
تا F
باشد.
در سطر به ترتیب، کد رنگ مکمل را با ساختار گفته شده، چاپ کنید.
مهیار پس از اینکه نتوانست در شرکتی کار پیدا کند، با چالشی مواجه شد: شرکت همکاران سیستم اعلام کرد که اگر بتواند تسک زیر را فقط و فقط در یک خط و بدون استفاده از semicolon (یعنی ;
) بنویسد، تیم همکاران سیستم وی را با حقوق و مزایای عالی استخدام خواهد کرد. اما مهیار برنامهنویس خوبی نیست و حالا دست به دامن شما شده است که به او کمک کنید.
شرکت همکاران سیستم بعد از برگزاری یک آزمون استخدامی و ذخیره کردن اطلاعات کاربران در قالب یک فایل CSV، به این نتیجه رسید که میتواند هر فرد درخواست دهنده را به صورت زیر در نظر بگیرد:
پس از بدست آوردن لیست افراد واجد شرایط باید آنها را به نحو مطلوب تبدیل شوند:
اما همکاران سیستم برای محدود کردن لیست اسامی افراد قبول شده، محدودیت سن و نمره در نظر گرفته است. به این معنا که سن افراد حداکثر برابر سن خواسته شده یا همان age باشد. همچنین حداقل نمره افراد واجد شرایط باید برابر نمره خواسته شده شرکت یا همان score در نظر گرفته بشود.
در نهایت، پس از بهدست آوردن لیست افراد به نحو مطلوب، باید آنها را در خروجی ترمینال نمایش دهید.
در سطر اول ورودی، تعداد کل افراد یعنی وارد میشود.
در سطر دوم ورودی، حداکثر سن مورد نظر وارد میشود.
در سطر سوم ورودی، حداقل نمره مورد نظر وارد میشود.
و در سطر بعدی، اطلاعات کاربران به ترتیب و با ,
از یکدیگر دیگر جدا شده وارد میشود:
خروجی باید آرایه مرتب شده از لیست افراد که در قالب یک شی به صورت زیر بیان می شود:
یک فایل با نام main.js
که تابعی تحت عنوان convert
بنویسید که اعمال فوق را تنها و تنها در یک خط بدون استفاده از ;
انجام دهد.
پروژهی اولیه را از این لینک دانلود کنید.
همکاران سیستم به صورت درون سازمانی یک بازی ویدیویی به شدت جذاب و اکشن توسعه داده است که تیمهای مختلف بتوانند با یکدیگر به رقابت بپردازند. هر تیم میتواند به تعداد دلخواهی اعضا داشته باشد و هدف این بازی همچون بازیهای محبوبی مثل PUBG و COD این است که دو تیم در کسب بیشترین امتیاز با یکدیگر رقابت داشته باشند شیوه کسب امتیاز در این بازی به چند صورت امکان پذیر است:
بنابراین در گام اول، تیم فنی همکاران تصمیم گرفته است تا قبل از آمادهسازی زیرساخت سمت سرور این بازی، برای نمایش اطلاعات یک UI نسبتا ساده اما جذاب پیاده سازی شود. خوشبختانه مهیار قبلا ساختار کلی کد HTML را برای شما فراهم نموده است اما متاسفانه وی در باقی مباحث فرانت همچون CSS و JS هیچی بلد نیست و حال دست به دامن شما شده است.
div
با کلاس teams
درست کند که در برگیرنده جدول امتیازات دو تیم موجود در صفحه باشد. مهیار میخواهد شما کلاس .teams
را به نحوی مقداردهی کنید که دو تیم به صورت افقی با فاصله بین هم در کنار یکدیگر قرار بگیرند..team
باید به صورت حداقل ۴۵ درصد عرض کل صفحه نمایش را اشغال کند.rgb(235, 235, 235)
را دارا باشند (باقی سطرها دست نخورده باقی بمانند).1px
با استایل solid
و رنگ black
.div
با کلاس .status
نیز وجود دارد که وظیفه آن نمایش تیم برنده در حال حاضر است که باید به اندازه100px
از بالا با المان قبلیش فاصله داشته باشد.style.css
هستید..zip
آپلود نمایید.پروژهی اولیه را از این لینک دانلود کنید.
فایلهای پروژه اولیه را دانلود و از حالت فشرده خارج نمایید.
سپس دستور زیر را برای نصب پکیجها و وابستگیها در پوشه پروژه درون ترمینال خود وارد نمایید:
در نهایت برای راه اندازی سرور سوال دستور زیر را وارد نمایید:
زمانی که شما مشغول طراحی و پیادهسازی UI بودید مهیار هم اندکی JS یادگرفت و به یاری تیم فنی همکاران سیستم شتافت تا زیرساخت این رقابت را در قالب یک API فراهم کنند.
این API دارای دو endpoint است که به شرح زیر است:
اندپوینت اول با آدرس زیر که درخواستی از نوع GET را دریافت میکند و نام تیمها به همراه ID اشان را برمیگرداند:
اندپوینت دوم با آدرس زیر که درخواستی از نوع GET را دریافت میکند و اطلاعات اعضای حاضر در مسابقه را برمیگرداند:
همانطور که مشاهده میکنید اعضا تیمهای برحسب ID میباشند نه نام تیم.
وظیفه اصلی شما این است که بر اساس اطلاعات دریافتی جدول امتیازات هر تیم را به صورت جداگانه پیادهسازی نماید.
استراکچر جدول امتیازات هر تیم به صورت زیر است:
همانطور که مشاهده کردید در اطلاعات دریافتی مقدار امتیاز ذکر نشده است و برای محاسبه امتیاز هر فرد باید از فرمول زیر استفاده نمایید:
برای محاسبه رتبه هر فرد در تیم خودش یا همان Rank کافی است افراد تیم را فقط و فقط بر حسب امتیازشان مرتب نمایید همچنین تضمین میشود امتیاز هیچ دو فردی برابر نخواهد بود.
همچنین تیم همکاران خیلی به اموجیها علاقه دارد و معتقد است یکی از راههای کم هزینه و سریع برای زیباسازی وبسایتها استفاده از اموجی است به همین جهت:
در گام آخر شما باید درون div.status
نام تیم برنده را نمایش دهید. تیمی برنده است که مجموع امتیازات کسب شده اعضای آن بیشتر باشد همچنین تضمین میشود امتیازات دو تیم برابر نخواهند بود.
style.css
که در بخش قبل تکمیل نمودید در اینجا استفاده کنید.index.js
میباشید..zip
آپلود نمایید.پروژهی اولیه را از این لینک دانلود کنید.
شما تنها مجاز به انجام تغییرات در فایلهای علامت زده میباشید
هر قسمت سوال شامل دو بخش میباشد
public
) میباشند، توسط سیستم داوری بررسی و نمره دهی میشوند.div#logs
نمایش داده شوند.در این سوال شما تنها مجاز به استفاده از کتابخانههای زیر میباشید:
ماجرا از این قرار است که مهیار نه تنها به هیچکس، حتی خودش اعتماد ندارد بلکه به نرمافزارها نیز اعتماد ندارد. به همین منظور، قصد دارد یک پیامرسان بسیار امن با رمزگذاری سرتاسری (End To End Encryption یه به اختصار E2EE) راهاندازی کند. در این پیامرسان پیامها به صورت کاملا رمزگذاری شده به ازای هر فرد بین کاربران ارسال میشود.
از دیگر قابلیتهای این پیامرسان امکان ایجاد گروه است! حتی چتهای شخصی در قالب یک گروه صورت میگیرند، در این پیامرسان از گروهها به عنوان اتاق (Room) یاد میشود.
همچنین این پیامرسان هیچ اطلاعاتی را نه در سمت سرور و نه در سمت کاربر نگه داری نمیکند فلذا بدین معنا است که پس از بسته شدن مرورگر توسط کاربر تمامی اطلاعات فراموششده و پس از بازگشت به برنامه باید اطلاعات مورد نیاز مجددا توسط کاربر وارد شوند.
به منظور مدیریت متغیرها به شیوه صحیح و با رعایت قید ذکر شده نیاز به پیاده سازی یک حافظه متغیر بسیار ساده “Key-Value Pair” وجود دارد که باید آن را درون فایل memory.ts
تکمیل نمایید، این حافظه چیزی جز یکobject
ساده نیست که چهار تابع برای مدیریت حافظه مذکور را دار میباشد:
getMemory
که از حافظه موقت یک رونوشت (Copy) را برمیگرداند.memoryForget
که با دریافت نام کلید آن را از حافظه موقت حذف میکند.memoryRecall که
با دریافت نام کلید مقدار تعیین شده برای آن کلید را بر میگرداند، در صورتی که کلید مذکور وجود نداشت باید مقدارundefined
برگردانده شود.memoryRemember
که با دریافت یک کلید و مقدار که میتواند یک متغیر باشد یا یک تابع که به عنوان ورودی مقدار متغیر قبلی را دریافت کرده و مقدار جدیدی را برمیگرداند، درون حافظه مقدار کلید را تنظیم و یا باز تنظیم کند. .
json با کلیدهای زیر بارگذاری نماید:name
وارد میشود و از جنس رشته میباشد و باید حداقل ۳ کارکتر باشد در صورتی که طول رشته کمتر از ۳ بود باید ارور با پیغام زیر برگردانده شود:public
در قالب یک رشته میباشد.private
در قالب یک رشته میباشد.همچنین در مورد کلیدهای شخصی و عمومی این رشته کدگذاری شده باید موارد زیر بررسی و صحت سنجی شوند:
آیا کلیدهای ارسالی از نوع RSA256
میباشد؟ در غیر این صورت اروری با پیغام زیر برگردانده شود
-برای مثال فایلی با محتوای زیر تمامی شرایط فوق را دارا میباشد:
برای تکمیل این قسمت شما باید موارد زیر را تکمیل نمایید
encrypt.ts
🔗در این فایل شما باید isValidData
از کلاس EncryptionService
را تکمیل نمایید بدین نحو که با دریافت کردن اطلاعات کاربر در قالب یک Object
، خطاها را در صورت وجود در قالب یک آرایه شامل رشتهها برگرداند و درصورتی که هیچ مشکلی در داده ورودی نبود آرایه خالی برگرداند.
main.ts
🔗در این فایل شما باید قابلیتی را پیاده سازی کنید در هنگامی که کاربر فایل جدید را در #file-upload
بارگذاری کرد آن را صحت سنجی کرده و آن را درون حافظه با کلید credentials
ذخیره نماید. و در صورت بروز خطا، خطاها را به کاربر نمایش دهد. همچنین در صورتی که فایل دارای مشکل بود باید پیغام زیر به کاربر نمایش داده شود:
همانطور که قبلا ذکر شد در این پیامرسان، مفهومی تحت عنوان اتاق وجود دارد که میتواند حداقل یک عضو داشته باشد. تمامی افراد میتوانند به شرط داشتن گذرواژه وارد این اتاقها شوند، البته فردی که اتاق را در ابتدا درست کرده است، میتواند به نحو خاصی که در ادامه به آن اشاره خواهد شد، فقط به افراد به خصوصی امکان اجازه دسترسی بدهد حتی اگر رمز و نام اتاق را به نحوی به دست آورده باشند این مکانیزم منجر به این قضیه خواهد شد تا افراد فاقد صلاحیت نتوانند وارد اتاق شوند.
همانطور که ذکر شد، کاربر برای ایجاد و یا عضویت در اتاق باید نام اتاق (roomName
) به همراه گذرواژه (password
) و کلید عمومی خود را در قالب یک شی به سمت سرور ارسال کند:
/api/join/
🔗در گام اول، کاربر اطلاعات مذکور را به آدرس /api/join/
ارسال میکند و با یکی از سه سناریوی زیر مواجه میشود:
در صورتی که کاربر اطلاعات را به درستی وارد کرده باشد ولی با خطای 404 مواجه شود، باید همان اطلاعات را به مسیر /api/create/
ارسال کند و پس از ایجاد، مجدداً درخواست اول تکرار و ارسال شود.
در صورتی که گذرواژه به اشتباه وارد شده باشد، باید پیغامی با محتوای زیر در div#request-status
نمایش داده شود:
div#request-status
پیغام زیر نمایش داده شود:/api/create/
🔗کاربر اطلاعات زیر را به آدرس /api/create/
ارسال میکند تا یک اتاق جدید ایجاد کند:
اگر ایجاد اتاق موفقیتآمیز باشد، سرور یک پیام موفقیت با محتوای زیر به کاربر بازمیگرداند:
در غیر این صورت، باید خطای دریافتی از سمت سرور درو div#request-status
نمایش داده شود.
الزاما داشتن نام اتاق و گذرواژه آن راه مطلوبی برای تضمین امنیت گروهها نیست زیرا در صورتی که اطلاعات حساس اتاق وصل شود هر فردی میتواند به این اتاق دسترسی پیدا کند به همین منظور مهیار تصمیم گرفت که برای مدیریت این قضیه قابلیتی اضافه کند تا افرادی که دارای صلاحیت هستند را با استفاده از کلید عمومی آنها به گروه اضافه کند برای این منظور باید به درخواست زیر ارسال شود:
room.ts
تکمیل نماییدmain.ts
مطابق فیلدهایی که در فایل index.html
عملکرد مطلوب را پیاده سازی کنید برای ارتباط بلادرنگ، کاربران باید به یک WebSocket متصل شوند که پیاده سازی آن در فایل socket.ts
باید صورت بگیرد. برای این کار، باید از آدرس زیر استفاده شود و باید token
حاصل شده از بخش قبلی را در بخش احراز هویت Header ارسال نماید:
پس از اتصال موفق، کاربر کلید عمومی همراه با نام خود و شناسه اتصال سوکت را برای تمامی کاربران حاضر در اتاق در قالب یک رخداد تحت عوان publicKey
ارسال مینماید. همچنین باقی کاربران پس از دریافت باید اطلاعات خود را نیز در قالب همان رخداد ارسال نمایند.
input
مربوطه بنویسید و سپس دکمه Send
را فشرده تا روند اصلی ارسال آغاز شود.