- محدودیت زمان: ۱ ثانیه
- محدودیت حافظه: ۲۵۶ مگابایت
تیمور عاشق بازی کانتر و شبانه روز مشغول بازی است! برای همین میخواهد حالت خاصی از بازی کانتر (Counter-Strike) را پیاده سازی کند. برای آخرین بار به تیمور کمک کنید تا از این چالش هم عبور کند.
بازی کانتر یک بازی تفنگی اول شخص است، در این بازی ۲ تیم با حداکثر ۱۰ نفر وجود دارد. یک تیم «تروریست» (Terrorist) و یک تیم «ضدتروریست»(Counter-Terrorist) است. بازی $R$ «دست» دارد و در هر دست این دو تیم به سمت هم تیراندازی میکنند و میخواهند یکدیگر را نابود کنند. مدت هر «دست» از بازی ۰۲:۱۵:۰۰۰ (۲ دقیقه و ۱۵ ثانیه) است. اگر هیچ کدام از اعضای یک تیم در لحظه پایان یک دست زنده نباشد بازنده است. اگر مدت بازی تمام شود و از هر دو تیم بازیکنی زنده مانده باشد تیم «ضدتروریست» برنده این دست میشود. اگر در یک دست هیچ بازیکنی زنده نباشد (یا حتی هیچ بازیکنی وارد بازی نشده باشد!) تیم ضدتروریست برنده است.
اسلحههای این بازی
هر بازیکن میتواند حداکثر یک اسلحه از دسته «سنگین» و حداکثر یک اسلحه از دسته «کمری» بخرد، همچنین هر بازیکن به صورت پیشفرض یک «چاقو» دارد. خرید اسلحه فقط در ۴۵ ثانیه اول بازی ممکن است. به عبارت دیگر خریدهای بعد از لحظه 00:45:00
(شامل این لحظه) انجام نمیشود.
اسلحههای تیم تروریست
اسلحهی سنگین
اسم | قیمت | میزان کاهش جان | مقدار پول کشتن |
---|---|---|---|
AK | 2700 | 31 | 100 |
AWP | 4300 | 110 | 50 |
اسلحهی کمری
اسم | قیمت | میزان کاهش جان | مقدار پول کشتن |
---|---|---|---|
Revolver | 600 | 51 | 150 |
Glock-18 | 300 | 11 | 200 |
چاقو
این سلاح را همه دارند و قابل خریدن نیست، هر بار استفاده از آن باعث کاهش ۴۳ واحدی از جان بازیکن حریف میشود و اگر بازیکنی با این اسلحه کشته شود ۵۰۰ دلار به بازیکنی که ضربه را زده بلافاصله پول داده میشود.
اسلحههای تیم ضدتروریست
اسلحهی سنگین
اسم | قیمت | میزان کاهش جان | مقدار پول کشتن |
---|---|---|---|
M4A1 | 2700 | 29 | 100 |
AWP | 4300 | 110 | 50 |
اسلحهی کمری
اسم | قیمت | میزان کاهش جان | مقدار پول کشتن |
---|---|---|---|
Desert-Eagle | 600 | 53 | 175 |
UPS-S | 300 | 13 | 225 |
چاقو
این سلاح را همه دارند و قابل خریدن نیست، هر بار استفاده از آن باعث کاهش ۴۳ واحدی از جان بازیکن حریف میشود و اگر بازیکنی با این اسلحه کشته شود ۵۰۰ دلار به بازیکنی که ضربه را زده بلافاصله پول داده میشود.
جان بازیکنان و اهمیت آن
در ابتدای هر دست، هر کدام از بازیکنان ۱۰۰ واحد جان (health) دارند. (حتی اگر در دست قبل کشته شده باشند دوباره زنده میشوند.) در زمان بازی هر کدام از بازیکنان میتوانند به سمت هم شلیک کنند، در اثر هر شلیک بسته به تفنگی که با آن شلیک شده مقداری از جان بازیکنی که به آن شلیک شده، کاهش پیدا میکند. اگر جان کسی به ۰ برسد میمیرد و از بازی خارج میشود و دیگر توانایی انجام هیچ کاری ندارد. اگر یک بازیکن به هم تیمی خودش شلیک کند چیزی از جان آن کم نمیشود. هر بازیکن پس از کشتن هر بازیکن از تیم حریف، بسته به نوع سلاحش مقداری «پول» کسب میکند. کسی امتیاز کشتن را میگیرد که جان آن بازیکن را برای اولین بار به ۰ برساند. توجه کنید جان هیچ کسی منفی نمیشود. یعنی اگر میزان کاهش جان یک شلیک، بیشتر از مقدار فعلی جان بازیکن مورد هدف باشد، مقدار جان آن بازیکن ۰ میشود.
پول بازیکنان و کاربردهای آن
بازیکنها برای خریدن اسلحهها به پول (money) نیاز دارند. بلافاصله بعد از اضافه شدن هر بازیکن به بازی ۱۰۰۰ دلار به آن بازیکن داده میشود. (ممکن است بازیکنی وسط یک دست به بازی اضافه شود.) بعد از پایان هر دست از بازی به هر کدام از بازیکنان تیم برنده ۲۷۰۰ دلار و به هر کدام از بازیکن تیم بازنده ۲۴۰۰ دلار داده میشود. همچنین حداکثر مقدار پول یک بازیکن ۱۰,۰۰۰ دلار است. یعنی اگر مقدار پولی که به یک بازیکن اضافه میشود، باعث شود که پولهای آن بیشتر از ۱۰,۰۰۰ دلار شود، مقدار پول بازیکن را همان ۱۰,۰۰۰ دلار در نظر میگیریم.
زمانها در بازی
برای نشان دادن اتفاقات بازی در انتهای هر اتفاق یک برچسب زمان که به صورت یک رشته است چاپ میکنیم. فرمت این رشته به صورت mm:ss:ttt
است که زمان را در دقیقه mm
، ثانیه ss
و ttt
میلی ثانیه نشان میدهد. مثلاً 01:48:932
یعنی این اتفاق ۱ دقیقه و ۴۸ ثانیه و ۹۳۲ میلیثانیه بعد از شروع این دست از بازی است. تضمین میشود زمانهای هر دست طوری داده میشود که هیچ دو اتفاقی همزمان رخ ندهد. همچنین هیچوقت در لحظه شروع و پایان دست هیچ اتفاقی نمیافتد. در واقع همه زمانهای اتفاقات بین 00:00:001
و 02:14:999
است. تضمین میشود تمام اتفاقات به ترتیب زمان صعودی است.
یک دست از بازی
زمانهایی که در انتهای گزارش یک اتفاق است از زمان شروع آن دست است در نظرگرفته میشود نه زمان شروع اولین دست بازی. وقتی یک بازیکن بعد از ثانیه 00:03:00
(شامل این لحظه) در یک دست وارد بازی میشود به صورت مرده وارد میشود (اما این مردن جزو تعداد دفعات کشته شدن به حساب نمیآید.) یعنی جان این بازیکن ۰ و پول آن ۱۰۰۰ است و از دست بعدی میتواند فعالیت خود را شروع کند. توجه کنید حتی بازیکنی که از اواسط بازی وارد میشود پولی که بابت بردن یا باختن آن دست بدست میآورد را دریافت میکند. بازیکنان پولهای بدست آورده خود را از یک دست به دست بعدی منتقل میکنند. همه بازیکنها در شروع یک دست جان ۱۰۰ خواهند داشت. مستقل از اینکه در دست قبلی زنده ماندهاند یا کشته شده باشند. بازیکنان زنده اسلحههای خریداری شده خود را از یک دست به دست بعدی میبرند اما بازیکنان مرده اسلحههای خود (به جز چاقو) را در دست بعدی از دست میدهند.
از شما میخواهیم برنامهای بنویسید که با دریافت اطلاعات اتفاقات مختلف بازی، وضعیت بازی و امتیاز بازیکنها را مشخص کند.
بعد از تمام شدن هر دست نام تیم برنده را چاپ کنید. یعنی اگر تیم تروریست برنده این دست است کلمه Terrorist won
و اگر تیم ضدتروریست برنده این دست است کلمه Counter-Terrorist won
را چاپ کنید.
رهنمای خواندن دستورها
-
مواردی که داخل
<>
قرار داردند یعنی مقدار مناسبی به جای آنها قرار خواهد گرفت. -
مواردی که داخل
[]
با\
جدا میشوند یعنی دقیقاً یکی از این موارد در ورودی میآید. -
منظور از سایر موارد همان کلمات با همان کاراکترها است.
-
<username>
و<gun_name>
: همواره یک رشته به طول حداقل ۱ حداکثر ۲۰ از کاراکتر شامل حروف کوچک و بزرگ انگلیسی ارقام و یا_
و-
است. -
<time>
: فرمت این رشته به صورتmm:ss:ttt
است که زمان را در دقیقهmm
، ثانیهss
وttt
میلی ثانیه نشان میدهد.
توجه کنید سیستم داوری به کوچک و بزرگ بودن حروف حساس است.
فاز اول
پیاده سازی دستورات این بخش ۲۰ درصد نمره سوال را دریافت خواهید کرد.
دستور ADD-USER
ADD-USER
ADD-USER <username> [Counter-Terrorist/Terrorist] <time>
در این درخواست شخصی با نام <username>
در لحظه <time>
به یکی از تیمهای تروریست یا ضدتروریست ملحق میشود.
همواره بعد از <username>
دقیقاً یکی از رشتههای Terrorist
(تروریست) یا Counter-Terrorist
(ضدتروریست) میآید که به ترتیب نشاندهنده تیمای است که این بازیکن به آن ملحق میشود.
در صورتی که مشکلات زیر وجود داشته به ترتیب باید دقیقاً یکی از خطاهای زیر را چاپ کنید. اگر چند مورد باهم به وجود آمد موردی که شماره کمتری دارد باید انجام شود.
- اگر بازیکنی (در هر کدام از این دو تیم) با چنین نام کاربری قبلاً وارد بازی شده است پیام
you are already in this game
را چاپ کنید. - اگر ظرفیت تیمی که میخواهد این بازیکن به آن ملحق شود تکمیل است. یعنی در آن لحظه در تیم مورد نظر این بازیکن ۱۰ بازیکن قرار دارد، پیام
this team is full
را چاپ کنید. - در غیر این صورت این بازیکن را به تیم مورد نظر اضافه کنید و پیام
this user added to [Terrorist/Counter-Terrorist]
را چاپ کنید و در جای رشته آخر نام تیم را قرار دهید.
مثال ورودی از این دستور:
ADD-USER RaB1t Terrorist 00:17:415
ADD-USER madam Counter-Terrorist 01:03:618
دستور GET-MONEY
GET-MONEY
GET-MONEY <username> <time>
در این دستور از شما میخواهیم مقدار پول بازیکن <username>
را در لحظه <time>
چاپ کنید.
اگر بازیکنی با نام کاربری <username>
در این لحظه در بازی وجود ندارد پیام invalid username
را چاپ کنید.
مثال ورودی از این دستور:
GET-MONEY Cat 00:43:151
دستور GET-HEALTH
GET-HEALTH
GET-HEALTH <username> <time>
در این دستور از شما میخواهیم مقدار جان بازیکن <username>
را در لحظه <time>
چاپ کنید.
اگر بازیکنی با نام کاربری <username>
در این لحظه در بازی وجود ندارد پیام invalid username
را چاپ کنید. توجه کنید اگر این بازیکن مرده باشد مقدار جان آن ۰ است.
مثال ورودی از این دستور:
GET-HEALTH Rajab 00:59:301
فاز دوم
پیاده سازی دستورات این بخش ۶۰ درصد نمره سوال را دریافت خواهید کرد.
دستور TAP
TAP
TAP <attacker> <attacked> [heavy/pistol/knife] <time>
در این دستور اعلام میکنیم بازیکنی با نام کاربری <attacker>
به بازیکنی با نام کاربری <attacked>
با اسلحه heavy
یا pistol
یا knife
خود در لحظه <time>
ضربه میزند.
- اگر یکی از بازیکنهای
<attacker>
یا<attacked>
در این لحظه در بازی وجود ندارند پیامinvalid username
را چاپ کنید. - اگر
<attacker>
قبل از این لحظه کشته شده است، پیامattacker is dead
را چاپ کنید. - اگر
<attacked>
قبل از این لحظه (نه بخاطر این شلیک) کشته شده است، پیامattacked is dead
را چاپ کنید. - در صورتی که
<attacker>
اسلحهای با این نوع ندارد، پیامno such gun
را چاپ کنید. - اگر
<attacker>
و<attacked>
هر دو یک تیم هستند پیامfriendly fire
را چاپ کنید.
در غیر اینصورت شلیک را ثبت کنید و پیام nice shot
را چاپ کنید.
مثال ورودی از این دستور:
TAP RaB1t King2Krazy heavy 01:17:915
TAP A B knife 02:11:120
دستور BUY
BUY
BUY <username> <gun_name> <time>
در این دستور بازیکن <username>
درخواست خریدن تفنگ <gun_name>
را در لحظه <time>
دارد.
- اگر بازیکنی با نام
<username>
در بازی وجود ندارد پیامinvalid username
را چاپ کنید. - اگر بازیکن
<username>
زنده نیست پیامdeads can not buy
را چاپ کنید. - اگر
<time>
بعدز از لحظه00:45:00
(شامل این لحظه) این دستور آمده است پیامyou are out of time
را چاپ کنید. - اگر اسلحه
<gun_name>
در لیست اسلحههای مجاز تیم خرید کننده نیست پیامinvalid category gun
را چاپ کنید. - اگر اسلحهای از این دسته (سنگین
heavy
و کمریpistol
) قبلاً توسط این بازیکن خریداری شده است پیامyou have a [heavy/pistol]
را چاپ کنید. - اگر این بازیکن پول کافی برای خرید این اسلحه را ندارد پیام
no enough money
را چاپ کنید.
در صورتی که هیچکدام از اتفاقات فوق نیفتید پیام I hope you can use it
را چاپ کنید و اسلحه را برای این بازیکن ثبت کنید.
مثال ورودی از این دستور:
BUY Dog M4A1 00:27:014
فاز سوم
پیاده سازی دستورات این بخش ۲۰ درصد نمره سوال را دریافت خواهید کرد.
دستور SCORE-BOARD
SCORE-BOARD
SCORE-BOARD <time>
در این دستور از شما میخواهیم لیست بازیکنهای تیم ضدتروریست و تروریست را چاپ کنید.
برای هر بازیکن مشخصات آن بازیکن را در یک سطر چاپ میکنیم:
<rank> <username> <kills> <death>
که <username>
نامکاربری بازیکن، <kills>
تعداد بازیکنهایی است که در تمام دستهای بازی قبل از لحظه <time>
(شامل همین دست) توسط این بازیکن کشتهشده است. <killed>
تعداد دفعاتی است که این بازیکن در تمام دستها تا قبل از لحظه <time>
(شامل همین دست) توسط بازیکن دیگری کشتهشده است. <rank>
نشان دهنده شماره بازیکن است. یعنی برای بازیکنی که مشخصات آن دفعه اول چاپ میشود عدد ۱، بازیکن دوم عدد ۲ و ... . این شمارهگذاریها برای هر تیم جداست.
مشخصات بازیکنی زودتر چاپ میشود که تعداد <kills>
آن بیشتر باشد، اگر دو بازیکن تعداد <kills>
برابری داشته باشند مشخصات بازیکنی زودتر چاپ میشود که تعداد <killed>
کمتری دارد. اگر دو بازیکن در هر دوی این اعداد برابر بودند بازیکنی زودتر چاپ میشود که زودتر وارد بازی شده باشد.
برای چاپ کردن جدول امتیازات ابتدا عبارت :Counter-Terrorist-Players
را در یک خط چاپ کنید که نشاندهنده این است که میخواهیم بایکنان این تیم را بنویسیم. سپس مشخصات هر کدام از بازیکنان تیم ضدتروریست را مطابق توضیحات فوق در یک سطر چاپ میکنیم. سپس عبارت :Terrorist-Players
را در سطر بعدی چاپ میکنیم و در سطرهای بعدی مشخصات بازیکنان تیم ضدتروریست را چاپ میکنیم.
ورودی
در سطر اول ورودی عدد صحیح و مثبت $R$ آمده است. که نشاندهنده تعداد دستهایی است که در این ورودی آمده است.
$$1 \le R \le 15$$
برای نشان دادن شروع هر دست در یک سطر کلمه ROUND
میآید. سپس با یک فاصله عدد صحیح و نامنفی $n$ میآید که نشاندهنده تعداد دستوراتی است که در این دست اتفاق افتاده است. (توجه کنید مقدار $n$ میتواند برابر ۰ باشد اما حداقل یک دستور در کل بازی داریم.)
تضمین میشود تعداد دستورهای ورودی از ۲۰۰۰ بیشتر نخواهد شد.
برای بهتر متوجه شدن ورودیها به مثالهای نمونه توجه کنید.
خروجی
باید به ازای هر دستور آمده در ورودی خروجی متناظر آن را در یک سطر مجزا چاپ کنید. بعد از پایان هر دست برنده آن دست را چاپ کنید.
یعنی اگر تیم تروریست برنده این دست است عبارت Terrorist won
و در صورتی که تیم ضدتروریست برنده این دست است عبارت Counter-Terrorist won
را در یک سطر مجزا چاپ کنید.
مثال
ورودی نمونه ۱
3
ROUND 6
ADD-USER King2Krazy Counter-Terrorist 00:01:130
ADD-USER Cat Terrorist 00:02:314
GET-MONEY King2Krazy 00:04:411
GET-MONEY Cat 00:04:715
GET-HEALTH King2Krazy 00:05:004
GET-HEALTH Cat 00:14:000
ROUND 1
TAP King2Krazy Cat knife 00:15:741
ROUND 8
TAP King2Krazy Cat knife 00:13:000
TAP King2Krazy Cat knife 00:15:001
TAP King2Krazy Cat knife 00:16:023
GET-MONEY King2Krazy 01:04:411
GET-MONEY Cat 01:04:715
GET-HEALTH King2Krazy 01:05:004
GET-HEALTH Cat 01:14:051
SCORE-BOARD 01:17:200
خروجی نمونه ۱
this user added to Counter-Terrorist
this user added to Terrorist
1000
1000
100
100
Counter-Terrorist won
nice shot
Counter-Terrorist won
nice shot
nice shot
nice shot
6900
5800
100
0
Counter-Terrorist-Players:
1 King2Krazy 1 0
Terrorist-Players:
1 Cat 0 1
Counter-Terrorist won
ورودی نمونه ۲
1
ROUND 37
ADD-USER John-Wick Counter-Terrorist 00:00:541
ADD-USER Yuri-Boyka Counter-Terrorist 00:01:130
ADD-USER Bruce-Lee Terrorist 00:01:907
ADD-USER John-Wick Counter-Terrorist 00:02:181
ADD-USER johnwick Counter-Terrorist 00:03:777
GET-MONEY John-Wick 00:03:813
GET-HEALTH Bruce-Lee 00:04:465
GET-MONEY johnwick 00:05:000
BUY John-Wick AK 00:06:000
BUY John-Wick AWP 00:07:000
BUY John-Wick Desert-Eagle 00:08:000
BUY Yuri-Boyka M4A1 00:09:000
BUY Yuri-Boyka UPS-S 00:10:000
BUY Yuri-Boyka Desert-Eagle 00:11:000
BUY Bruce-Lee AK 00:12:000
BUY Bruce-Lee Glock-18 00:13:000
BUY johnwick Desert-Eagle 00:14:000
GET-MONEY John-Wick 00:15:000
GET-MONEY Yuri-Boyka 00:16:000
GET-MONEY Bruce-Lee 00:17:000
GET-MONEY johnwick 00:18:000
TAP John-Wick Yuri-Boyka heavy 00:19:000
TAP John-Wick Yuri-Boyka pistol 00:20:000
TAP John-Wick Yuri-Boyka knife 00:21:000
TAP Yuri-Boyka John-Wick heavy 00:22:000
TAP Yuri-Boyka John-Wick pistol 00:23:000
TAP Yuri-Boyka John-Wick knife 00:24:000
TAP Yuri-Boyka Bruce-Lee heavy 00:25:000
TAP Yuri-Boyka Bruce-Lee pistol 00:26:000
TAP Yuri-Boyka Bruce-Lee knife 00:27:000
TAP Bruce-Lee Yuri-Boyka heavy 00:28:000
TAP Bruce-Lee Yuri-Boyka pistol 00:29:000
TAP Bruce-Lee Yuri-Boyka knife 00:30:000
GET-HEALTH John-Wick 01:31:000
GET-HEALTH Yuri-Boyka 01:32:000
GET-HEALTH Bruce-Lee 01:33:000
GET-HEALTH johnwick 01:34:000
خروجی نمونه ۲
this user added to Counter-Terrorist
this user added to Counter-Terrorist
this user added to Terrorist
you are already in this game
this user added to Counter-Terrorist
1000
100
1000
invalid category gun
no enough money
I hope you can use it
no enough money
I hope you can use it
you have a pistol
no enough money
I hope you can use it
deads can not buy
400
700
700
1000
no such gun
friendly fire
friendly fire
no such gun
friendly fire
friendly fire
no such gun
nice shot
nice shot
no such gun
nice shot
nice shot
100
46
44
0
Counter-Terrorist won
ارسال پاسخ برای این سؤال