در بازی گل یا پوچ سه نفر با هم، همتیمی میشوند. هر کدام دو دست دارند. دست چپ را با و دست راست را با نشان میدهیم. پس در مجموع شش دست در بازی هست. در یک دست گل و پنج دست دیگر پوچ است.
بازیکنها را با اعداد ۱ تا ۳ شمارهگذاری میکنیم. در ابتدا گل در دست بازیکن شمارهی است که مقدار برابر یا است. بازی شروع میشود و در حین بازی، بازیکنان حرکت انجام میدهند. حرکتها یکی از حالتهای زیر را دارد:
در این حرکت بازیکن شمارهی محتوای دو دستش را جابهجا میکند. ()
در این حرکت بازیکن شمارهی محتوای دست خودش را با محتوای دست بازیکن جابهجا میکند. ( و )
مشتی علی گزارش این حرکت را به ترتیب به شما میدهد. شما باید شمارهی بازیکنی که گل در دست آن است و اسم دست آن بازیکن را نشان میدهد.
در سطر اول ورودی، عدد صحیح و مثبت داده میشود.
در سطر دوم ورودی، عدد و کاراکتر داده میشود.
در سطر بعدی در هر سطر یکی از حرکتها داده میشود.
حرکت نوع اول به صورت است. که یعنی بازیکن ام محتوای دو دستش را عوض میکند.
حرکت نوع دوم به صورت که یعنی بازیکن ام محتوای دست را به دست بازیکن ام میدهد.
در یک سطر، عدد و کاراکتر را چاپ کنید که شمارهی بازیکن و دستی که گل در آن است را نشان میدهد.
باقر و علی میخواهند باهم دارت بازی کنند. تصویر دارت به صورت شکل زیر است:
در بازی دارت، قوانین امتیازدهی به این صورت است:
تخته دارت به ۲۰ بخش مساوی تقسیم شده که هر بخش عددی بین ۱ تا ۲۰ را نشان میدهد.
در مرکز تخته دارت یک بخش کوچک به نام «بولسآی» (Bullseye) وجود دارد که از دو بخش تشکیل شده است. حلقهی مرکزی کوچکتر، دایرهای با شعاع ۱ سانتیمتر با ۵۰ امتیاز و حلقهی مرکزی بزرگتر، دایرهای با شعاع ۲ سانتیمتر و ۲۵ امتیاز دارد.
اگر دارت به هر بخش از تخته بخورد، امتیاز همان بخش به بازیکن تعلق میگیرد (یک برابر). در اطراف هر عدد، دو حلقه وجود دارد: حلقه خارجی (حلقه سهبرابر): اگر دارت به این حلقه برخورد کند، امتیاز آن بخش سه برابر میشود. اندازهی این بخش ۱ سانتیمتر است.
حلقه داخلی (حلقه دوبرابر): اگر دارت به این حلقه برخورد کند، امتیاز آن بخش دو برابر میشود. اندازهی این بخش ۱ سانتیمتر است.
تخته بیرونی (خارج از بخشهای امتیازی): دارت به تخته نخورده و امتیازی ندارد.
اندازهی شعاع دایرهی خارجی (با حلقه سهبرابر) ۱۰ سانتیمتر و اندازهی شعاع دایرهی داخلی (با حلقه دوبرابر) ۶ سانتیمتر است.
آنها دچار خطای ارزیابی هستند و اکنون پرتابهای خودشان را روی صفحه انجام دادهاند و سپس میخواهند ترتیب اعداد ۱ تا ۲۰ را طوری تغییر دهند که امتیاز باقر خیلی بیشتر از امتیاز علی شود. آنها نمیتوانند امتیاز بولسآی را تغییر دهند.
حال میدانیم باقر پرتاب کرده و علی پرتاب میخواهیم بدانیم در بین تمام عددگذاریهای مختلف در کدام حالت اختلاف امتیاز باقر از علی بیشتر است.
پرتابهای باقر و علی را به صورت و میدهیم یعنی در چه شعاع و زاویهای دارت پرتاب شده است. مقدار برحسب سانتیمتر و نشان دهندهی فاصله از مرکز دارت است. همچنین زاویهی نقطهی پرتاب شده از محور ها را نشان میدهد. برای مثال ناحیهی شمارهی ۱۳ در شکل، زاویهی ۹ تا ۲۷ درجه است.
تضمین میشود هیچوقت پرتابی به ناحیهی مرزی نمیخورد.
در سطر اول ورودی، دو عدد صحیح و مثبت و داده میشود.
در سطر بعدی در هر سطر دو عدد و داده میشود که پرتاب اول برای باقر و تای بعدی برای علی است.
تضمین میشود هیچوقت پرتابی به ناحیهی مرزی نمیخورد.
یک عدد صحیح برابر بیشترین اختلاف امتیازی که میتواند باقر از علی پیدا کند.
در این حالت، باقر ۳ دارت و علی ۱ دارت پرتاب کردهاند. باقر پرتاب دوم و سومش به بولسآی ۲۵ امتیازی و پرتاب علی به بولسآی ۵۰ امتیازی برخورد کرده است. پرتاب اول باقر در حلقهی داخلی (دو برابر) خورده است. بنابراین اگر امتیازها را طوری تغییر دهیم که ۲۰ امتیاز روی آن قطعه قرار بگیرد، اختلاف امتیاز باقر و علی بیشینه و برابر است با:
در این حالت، باقر و علی هر کدام ۲ دارت پرتاب کردهاند. پرتاب اول باقر به بولسای ۲۵ امتیازی و پرتاب اول علی به بولسآی ۵۰ امتیازی برخورد کرده است. پرتابهای دوم باقر و علی هر دو به حلقههای بیرونی (سه برابر) خورده است ولی در دو ناحیهی مختلف. اگر اعداد ۱ تا ۲۰ را طوری قرار دهیم که ناحیهی باقر ۲۰ امتیاز و ناحیهی علی ۱ امتیاز داشته باشد، اختلاف امتیاز باقر و علی بیشینه و برابر است با:
در یک شرکت برنامهنویس مشغول به کار هستند. هر کدام از این نفر در برخی از زمینههای Front-end
، Back-end
یا Product Mangement
تخصص دارد.
تخصصهای هر شخص را با یک رشته شامل حروف B
، F
و P
به صورت مرتبشده الفبایی به ما داده شده است.
میخواهیم با داشتن این تخصصها، حداکثر تعدادی تیم کامل را تشکیل دهیم. منظور از یک تیم کامل تیمی است که در آن برای هر کدام از این سه زمینه حداقل یک متخصص وجود داشته باشد. هر شخص باید دقیقاً یک سمت را داشته باشد و نمیتواند بخاطر تخصصش در دو زمینه نیاز تیم را در هر دو زمینه برطرف کند. توجه کنید باید در این تیمبندی هر شخص در حداکثر یک تیم آمده باشد.
حال از شما میخواهیم برنامهای بنویسید که این بیشترین تعداد تیم را محاسبه کند.
در سطر اول ورودی، عدد صحیح و مثبت آمده که تعداد تستها را نشان میدهد.
در سطر اول هر تست، عدد صحیح و مثبت داده میشود که تعداد برنامهنویسها را نشان میدهد.
در سطر بعدی در هر سطر یک رشته داده میشود که رشتهی سطر ام تخصص برنامهنویس ام را نشان میدهد.
در تنها سطر خروجی، یک عدد صحیح برابر بیشترین تعداد تیم کامل را چاپ کنید.
در نمونهی اول تیمبندی میتواند به صورت زیر باشد:
در نمونهی دوم تیمبندی میتواند به صورت زیر باشد:
در نمونهی سوم سه نفری وجود ندارد که بتوانند تیم تشکیل بدهند.
کد شما باید روی PostgreSQL قابل اجرا باشد.
دیتابیسی که در این سوال به آن میپردازیم، متشکل از اطلاعات تعدادی کاربر، شرکت و محصولات شرکتها خواهد بود.
دادههای اولیه را از این لینک دانلود کنید.
از نصب بودن PostgreSQL روی سیستم خود اطمینان حاصل کنید.
برای ایمپورت کردن دادههای اولیه میتوانید از یکی از دو روش زیر اقدام کنید:
۱- با استفاده CLI دستور زیر را وارد کنید تا دادههای اولیه ایمپورت شوند:
که در این دستور مسیر فایل initial.sql
را به صورت مطلق یا نسبی میتوانید آدرسدهی کنید.
۲- اگر GUI را ترجیح میدهید، پس از نصب دیتاگریپ و اتصال به PostgreSQL با یوزر postgres
، باید روی دیتاسورس و کانکشن postgres
راستکلیک کنید و از منوی SQL Scripts
، گزینهی Run SQL Script
را انتخاب کنید. سپس فایل initial.sql
را پیدا و تایید کنید. در انتها روی Run
کلیک کنید تا اسکریپت اجرا شود و دادهها وارد دیتابیس شوند.
address
(آدرسها)🔗این جدول اطلاعات مربوط به آدرسها را ذخیره میکند.
نام ستون | نوع داده | توضیحات |
---|---|---|
id |
integer |
شناسهی یکتا برای آدرس (کلید اصلی) |
city |
varchar(100) |
شهر |
country |
varchar(100) |
کشور |
country_code |
varchar(100) |
کد کشور |
zip_code |
integer |
کد پستی |
company
(شرکتها)🔗این جدول اطلاعات مربوط به شرکتها را ذخیره میکند.
نام ستون | نوع داده | توضیحات |
---|---|---|
id |
integer |
شناسهی یکتا برای شرکت (کلید اصلی) |
name |
varchar(100) |
نام شرکت |
address_id |
bigint |
شناسهی آدرس مرتبط (کلید خارجی به جدول address ) |
product
(محصولات)🔗این جدول اطلاعات مربوط به محصولات را ذخیره میکند.
نام ستون | نوع داده | توضیحات |
---|---|---|
id |
integer |
شناسهی یکتا برای محصول (کلید اصلی) |
name |
varchar(100) |
نام محصول |
category |
varchar(100) |
دستهبندی محصول |
price |
integer |
قیمت محصول |
product_company
(شرکت-محصول)🔗این جدول یک رابطهی چند به چند بین شرکتها و محصولات ایجاد میکند.
نام ستون | نوع داده | توضیحات |
---|---|---|
id |
integer |
شناسهی یکتا برای رابطه (کلید اصلی) |
company_id |
bigint |
شناسهی شرکت (کلید خارجی به جدول company ) |
product_id |
bigint |
شناسهی محصول (کلید خارجی به جدول product ) |
user
(کاربران)🔗این جدول اطلاعات مربوط به کاربران را ذخیره میکند.
نام ستون | نوع داده | توضیحات |
---|---|---|
id |
integer |
شناسهی یکتا برای کاربر (کلید اصلی) |
first_name |
text |
نام کاربر |
last_name |
text |
نام خانوادگی کاربر |
email |
text |
ایمیل کاربر |
address_id |
integer |
شناسهی آدرس مرتبط (کلید خارجی به جدول address ) |
company_id |
integer |
شناسهی شرکت مرتبط (کلید خارجی به جدول company ) |
username |
text |
نام کاربری |
این جداول دارای روابطی هستند که به کمک کلیدهای خارجی بین جداول ایجاد شدهاند. برای مثال، هر شرکت میتواند یک آدرس داشته باشد و هر کاربر نیز میتواند یک شرکت و یک آدرس داشته باشد.
کوئریهایی بنویسید که خروجیهای مطلوب زیر را بهدست آورد (توجه کنید که هر کوئری نمرهای جداگانه دارد و اگر کوئری قسمتی را نتوانستید بنویسید، کوئریهایی که حل کردید را بفرستید و کوئری آن قسمت را خالی بگذارید):
first_name
) آنها با حرف s و فامیلی (last_name
) آنها با حرف e تمام میشود. کوچک یا بزرگ بودن حروف مهم نیست و رکوردها باید براساس آیدی به صورت صعودی مرتب شوند.ساختار نتیجهی کوئری و سطر اول آن، به شکل زیر است:
id | first_name | last_name | username |
---|---|---|---|
6916 | Sarah | George | patrick32 |
ساختار نتیجهی کوئری و سطر اول آن، به شکل زیر است:
company_name | product_list |
---|---|
Movies | {Hair Care Component,Fitness Equipment,Home Improvement Rig,Truck Item,Furniture Whatchamacallit,Music Widget,Party Gear,Mens Device,Aquarium Instrument,Movie Paraphernalia,Camera Attachment,Skin Care Implement,Makeup Gadget,Party Gadget,Personal Implement,Swimming Rig,Gardening Mechanism,Nutrition Component,Book Machine,Party Mechanism} |
user_address
به صورت روبرو است: Country, City, Zip Code
ساختار نتیجهی کوئری و سه سطر اول خروجی به شکل زیر است:
username | user_address |
---|---|
markbaker | Moenstead, Palestine, 4972 |
garciaamy | Murphyton, French Guiana, 5765 |
jonesandrea | Bauchland, Panama, 8125 |
expensive
و اگر قیمت آن از میانگین کل محصولات کمتر بود not expensive
قرار میگیرد.سه سطر ابتدایی خروجی به شکل زیر خواهد بود:
product_name | product_price | product_category | company_name | company_city | price_comparison |
---|---|---|---|---|---|
Bedding Attachment | 14 | Home | Shoes | Corkeryland | not expensive |
Dining Contraption | 112 | Home | Grocery | Hartford | expensive |
Truck Kit | 27 | Automotive | Tools | North Burley | not expensive |
پس از پیادهسازی کوئریها، آن را در فایل queries.sql
، وارد کرده و سپس این فایل را آپلود کنید. کد شما باید به صورت زیر
باشد:
برای این سوال، نسخهی داتنت شما باید ۷ باشد.
شما به قبل سال 2000
برگشتهاید، زمانی که فناوری دیتابیسها به تازگی در حال ظهور است و مهندسان در تلاشند تا راهحلهای نوآورانهای برای جستجوی اطلاعات پیدا کنند. بسیاری از آنها از ایدههای جدید شگفتزده شده و دنیای فناوری اطلاعات در آستانهی تغییرات شگرفی است.
شما که از آینده خبر دارید، تصمیم گرفتهاید سیستم ابتدایی Full-Text Search
را پیادهسازی کنید. با این اختراع، شما نه تنها دنیای جستجو را متحول میکنید بلکه تاریخ را نیز تحت تأثیر قرار خواهید داد و این اختراع را به نام خود ثبت خواهید کرد.
پروژهی اولیه را از این لینک دانلود کنید. ساختار فایلهای پروژه بهصورت زیر است:
شما باید سه کلاس Document
، Index
و Query
را مطابق با مواردی که در ادامه مطرح میشود، کامل کنید.
Document
🔗اولین کلاسی که باید تکمیل کنید کلاس Document
است. این کلاس بدنه اصلی داکیومنتهای شما را برای اندیس مشخص میکند و باید شامل ویژگیهای(property) زیر باشد:
نام | نوع |
---|---|
Id | long |
Text | string |
Date | DateTime |
Query
🔗این کلاس شامل ویژگیهای کوئری است که قصد دارید طبق این ویژگیها داکیومنتهایی را از درون اندیس بازیابی کنید. این کلاس شامل ویژگیهای زیر میشود:
نام | نوع |
---|---|
Text | string |
Date | DateTime |
EndDate | DateTime |
Index
🔗این کلاس اصلیترین کلاسی است که باید پیادهسازی کنید. این کلاس شامل داکیومنتها و اندیسها میشود. اندیسهای این کلاس در واقعا اندیسهای معکوس (Inverted index) به هر داکیومنت هستند.
همانطور که میبینید، دو اندیس textIndex
و dateIndex
وجود دارند که نحوه ساخت این اندیسها در ادامه آورده شده است. مطابق این فایل، شما در این کلاس باید یک کانستراکتور و سه متد که در ادامه جزئیات آنها ذکر میشود را پیادهسازی نمایید:
کانستراکتور Index
: این کانستراکتور فایلی که در مسیر ورودی دریافت کرده را به صورت متن خوانده و اندیسهای گفته شده را باید به درستی مقداردهی کند.
متد saveIndexToFile
: این متد یک مسیر را دریافت و کل کلاس Index
را با تمام مقادیرش به صورت متن در این مسیر ذخیره میکند.
متد indexDocument
: این متد یک داکیومنت را دریافت میکند و اندیسهای گفته شده را به صورت زیر ایجاد میکند:
textIndex
باید ویژگی text
هر داکیومنت براساس کاراکترهای غیر کلمهای (حرف، رقم یا _
) شکسته شود و داکیومنتها اندیس شوند. dateIndex
هر داکیومنت براساس ویژگی date
خودش اندیس میشود.متد search
: این متد وظیفه دارد تا داکیومنتهایی را براساس کوئری ورودی برگرداند. هر کدام از ویژگیهای کلاس Query
میتواند نال باشند ولی در صورتی که هر کدام از مقادیر نال نبود باید داکیومنتهایی براساس اولویت زیر برگردانده شوند:
مثالهایی به صورت تست نمونه در اختیار شما قرار داده شده است که میتوانید از آنها کمک بگیرید. به عنوان مثال به مورد زیر دقت کنید:
خروجی مثال بالا باید داکیومنتها با آیدی 1
و 2
را برگرداند.
Document
و Query
باید شامل کانستراکتوری با همه ویژگیها باشند.پس از پیادهسازی موارد خواستهشده، فقط این سه کلاس را زیپ کرده و آپلود کنید.
شما مسئول توسعه یک سیستم بانکی ساده تحت وب هستید که شامل چندین قابلیت (Functionality) است. هدف اصلی شما ایجاد و پیادهسازی این قابلیت هاست که در ادامه توضیح داده خواهند شد. همچنین یک پروژه اولیه به شما داده شد است که باید تغییرات خود را بر روی آن اعمال نمایید. پروژه اولیه را از این لینک دانلود کنید.
در این سیستم، شما چندین مدل مختلف دارید که برای مدیریت و نمایش اطلاعات بانکی استفاده میشوند. مدلهای اصلی شامل موارد زیر هستند:
اطلاعات مربوط به مدل ها را می توانید در بخش توضیحات ساختار دیتابیس مطالعه بفرمایید
این سیستم بانکی شامل چندین قابلیت اصلی است که به کاربران امکان میدهد تا به اطلاعات حساب خود دسترسی پیدا کرده و تراکنشهای مختلفی را انجام دهند. هر یک از این قابلیتها از طریق APIهای مخصوص خود باید انجام شوند.
واحد پولی این سیستم تومان است
سیستم شما باید قادر باشد اطلاعات یک حساب بانکی را نمایش دهد. کاربر با ارائه کد حساب، انتظار دارد اطلاعات مربوط به حساب مورد نظر را دریافت کند.
با استفاده از این قابلیت، امکان انتقال پول از یک حساب مبدا به یک حساب مقصد فراهم می شود. این انتقال باید دارای شرایط زیر باشد:
شماره شبا در ایران شامل پیشوند IR و سپس 24 رقم است (مانند: IR300564661822065022536289).
این قابلیت لیستی از تراکنشهای انجام شده هر حساب را بصورت مرتب شده نزولی بر اساس زمان تراکنش نمایش می دهد. اطلاعات شامل کد تراکنش، مبلغ تراکنش، تاریخ، موجودی بعد از تراکنش، شماره شبای بر روی تراکنش، و نوع تراکنش (واریز یا برداشت) میباشد.
جدول Accounts
:
عنوان | نوع | توضیحات |
---|---|---|
Number | TEXT (string) |
شماره حساب منحصر به فرد هر کاربر |
Sheba | TEXT (string) |
شماره شبا مرتبط با حساب که منحصر به فرد است |
FirstName | TEXT (string) |
نام صاحب حساب |
LastName | TEXT (string) |
نام خانوادگی صاحب حساب |
Balance | REAL (decimal) |
موجودی حساب |
CreationDate | TEXT (DateTime) |
تاریخ ایجاد حساب |
جدول Transactions
:
عنوان | نوع | توضیحات |
---|---|---|
Id | INTEGER (int) |
شناسه منحصر به فرد هر تراکنش |
Amount | REAL (decimal) |
مبلغ تراکنش |
Code | TEXT (string) |
کد منحصر به فرد تراکنش های مرتبط |
Date | TEXT (string) |
تاریخ انجام تراکنش |
PostBalance | REAL (decimal) |
موجودی حساب بعد از انجام تراکنش |
BaseAccountNumber | TEXT (string) |
شماره حساب مبدا تراکنش |
SubAccountNumber | TEXT (string) |
شماره حساب مقصد تراکنش |
Type | TEXT (TransactionType) |
نوع تراکنش (واریز یا برداشت) |
به صورت پیشفرض کاربران زیر در دیتابیس تعریف کنید؛ تا برای تست عملکرد برنامه از آنها استفاده کنید.
فرد اول:
فرد دوم:
پاسخ ارسالی شما باید یک فایل zip به همان فرمت پروژه اولیه باشد. در نظر بگیرید که فایل zip شما باید این ساختار فایل را داشته باشد.
در نظر داشته باشید که حتما برای دیتابیس بعد از کانفیگ کردن مدل های خود یک Migration اضافه کنید.
/Data/Migrations
قرار گیرد.