| پروژهٔ اولیهٔ این سوال را میتوانید از [این لینک](/contest/assignments/103145/download_problem_initial_project/356757/) دانلود کنید. |
| :-: |
هر گیتِ ورودی ورزشگاهِ **جام جهانی فناوری پردیس ۲۰۲۶** یک کارتخوان دارد و هر بار که تماشاگری کارتش را میکشد، یک رویداد ورود یا خروج در لاگ ثبت میشود. در شلوغی روز اول، تابلویی که تعداد افراد داخل سالن را نشان میداد از کار میافتد. تا راهاندازی دوبارهٔ تابلو، سلیب به دو عدد نیاز دارد: **در پایان لاگ چند نفر داخل سالن ماندهاند** و **بیشترین تعداد افرادی که همزمان داخل بودهاند چند نفر بوده است**! یک اسکریپت *Bash* بنویسید که این دو عدد را از روی فایل لاگ محسابه کند.

# **پروژهٔ اولیه**
برای دانلود **پروژهٔ اولیه** روی [این لینک](/contest/assignments/103145/download_problem_initial_project/356757/) کلیک کنید. داخلش یک `solution.sh` هست که چند خط کامنت راهنما دارد و بدنهاش خالی است.
<details class="grey">
<summary>**نکته: تنها فایلی که تحویل میگیرید**</summary>
```text tree text
.
└── <mark class="green" title="این فایل را تکمیل کنید.">solution.sh</mark>
```
</details>
# **جزئیات**
در هر تست، یک `gate-log.txt` جدید در **پوشهٔ کاری فعلی** گذاشته میشود و بعد اسکریپت با دستور `bash solution.sh` اجرا میشود. این فایل روی *stdin* نمیآید، پس اگر کدتان منتظر ورودی بماند، برای همیشه منتظر میماند و سیستم داوری نمرهای برای آن لحاظ **نمیکند!** از کل کاری که اسکریپت میکند، فقط همان دو خطی که چاپ میکند سنجیده میشود و پیادهسازیهای مختلف مورد قبول خواهند بود.
|  |
| :-: |
| سیستم داوری فایل نمونه را در پوشهٔ فعلی میگذارد، اسکریپت را اجرا میکند و دو خط خروجی را عیناً با پاسخ مورد انتظار میسنجد. |
## **قالب فایل `gate-log.txt`**
هر خط از این فایل **یک رویداد کارتخوان** است و از چهار قسمت تشکیل شده که با یک **فاصله** *(space)* از هم جدا میشوند:
```text gate-log.txt terminal
ID GATE BADGE EVENT
```
> سه قسمت اول (`ID` شمارهٔ رویداد، `GATE` نام گیت و `BADGE` شناسهٔ کارت) در این سوال استفاده **نمیشوند.** تنها قسمتی که اهمیت دارد `EVENT` است که دقیقاً یکی از دو مقدار `IN` یا `OUT` را میگیرد. مقدار `IN` یعنی یک نفر **وارد** شده و `OUT` یعنی یک نفر **خارج** شده است. مقدار `IN` یعنی یک نفر وارد سالن شده و `OUT` یعنی یک نفر خارج شده است.
## **منطق شمارش**
- شمارندهٔ حضور از **صفر** شروع میشود، با هر `IN` یک واحد **افزایش** مییابد و با هر `OUT` یک واحد **کاهش** مییابد.
- همیشه لاگها **سازگار** هستند؛ یعنی هیچوقت بیش از تعداد افرادِ داخل سالن، رویداد خروج ثبت **نمیشود** و شمارنده **هرگز منفی نمیشود.**
- ورودی هر خط همیشه معتبر است و `EVENT` همیشه یکی از دو مقدار `IN` یا `OUT` خواهد بود.
## **دو حالت مرزی که باید مدیریت کنید**
- ممکن است وسط یا انتهای فایل یک **خط کاملاً خالی** بیاید. خط خالی رویداد نیست **و باید نادیده گرفته شود!**
- ممکن است فایل **بدون خط جدید در انتها** تمام شود، یعنی آخرین رویداد بعد از خودش `\n` نداشته باشد. اسکریپت شما باید این آخرین رویداد را هم بخواند و حساب کند.
|  |
| :-: |
| خط خالی بهعنوان رویداد شمرده **نمیشود** و آخرین رویداد حتی بدون خط جدید پایانی باید پردازش شود. |
## **خروجی اسکریپت**
اسکریپت باید **دقیقاً دو خط** و به همین ترتیب چاپ کند:
```text terminal terminal
INSIDE=<count>
PEAK=<max_count>
```
> مقدار `INSIDE` مقدار نهایی شمارندهٔ حضور بعد از پردازش همهٔ رویدادهاست، یعنی تعداد افرادی که در پایان لاگ هنوز **داخل سالن** ماندهاند. مقدار `PEAK` بیشترین عددی است که شمارنده در طول شمارش به آن رسیده است. چون رویداد `OUT` فقط شمارنده را کم میکند، این بیشینه همیشه بلافاصله بعد از یک `IN` رخ خواهد داد. ممکن است در پایان همه سالن را ترک کرده باشند و `INSIDE` صفر شود، ولی `PEAK` همچنان **بیشترین حضور** در طول رویدادها را نگه میدارد!
سیستم داوری خروجی را خطبهخط و **حساس به بزرگی و کوچکی حروف** با پاسخ درست مقایسه میکند. هر فاصلهٔ اضافه، خط سوم یا جابهجایی دو خط باعث رد شدن آن بخش میشود، پس چیزی جز همین دو خط چاپ نکنید.
|  |
| :-: |
| شمارندهٔ حضور با هر ورود افزایش و با هر خروج کاهش مییابد؛ `PEAK` بالاترین نقطهٔ این منحنی و `INSIDE` مقدار پایانی آن است. |
|  |
| :-: |
| منطق پردازش: گذشتن از خط خالی، افزودن یا کاستن شمارنده بر پایهٔ `IN` و `OUT`، بهروزرسانی بیشینه و چاپ دو خط در پایان. |
# **نمونه**
برای مثال، این لاگ سهخطی را در نظر بگیرید:
```text gate-log.txt terminal
1 WEST A1 IN
2 WEST A2 IN
3 EAST A1 OUT
```
با اجرای اسکریپت، خروجی زیر چاپ میشود:
```text output terminal
INSIDE=1
PEAK=2
```
> در این مثال سه رویداد داریم. با دو `IN` پشت سر هم شمارندهٔ حضور به `2` میرسد و همانجا بیشینه برابر `2` ثبت میشود. بعد یک `OUT` شمارنده را به `1` میرساند. در پایان یک نفر داخل سالن مانده، پس `INSIDE=1` و چون بیشترین حضور همزمان `2` نفر بوده `PEAK=2` چاپ میشود.
نمونهٔ دوم را با هفت رویداد در نظر بگیرید که جمعیت اول زیاد و بعد کم میشود:
```text gate-log.txt terminal
1 GATE K1 IN
2 GATE K2 IN
3 GATE K3 IN
4 GATE K4 IN
5 EXIT K1 OUT
6 EXIT K2 OUT
7 EXIT K3 OUT
```
خروجی مورد انتظار برابر است با:
```text output terminal
INSIDE=1
PEAK=4
```
> چهار ورودِ پشت سر هم شمارنده را تا `4` بالا میبرند و بیشینه روی همین `4` باقی میماند. بعد سه خروجِ پشت سر هم شمارنده را به `1` میرسانند. پس در پایان یک نفر داخل سالن است و `INSIDE=1` میشود، اما بیشترین حضور همزمان `4` نفر بوده و `PEAK=4` باقی میماند.
نمونهٔ سوم چند حالت مرزی را یکجا دارد تا هر سه حالت مرزی را یکجا ببینید: یک **خط خالی** وسط فایل، **دو فاصله** بین دو قسمت و **نبودِ خط جدید** در انتهای آخرین خط:
```text gate-log.txt terminal
1 WEST A1 IN
2 EAST A2 IN
3 WEST A1 OUT
4 EAST A3 IN
```
خروجی این یکی برابر است با:
```text output terminal
INSIDE=2
PEAK=2
```
> خط خالی **هیچ رویدادی نیست** و باید اسکیپ شود، نه اینکه بهاشتباه یک رویداد بیمقدار حساب شود. دو فاصلهٔ بین `WEST` و `A1` هم نباید مشکلی درست کند. مهمترین نکتهی این مثال خط آخر است: فایل با `\n` تمام نشده است پس در صورت پیادهسازی اشتباه، رویداد چهارم اصلاً خوانده **نمیشود** و بهجای `INSIDE=2` عدد `1` را چاپ میکنید! سه ورود و یک خروج داریم، پس شمارنده به `2` میرسد و بیشینه هم همان `2` است.
جدول زیر همین نمونه را رویداد به رویداد نشان میدهد:
| رویدادی که خوانده میشود | اثر بر شمارنده | `INSIDE` پس از این رویداد | `PEAK` پس از این رویداد |
| --: | :-: | :-: | :-: |
| `1 GATE K1 IN` | ۱+ | ۱ | ۱ |
| `2 GATE K2 IN` | ۱+ | ۲ | ۲ |
| `3 GATE K3 IN` | ۱+ | ۳ | ۳ |
| `4 GATE K4 IN` | ۱+ | ۴ | ۴ |
| `5 EXIT K1 OUT` | ۱− | ۳ | ۴ |
| `6 EXIT K2 OUT` | ۱− | ۲ | ۴ |
| `7 EXIT K3 OUT` | ۱− | ۱ | ۴ |
همانطور که در ستون آخر میبینید، رویدادهای `OUT` شمارندهٔ حضور را کم میکنند ولی هیچوقت بیشینه را پایین نمیآورند.
|  |
| :-: |
| روند شمارندهٔ حضور در نمونهٔ دوم: صعود تا بیشینهٔ ۴ و سپس نزول تا حضور پایانی ۱. |
# **آنچه باید آپلود کنید**
برای ارسال این تمرین، فایل `solution.sh` را تکمیل کنید و **همین یک فایل** را در همین صفحه آپلود کنید.
+ **توجه:** تنها فایل `solution.sh` شما در سیستم داوری کوئرا مورد پذیرش قرار میگیرد و تغییر در هر فایل دیگری بیتأثیر است.
+ **توجه:** فایل `solution.sh` بهصورت خودکار توسط سیستم داوری کوئرا اجرا میشود و نیازی به نوشتن دستور یا اسکریپت دیگری برای اجرای آن **نیست.**
+ **توجه:** سیستم داوری محتوای فایل `gate-log.txt` را بهصورت ورودی استاندارد به اسکریپت نمیدهد، بلکه آن را در پوشهٔ جاری قرار میدهد و خواندن فایل **بر عهدهٔ خود اسکریپت** است.
+ **توجه:** خروجی باید دقیقاً دو خط و عیناً مطابق قالب خواستهشده باشد. سیستم داوری به بزرگی و کوچکی حروف **حساس** است.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.