*فرهاد* و *سلیب* که از بازی تفاضل خسته شده بودند، بازی جدیدی را شروع کردند.
بازی کلمهها به این صورت است که *فرهاد* رشتهای را به *سلیب* میدهد و *سلیب* باید کلمات خوب آن به همراه تعداد تکرارهایش را به فرهاد بدهد.
در واقع *فرهاد* به *سلیب* یک رشته میدهد که کلمات آنها با کاراکترهای *Whitespace* از هم جدا شدهاند؛ برای مثال اگر متن ورودی `Hello SAliB!` باشد، کلمات آن `Hello` و `SAliB!` هستند.
از نظر *فرهاد* هر کاراکتری که جز حروف انگلیسی نباشد، یک حرف بد است و باید حذف شود. برای مثال کاراکترهای `A` و `b` حرف خوب و کاراکتر `!` حرف بد هستند.
همچنین به یک کلمه بد میگوییم اگر حداقل نیمی از کاراکترهای آن بد باشند. *سلیب* باید به ازای هر کلمه خوب، کاراکترهای بد آن را حذف کند و سپس کاراکتر اول هر کلمه را بزرگ و دیگر کاراکترها را کوچک کند. برای مثال کلمه `A!` بد است اما `A!A` خوب است.
برای مثال اگر متن ورودی به صورت زیر باشد:
```
"hEllO My FriEnDs!!! thIS i$s A tE%sT For your #p#r#o#b#l#e#m a
```
بعد از این عملیات رشته به صورت زیر در میآید:
```
Hello My Friends This Is A Test For Your A
```
توجه کنید که در این نمونه کلمه `#p#r#o#b#l#e#m` بد است و حذف شده و از دیگر کلمهها فقط کاراکترهای خوبشان باقی مانده است.
در نهایت *سلیب* باید در قالب یک لغتنامه (*Dictionary*) که کلیدهای آن کلمات متن و مقادیر هر کلید، تعداد تکرار آن کلمه در متن نهایی است برگرداند.
شما باید تابعی به نام `words_check` بنویسید که با گرفتن متن ورودی، لغتنامه خواسته شده را برگرداند.
<details class="blue">
<summary> **نمونه** </summary>
```python
>> words_check("""hEllO My FriEnDs!!!
thIS is A tEsT For your #p#r#o#b#l#e#m a""")
{'A': 2, 'For': 1, 'Friends': 1, 'Hello': 1, 'Is': 1, 'My': 1, 'Test': 1, 'This': 1, 'Your': 1}
```
</details>
<details class="red">
<summary> **نکات** </summary>
+ برای این که کلمات رشته `s` را بر حسب کاراکترهای *Whitespace* جدا کنید، میتوانید از تابع `s.split()` استفاده کنید.
+ برای ارسال باید یک فایل پایتون ارسال کنید که در آن تابع `words_check` به شکل گفته شده وجود داشته باشد.
+ میتوانید فایل اولیهی خام را از [این لینک](https://quera.ir/qbox/download/tIPYJhvXxl/kalameh_initial.zip) دانلود کنید.
</details>
*سلیب* که از تنهایی و خانهنشینی حوصلهاش سر رفته تصمیم گرفته که دوستانش را دعوت کند تا با آنها اسمفامیل بازی کند.
بعد از رسیدن دوستان *سلیب* آنها بازی را شروع کردند، اما بعد از تمام شدن دست اول در امتیازدهی دچار مشکل شدهاند. هیچکس کلمات دیگری را قبول نداشت به همین خاطر نمرهی هر کلمه نامشخص بود.
*سلیب* و دوستانش برنامهنویس هستند و فقط به برنامهها اعتماد دارند. به همین خاطر از شما میخواهند برایشان برنامهای بنویسید تا با دریافت فایل تمامی کلمات قابل قبول طبق قوانین ذکر شده، بتواند به او و دوستانش نمرهای صحیح بدهد.
# فایل کامل کلمات
دوستان *سلیب* برای این که در امتیازدهی به مشکل نخورند یک فایل *CSV* آماده کردند که شامل همه کلمات درست است.
این فایل با نام ```esm_famil_data.csv``` به فرمت *CSV* در اختیار شما قرار دارد که میتوانید از این [لینک](https://quera.ir/qbox/download/JCGTB6nWc5/esm_famil_data.csv) آن را دانلود کنید.
نمونه محتوای فایل*CSV*:
```
esm,famil,keshvar,rang,ashia,ghaza
اب گوشت,استکان,ابی,المان,اسدی,اوا
اش,ایینه,اجری,البانی,ارمانی,ارزو
برنج خورشت,اره,ارغوانی,انگولا,اکبری,اتنا
باقالی پلو,اره برقی,ارکیده,اتریش,اعظمی,ارش
به پلو,اب پاش,البالویی,امریکا,امینی,امنه
باقلوا,بیل,بژ,ایتالیا,ازادی,ارمین
پیتزا,بمب,بنفش,ارژانتین,بابایی,ایدا
...
```
پیشنهاد میکنیم قبل از شروع به پیادهسازی یک بار این فایل را باز کنید و محتویات آن را ببینید (اگر با باز کردن این فایل مشکل داشتید میتوانید از ابزار [گوگلشیت](https://docs.google.com/spreadsheets) استفاده کنید).
شما باید سه تابع با نام های ```ready_up``` و ```add_participant``` و ```calculate_all``` را برای *سلیب* پیادهسازی کنید.
شرح کار کلی شما به این صورت است که ابتدا محتویات فایل تمامی کلمات قابل قبول را میخوانید و ذخیره میکنید، سپس پاسخهای بازیکنان را به بازی اضافه میکنید. پس از آن شروع به امتیازدهی میکنید.
<details class="blue">
<summary> **تابع** ```ready_up``` </summary>
این تابع باید محتویات درون فایل *CSV* را خوانده و به طور دلخواه شما ذخیره کند. فایل *CSV* با نام `esm_famil_data.csv` در کنار فایل پایتون شما قرار دارد.
</details>
<details class="yellow">
<summary> **تابع** ```add_participant``` </summary>
این تابع باید یک بازیکن را به بازی اضافه کند. ورودی این تابع به این صورت است:
```python
add_participant(participant = 'salib', answers = {'esm': 'بردیا', 'famil': 'بابایی', 'keshvar': 'باربادوس', 'rang': 'بنفش', 'ashia': 'بمب', 'ghaza': 'باقالیپلو'})
```
* شما نیاز دارید جوابهای تک تک بازیکنان را نیز به نحوی که هر پاسخ مختص یک نفر باشد ذخیره کنید.
</details>
<details class="green">
<summary> **تابع** ```calculate_all``` </summary>
این تابع در زمانی فراخوانی میشود که تمامی بازیکنان پاسخهایشان را به برنامه شما دادهاند.
وظیفه این تابع محاسبهی نمرهی همهی افراد است و پس از محاسبه باید در قالب یک دیکشنری به فرمت خواسته شده در پایان سوال نتیجه بازی را بازگردانید.
نمرهدهی در انتهای سوال به طور کامل توضیح داده شده است.
</details>
# قوانین امتیاز دهی بازی:
در هر فیلد ( برای مثال ```ghaza``` ) دو حالت امتیازدهی زیر را داریم:
۱- اگر برای این فیلد همهی بازیکنان جوابی را ارائه کرده باشند:
* اگر بازیکن پاسخی ارائه کرده باشد که در لیست کلمات قابل قبول نیست و یا پاسخی ارائه نکرده باشد، ۰ امتیاز میگیرد.
* اگر بازیکن پاسخی تکراری داده باشد ( مثلا برای غذا سه نفر ```پیتزا``` نوشته باشند )، ۵ امتیاز میگیرد.
* اگر بازیکن پاسخ متمایزی داده باشد ۱۰ امتیاز میگیرد.
۲- اگر بازیکنی وجود داشته باشد که برای این فیلد پاسخی ارائه نکرده باشد:
* اگر بازیکن پاسخی ارائه کرده باشد که در لیست کلمات قابل قبول نیست و یا پاسخی ارائه نکرده باشد، ۰ امتیاز میگیرد.
* اگر بازیکن پاسخی تکراری داده باشد ( مثلا برای غذا سه نفر ```پیتزا``` نوشته باشند )، ۱۰ امتیاز میگیرد.
* اگر بازیکن پاسخ متمایزی داده باشد ۱۵ امتیاز میگیرد.
<details class="green">
<summary> **نمونه بازی** </summary>
```python
>> ready_up()
>> add_participant(participant = 'salib', answers = {'esm': 'بردیا', 'famil': 'بابایی', 'keshvar': 'باربادوس', 'rang': 'بنفش', 'ashia': 'بمب', 'ghaza': '<mark title="باید 'باقالی پلو' در نظر گرفته شود که در فایل موجود است">باقالیپلو</mark>'})
>> add_participant(participant = 'kianoush', answers = {'esm': 'بهرام', 'famil': 'بهرامی', 'keshvar': 'برزیل', 'rang': 'بلوطی', 'ashia': 'بیل', 'ghaza': '<mark title="باید 'به پلو' در نظر گرفته شود که در فایل موجود است">به پلو</mark>'})
>> add_participant(participant = 'sajjad', answers = {'esm': 'بابک', 'famil': 'بهشتی', 'keshvar': 'باهاما', 'rang': 'بژ', 'ashia': '<mark title="باید بی پاسخ در نظر گرفته شود"> </mark>', 'ghaza': 'برنج خورشت'})
>> add_participant(participant = 'farhad', answers = {'esm': 'بهرام', 'famil': 'براتی', 'keshvar': '<mark title="پاسخ ناموجود در فایل">بببببب</mark>', 'rang': 'بژ', 'ashia': 'بیل', 'ghaza': 'باقلوا'})
>> calculate_all()
> {'salib': 65, 'kianoush': 55, 'sajjad': 45, 'farhad': 40}
```
### توضیحات بازی:
* ممکن است پاسخ های درست به شکل نگارشی دیگری در بازی وجود داشته باشند. برای مثال: در شرکتکننده ```salib``` برای فیلد ```ghaza``` پاسخ ```باقالیپلو``` معادل ```باقالی پلو``` ایست که در فایل ```esm_famil_data.csv``` وجود دارد و در شرکتکننده ```kianoush``` برای فیلد ```ghaza``` پاسخ ```به پلو``` معادل ```به پلو``` ایست که در فایل ```esm_famil_data.csv``` وجود دارد.
* ممکن است پاسخ خالی به صورت تعدادی کاراکتر اسپیس به شما ارائه شود. برای مثال: در شرکتکننده ```sajjad``` برای فیلد ```ashia``` پاسخ ` ` معادل پاسخ خالیست.
</details>
<details class="red">
<summary> **نکات** </summary>
+ تضمین میشود که ورودی تابع شما شامل ```آ``` نمیباشد و تمامی الفها به صورت ```ا``` میباشند. یعنی اگر شرکت کنندهای برای $esm$ ```آیدا``` نوشته باشد، به تابع شما ```ایدا``` ورودی داده میشود.
+ تضمین میشود تمامی پاسخها با یک حرف شروع میشوند یعنی اگر بازی با حرف ```س``` شروع میشود پاسخهای تمامی شرکتکنندهها با ```س``` شروع میشود.
+ میتوانید فایل اولیهی خام را از [این لینک](https://quera.ir/qbox/download/8nanyQPX2H/esm_famil_initial%20%282%29.zip) دانلود کنید.
</details>
# آنچه باید آپلود کنید
فایل کامل شده `source.py` را ارسال کنید؛ همچنین برای استفاده از کتابخانههای مختلف میتوانید همراه فایل ارسالی، فایلی به نام `python_requirements.txt` در _ZIP_
خود بگذارید که در آن نام کتابخانههای مورد نیاز و شماره نسخهی آنها
به فرمت زیر در آن موجود باشد: (اگر شماره نسخه را ننویسید آخرین نسخهی آن
کتابخانه نصب میشود)
```
firstlib==1.2.3
secondlib==4.5.6
...
```
در نهایت یک فایل _ZIP_ حاوی دو فایل خواسته شده را آپلود کنید.