از دات‌نت به گولنگ


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

شرکت همکاران سیستم قصد دارد برنامه‌های خود را از.NET به Golang تغییر دهد. به همین منظور اخیراً با سندی مواجه شده که پر از رشته‌های .NET‌است و باید همه‌ی آن‌ها را به Golang تغییر دهند. برای همین از شما می‌خواهند برنامه‌ای بنویسید که این کار را انجام دهد.

گولنگ

به طور دقیق‌تر، رشته‌ای از کاراکترها به شما داده می‌شود و باید تمام زیررشته‌های متوالی .NET در آن را به Golang تغییر دهید. برای درک بهتر به مثال‌ها توجه کنید.

ورودی🔗

در تنها سطر ورودی، رشته‌ی ss شامل حروف بزرگ و کوچک انگلیسی و کاراکترهای .، ? و ! است.

1s1001 \leq |s| \leq 100

خروجی🔗

در یک سطر، رشته‌ی تغییر یافته را چاپ کنید.

توجه کنید که سیستم داوری به بزرگ و کوچک بودن حروف حساس است.

مثال‌ها🔗

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

WeDevelope.NETHere!
Plain text

خروجی نمونه ۱🔗

WeDevelopeGolangHere!
Plain text

رشته‌ی WeDevelope.NETHere! دارای یک زیرشته‌ی .NET و باید آن را به Golang تغییر دهیم، بنابراین خروجی به صورت WeDevelopeGolangHere!است.

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

WeLove.NETandWeUse.NETinHamkaran.
Plain text

خروجی نمونه ۲🔗

WeLoveGolangandWeUseGolanginHamkaran.
Plain text

رشته‌ی WeLove.NETandWeUse.NETinHamkaran. دارای دو زیرشته‌ی .NET و باید آن‌ها را به Golang تغییر دهیم، بنابراین خروجی به صورت WeLoveGolangandWeUseGolanginHamkaran.است.

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

.NET.ne.net.NeTNET.NNET
Plain text

خروجی نمونه ۳🔗

Golang.ne.net.NeTNET.NNET
Plain text

رشته‌ی .NET.ne.net.NeTNET.NNET دارای یک زیرشته‌ی .NET و باید آن را به Golang تغییر دهیم، بنابراین خروجی به صورت Golang.ne.net.NeTNET.NNETاست.

اشتباهات متداول
چک کردن شرایط ورودی مسئله

نیازی نیست چک کنید شرایط گفته شده در ورودی برقرار است یا نه. توضیحات محدودیت‌ها فقط برای آگاهی شما درباره‌ی تست‌ها و محدودیت‌های مسئله است و قطعاً در ورودی‌های داده شده به برنامه‌ی شما رعایت می‌شوند. پس نیازی نیست بنویسید:

if 1 <= n <= 100:
    # answer of problem
else:
    # print('invalid input')
Python
ابتدا همه‌ی ورودی را گرفتن و در نهایت همه‌ی خروجی را چاپ کردن

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

چاپ کردن موارد اضافه برای دریافت ورودی

لطفاً از چاپ کردن موارد اضافه مثل please enter a number برای دریافت ورودی پرهیز کنید. برای مثال در زبان پایتون نباید بنویسید:

input('please enter:')
Python
چند فایلی کد زدن

برای زبان‌هایی مثل جاوا نباید در بالای کد شما آدرس پکیج داده شود. برای مثال در بالای کد خود نباید بنویسید:

package ir.quera.contest;
Java
استفاده از چند Scanner برای دریافت ورودی

در زبان جاوا، باید فقط یک شئ از جنس Scanner تعریف کنید و همه‌ی ورودی‌ها را با آن دریافت کنید.

نحوه‌ی دریافت ورودی و چاپ کردن خروجی

برای آشنایی بیشتر برای نحوه‌ی دریافت ورودی و چاپ کردن خروجی این لینک را مطالعه کنید.

دزد و پلیس در فانو


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

نقشه‌ی کشور فانو مانند شکل زیر است. این کشور از ۷ شهر با شماره‌های ۱‍ تا ۷ تشکیل شده است. بین این شهرها تعدادی جاده مستقیم و دو طرفه وجود دارد.

در یک روز متوجه می‌شویم که دزدی در شهر rr وجود دارد و پلیس این کشور در شهر cc مشغول خدمت رسانی است. بازی دزد و پلیس شروع می‌شود.

نقشه کشور فانو

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

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

فرض کنید هر دوی دزد و پلیس هوشمندانه‌ترین حرکت ممکن را انجام می‌دهند. یعنی دزد به شهری می‌رود که در دیرترین زمان ممکن دستگیر شود و پلیس به شهری می‌رود که در زودترین زمان ممکن دزد را دستگیر کند. پلیس و دزد همیشه جای یکدیگر را می‌دانند.

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

ورودی🔗

در سطر اول ورودی، عدد صحیح cc آمده که شماره‌ی شهری که پلیس در آن قرار دارد را نشان می‌دهد. در سطر دوم ورودی، عدد صحیح rr آمده که شماره‌ی شهری که دزد در آن قرار دارد را نشان می‌دهد.

1rc71 \leq r \neq c \leq 7

خروجی🔗

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

مثال‌ها🔗

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

2
6
Plain text

خروجی نمونه ۱🔗

1
Plain text

توضیح نمونه ۱

در این نمونه، پلیس روز اول، از شهر ۲ وارد شهر ۶ می‌شود و دزد را دستگیر می‌کند.

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

7
1
Plain text

خروجی نمونه ۲🔗

2
Plain text

توضیح نمونه ۲

در این نمونه، پلیس روز اول، از شهر ۷ وارد شهر ۴ می‌شود. شب اول دزد به یکی از شهرهای ۲ یا ۳ می‌رود و در هر کدام از این شهرها که باشد، پلیس روز دوم آن را دستگیر می‌کند.

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

4
7
Plain text

خروجی نمونه ۳🔗

1
Plain text

توضیح نمونه ۳

در این نمونه، پلیس روز اول، از شهر ۴ وارد شهر ۷ می‌شود و دزد را دستگیر می‌کند.

ترتیب در گولنگستان


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

در زبان برنامه‌نویسی گولنگستان متغیرها حافظه‌های ۱، ۲، ۳ یا ۴ بایتی دارند. وقتی یک شئ با nn متغیر به حجم‌های s1,s2,,sns_1, s_2, \dots, s_n\, تعریف می‌کنیم. حافظه‌ها با قاعده‌ی زیر در بسته‌های ۴ بایتی، پشت سرهم قرار می‌گیرند.

متغیرها را به ترتیب اضافه می‌کنیم. اگر متغیری که نوبت اضافه شدن آن است، به انتهای بسته‌ی قبلی می‌تواند اضافه شود، آن را اضافه می‌کنیم و به سراغ متغیر بعدی (در صورت وجود) می‌رویم. اما اگر این متغیر نمی‌تواند به انتهای بسته‌ی آخر اضافه شود، همه‌ی فضای خالی آن را رها می‌کنیم و آن بسته را می‌بندیم (اصطلاحاً به این حافظه‌های تلف شده padding space می‌گویند). سپس در یک بسته‌ی ۴ بایتی جدید، حافظه مورد نیاز متغیر بعدی را به بایت‌های اول آن اختصاص می‌دهیم.

برای مثال فرض کنید n=3n = 3 متغیر داشته باشیم: s1=1s_1 = 1، s2=4s_2 = 4 و s3=1s_3 = 1. در این صورت متغیر s1s_1 در ابتدای یک بسته قرار می‌گیرد، چون متغیر s2s_2 را نمی‌توان به همان بسته اضافه کرد، پس ۳ بایت باقی‌مانده‌ی بسته‌ی اول را padding space در نظر می‌گیریم. سپس متغیر s2s_2 را در یک بسته‌ی جدید قرار داده و در نهایت s3s_3 را در بایت اول یک بسته قرار می‌دهیم. (در آخرین بسته padding space نداریم.)

به این ترتیب وضعیت نوار حافظه به صورت زیر خواهد بود و در مجموع ۳ حافظه تلف شده خواهیم داشت.

حالت اول

حال می‌دانیم اگر ترتیب این سه متغیر را به این صورت که s1=4s_1 = 4، s2=1s_2 = 1 و s3=1s_3 = 1 عوض می‌کردیم. وضعیت نوار حافظه به این صورت تغییر می‌کرد و هیچ حافظه‌ای تلف نمی‌شود.

حالت دوم

حال به شما ترتیب اولیه حافظه متغیرها داده می‌شود از شما می‌خواهیم ترتیب آن‌ها را طوری تغییر دهید که حافظه‌های تلف شده (padding space) کمینه شود و در نهایت این کمینه مقدار را چاپ کنید.

ورودی🔗

در سطر اول ورودی، عدد صحیح و مثبت tt آمده که تعداد سناریوها را نشان می‌دهد.

1t10001 \leq t \leq 1000

در سطر اول هر سناریو، عدد صحیح nn که نشان دهنده‌ی تعداد متغیرها است داده می‌شود.

1n1001 \leq n \leq 100

در سطر دوم هر سناریو، nn عدد صحیح که مقدار حافظه‌ی متغیرها یعنی s1,s2,,sns_1, s_2, \dots, s_n\, را نشان می‌دهد.

1si41 \leq s_i \leq 4

خروجی🔗

در tt سطر برای هر سناریو، کمینه حافظه‌ی تلف شده (padding space) در بین تمام ترتیب‌های مختلف برای متغیرها را چاپ کنید.

مثال‌ها🔗

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

4
3
1 4 1
4
4 2 3 4
1
1
5
3 3 3 3 3
Plain text

خروجی نمونه ۱🔗

0
1
0
4
Plain text

سناریو اول در صورت سوال توضیح داده شده.

یک نمونه از ترتیب بهینه، برای سناریو دوم، با ۱ حافظه تلف شده، به صورت زیر است:

توضیح نمونه ۲

تنها ترتیب ممکن، برای سناریو سوم، با ۰ حافظه‌ی تلف شده، به صورت زیر است:

توضیح نمونه ۳

تنها ترتیب ممکن، برای سناریو چهارم، با ۴ حافظه‌ی تلف شده، به صورت زیر است:

توضیح نمونه ۴

آرایه گم‌شده


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

علی همیشه آرایه‌هایش را گم می‌کند. به همین منظور از روی آرایه‌ها برای خودش یک آرایه‌ی دیگر می‌سازد. به طور دقیق‌تر آرایه‌ای از اعداد صحیح مثل a1,a2,,ana_1, a_2, \dots, a_n\, را در نظر بگیرید. از روی آن آرایه‌ی b1,b2,,bnb_1, b_2, \dots, b_n\, را می‌سازد. به این صورت که برای هر ii از ۱ تا nn مقدار bib_i از رابطه‌ی زیر بدست می‌آید.

bi=max{a1,,ai}+min{a1,,ai}b_i = \max\{a_1, …, a_i\} + \min\{a_1, …, a_i\}

حال علی پیش از اینکه دنبال آرایه‌ی a1,a2,,ana_1, a_2, \dots, a_n\, بگردد، می‌خواهد از روی آرایه‌ی b1,b2,,bnb_1, b_2, \dots, b_n\, بررسی کند چند حالت برای آرایه‌ی اولیه وجود دارد.

به علی کمک کنید تا این تعداد را پیدا کند. چون ممکن است پاسخ مسئله خیلی بزرگ شود، باقی‌مانده این مقدار را به پیمانه‌ی 109+710^9 + 7 چاپ کنید.

ورودی🔗

در سطر اول ورودی، عدد صحیح و مثبت nn داده می‌شود. 1n1000001 \leq n \leq 100 \, 000

در سطر دوم ورودی، nn عدد صحیح b1,b2,,bnb_1, b_2, \dots, b_n\, با فاصله از هم داده می‌شود. 1bi1091 \leq b_i \leq 10^9

خروجی🔗

در تنها سطر خروجی، باقی‌مانده‌ی تعداد حالت‌های ممکن برای دنباله‌ی aa را به پیمانه‌ی 109+710^9 + 7 چاپ کنید.

مثال‌ها🔗

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

5
2 5 5 3 8
Plain text

خروجی نمونه ۱🔗

4
Plain text

برای مثال اگر آرایه‌ی aa برابر 1,4,2,1,9,\langle 1, 4, 2, -1, 9 \rangle, باشد، دنباله‌ی bbی داده شده، بدست می‌آید (۳ آرایه‌ی اولیه دیگر نیز وجود دارد).

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

4
2 1 2 1
Plain text

خروجی نمونه ۲🔗

1
Plain text

آرایه‌ی aa فقط می‌تواند 1,0,2,1\langle 1, 0, 2, -1 \rangle باشد.

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

1
1403
Plain text

خروجی نمونه ۳🔗

0
Plain text

هیچ آرایه‌ی aa با یک عنصر وجود ندارد.

معادله تخریب شده


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

امین یک معادله ساده به فرم A+B=CA + B = C روی تخته نوشته بود. یک روز مهلا تصمیم می‌گیرد کاراکترهای + و = را پاک کند و سه قسمت AA، BB و CC را بهم بچسباند. حالا امین به سراغ تخته می‌آید و می‌خواهد از روی این رشته‌ی ارقام معادله را بازسازی کند.

در واقع امین با یک رشته nn رقمی از ارقام ۱ تا ۹ مواجه است و می‌خواهد این رشته را به سه بازه‌ی متوالی AA، BB و CC تقسیم کنیم به طوری که معادله‌ی A+B=CA + B = C برقرار باشد. او از شما می‌خواهد بررسی کنید آیا انجام چنین افرازی ممکن است یا نه.

ورودی🔗

در سطر اول ورودی، عدد صحیح و مثبت tt که تعداد سناریوها را نشان می‌دهد، داده می‌شود.

1t1000001 \leq t \leq 100 \, 000

در سطر اول هر سناریو، عدد صحیح و مثبت nn آمده که طول رشته را نشان می‌دهد.

1n5000001 \leq n \leq 500 \, 000

در سطر دوم هر سناریو، یک رشته از ارقام 1 تا 9 به نام ss داده می‌شود.

تضمین می‌شود که n1000000\sum n \leq 1000\,000 باشد.

خروجی🔗

در tt سطر برای هر سناریو، در صورتی که می‌توان چنین تقسیمی انجام داده YES و در غیر این صورت NO چاپ کنید.

مثال‌ها🔗

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

3
3
123
6
123456
11
14323242467
Plain text

خروجی نمونه ۱🔗

YES
NO
YES
Plain text

معادله‌ی سناریو اول به صورت 1+2=31 + 2 = 3 بوده است. بنابراین پاسخ YES می‌شود.

معادله‌ای برای سناریو دوم وجود ندارد

معادله‌ی سناریو سوم به صورت 143+2324=2467143 + 2324 = 2467 بوده است. بنابراین پاسخ YES می‌شود.

المپیکیوس


کد شما باید روی PostgreSQL قابل اجرا باشد.


در این سوال، دیتاست مربوط به ورزشکاران و مربیان المپیک ۲۰۱۶ در اختیار شما قرار گرفته است.

جزئیات پایگاه‌داده🔗

داده‌های اولیه را از این لینک دانلود کنید.

ایمپورت کردن داده‌های اولیه

از نصب بودن PostgreSQL روی سیستم خود اطمینان حاصل کنید.

سپس برای ایمپورت کردن داده‌های اولیه می‌توانید از یکی از دو روش زیر اقدام کنید:

۱- با استفاده CLI به راحتی دستور زیر را وارد کنید تا داده‌های اولیه ایمپورت شوند:

psql -U postgres -f /path/to/initial.sql
Shell

که در این دستور مسیر فایل initial.sql را به صورت مطلق یا نسبی می‌توانید آدرس‌دهی کنید.

۲- اگر GUI را ترجیح می‌دهید. پس از نصب دیتاگریپ و اتصال به PostgreSQL با یوزر postgres، باید روی دیتاسورس و کانکشن postgres راست کلیک کنید و از منوی SQL Scripts گزینه Run SQL Script را انتخاب کنید. سپس فایل initial.sql را پیدا و تایید کنید. در انتها روی Run کلیک کنید تا اسکریپت اجرا شود و داده‌ها وارد دیتابیس quera شوند.

توضیحات جداول دیتاست

این دیتاست شامل اطلاعات و نتایج حدود یازده هزار ورزشکار و مربیان آن‌ها در المپیک ریو است و ساختار جدول athletes مربوط به این دیتاست به‌صورت زیر است:

نام ستون نوع تعریف
id integer شناسه‌ی منحصر به فرد ورزشکار
name character varying(255) نام
sex character(1) جنسیت ورزشکار ('M' یا 'F')
weight double precision وزن
team character varying(255) تیم یا کشور
sport character varying(255) ورزش برای مثال کشتی یا Wrestling
event character varying(255) منظور از رویداد عنوان دقیق رشته ورزشی است. برای مثال کشتی آزاد سنگین‌وزن مردان یا Wrestling Men's Heavyweight, Freestyle
medal character varying(10) مدالی که ورزشکار کسب کرده (Gold، Silver، Bronze، یا NULL اگر مدالی نگرفته)

و ساختار جدول coaches به شکل زیر است:

نام ستون نوع تعریف
id integer شناسه‌ی منحصر به فرد مربی (کلید اصلی)
name character varying(255) نام مربی
athlete_id integer شناسه‌ی ورزشکار مرتبط (کلید خارجی به ستون id از جدول ورزشکاران)

مطلوبات🔗

کوئری‌هایی بنویسید که خروجی‌های مطلوب زیر را به‌دست آورد (توجه کنید که هر کوئری نمره‌ای جداگانه دارد و اگر کوئری یک قسمت را نتوانستید بنویسید، کوئری‌هایی که حل کردید را بفرستید و کوئری آن قسمت را خالی بگذارید):

  1. نام و تعداد مدال‌های سه ورزش برتر ایران، که در المپیک بیشترین مدال را آورده‌اند، به ترتیب نزولی ستون تعداد مدال بیابید.
توضیحات مربوط به کوئری اول

نام ستون تعداد مدال‌ها باید medal_count باشد و مقدار ستون team این ورزشکاران برابر با Iran است:

sport medal_count
  1. نام و نوع مدالِ مدال‌آوران ایرانی حاضر در المپیک ۲۰۱۶ را به ترتیب مرغوبیت مدال و سپس صعودی نام به دست آورید.
توضیحات مربوط به کوئری دوم

منظور از مرغوبیت مدال یعنی در ابتدا سطرهای شامل مدال طلا،‌ سپس نقره و در نهایت برنز در نتیجه ظاهر شوند. مقدار ستون team این ورزشکاران برابر با Iran است. در جدول زیر چون هر دو طلا گرفته‌اند بر اساس نام مرتب شده‌اند.

name medal
1 Hassan Aliazam Yazdanicharati Gold
2 Kianoush Rostami Gold

در جدول بالا اولین ستون از سمت چپ نمایان‌گر شماره ستون در نتایج مورد انتظار است و نیازی به نمایش آن نیست.

  1. نام ده مربی، تیم‌ مربوطه، مجموع تعداد مدال‌های طلا، نقره و برنز و همچنین مجموع امتیازی که ورزشکاران تحت هدایت آن مربی توانسته‌اند در کشتی مردان به دست آورند را در ابتدا به ترتیب نزولی مجموع امتیاز و در صورت برابر بودن به ترتیب صعودی نام مربی به دست آورید.
توضیحات مربوط به کوئری سوم

فرمول مجموع امتیازات به این شکل است که اگر ورزشکار تحت هدایت مربی موفق به کسب مدال طلا شده باشد ۲۵ امتیاز، نقره ۲۰ و برنز ۱۵ امتیاز به آن مربی تعلق پیدا خواهد کرد. در جدول زیر نمونه‌ای از خروجی مطلوب را مشاهده می‌کنید:

coach_name team gold_medal silver_medal bronze_medal total_point
1 Saypulla Absaidov Azerbaijan 0 2 3 85
... ... ... ... ... ... ...
10 Mohammad Bana Iran 0 0 2 30

در جدول بالا اولین ستون از سمت چپ نمایان‌گر شماره ستون در نتایج مورد انتظار است و نیازی به نمایش آن نیست.

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

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

نمونه خروجی مورد انتظار:

team female_medalists male_medalists female_to_male_ratio
1 United States 95 71 1.34
2 Russia 60 22 2.73
... ... ... ... ...
21 Bulgaria 7 0 <null>
... ... ... ... ...

در جدول بالا اولین ستون از سمت چپ نمایان‌گر شماره ستون در نتایج مورد انتظار است و نیازی به نمایش آن نیست.

نکته: برای حل کامل سوال و دریافت امتیاز کوئری‌ها حتما توضیحات مربوط به هر کوئری را مطالعه بفرمایید.

آن‌چه باید آپلود کنید🔗

پس از پیاده‌سازی کوئری‌ها، آن را در قالب یک فایل با پسوند .sql آپلود کنید. کوئری‌های شما باید به صورت زیر باشد و هیچ گونه تغییری در کامنت‌ها ندهید.

-- Section1
   Your first query here
-- Section2
   Your second query here
-- Section3
   Your third query here
-- Section4
   Your fourth query here
SQL