--------------------------------------------------
میخواهیم تابعی بنویسیم که کارش چک کردن شرایط تعریف شده برای اشیاء (*objects*) مورد نظر است.
--------------------------------------------------
*کریم کچل، شطرنجباز حرفهای محله است که بعد از شرایط کرونا خود را در خانه قرنطینه کرده. اما متاسفانه مهرههای شطرنجش را گم کرده و بابت شرایط کرونا نمیتواند مهرهها را از بیرون سفارش دهد و تصمیم گرفته که با میوههایی که در خانه دارد مهرهها را بسازد.*
*او میفهمد که هر میوهای را نمیتواند به عنوان مهرهی شطرنج استفاده کند و تنها میوههای خوب را میتواند به عنوان مهرهی شطرنج استفاده کند.*
میوهای خوب است که شرایط زیر را داشته باشد:
- شکل آن به صورت کروی (*sphere*) باشد.
- جرم آن بین ۳۰۰ تا ۶۰۰ گرم باشد.
- حجم آن بین ۱۰۰ تا ۵۰۰ سانتیمتر مکعب باشد.
توجه کنید که جرم میوههای خوب، خود اعداد ۳۰۰ و ۶۰۰ و حجم آن، خود اعداد ۱۰۰ و ۵۰۰ هم میتواند باشد.
حال شما باید تابعی بنویسید که با گرفتن لیستی از میوهها، مشخص کند از هر نوع میوه چند تای آن خوب است.
# جزئیات
+ تابع شما که باید به نام `fruits` باشد به عنوان ورودی لیستی(*tuple*) از لغتنامهها(*Dictionary*) دریافت میکند که هر لغتنامه اطلاعات مربوط به یک میوه میباشد. این تابع در نهایت باید تعداد هر کدام از میوههای خوب را در قالب یک لغتنامه برگرداند.
+ نام و شکل هر میوه به ترتیب با عنوان `name` و `shape` و جرم و حجم هر میوه به ترتیب با عنوان `mass` و `volume` در یک لغتنامه ذخیره شده است.
+ فرض کنید ۴ عدد میوه به صورت زیر داریم:
| نام میوه | شکل | جرم | حجم | وضیعت |
|:--------:|:---------:|:----------:|:----------:|:----------:|
| سیب | کروی | ۳۵۰ | ۱۲۰ | میوه خوب |
| انبه | مربعی | ۱۵۰ | ۱۲۰ | میوه بد |
| لیمو | کروی | ۳۰۰ | ۱۰۰ | میوه خوب |
| سیب | کروی | ۵۰۰ | ۲۵۰ | میوه خوب |
سیستم داوری برای ورودی دادن میوههای بالا به تابع `fruits` این تابع را به صورت زیر صدا میزند.
```python
output = fruits ((
{'name':'apple', 'shape': 'sphere', 'mass': 350, 'volume': 120},
{'name':'mango', 'shape': 'square', 'mass': 150, 'volume': 120},
{'name':'lemon', 'shape': 'sphere', 'mass': 300, 'volume': 100},
{'name':'apple', 'shape': 'sphere', 'mass': 500, 'volume': 250}))
```
در بین این میوهها، سه تا میوه خوب وجود دارد که ۲ تای آنها سیب، و یکی از آنها لیمو است. خروجی تابع شما به ازای چنین چیزی باید یک لغتنامه به صورت زیر باشد:
```python
{'apple': 2, 'lemon': 1}
```
ساختار تابع شما باید به شکل زیر باشد:
```python
def fruits(tuple_of_fruits):
pass
```
# نکات
+ برای ارسال باید یک فایل پایتون ارسال کنید که در آن تابع `fruits` به شکل گفته شده وجود داشته باشد.
+ میتوانید فایل اولیهی خام و کد تست نمونه را با استفاده از این [لینک](https://quera.ir/qbox/download/wlvI9vXrkU/initial.zip) دانلود کنید.
--------------------------------------------------
میخواهیم تابعی بنویسیم که بر روی [تولیدکنندهها](https://wiki.python.org/moin/Generators) (`generator`) پیمایش کند و به آنها اطلاعاتی ارسال کند.
--------------------------------------------------
*متاسفانه کریم اینترنتش قطع شده و با میوههایش هم نتوانست مهرههای شطرنج را بسازد و تصمیم گرفت بخوابد تا شاید زمان بگذرد. کریم خواب دید که مسئول یک مسابقهی برنامهنویسی شده است.*
او از شرکتکنندگان خواسته یک تولیدکننده یا `generator` بنویسند که عدد مطلوبی را حدس بزند؛ این تولیدکننده وضعیت (بزرگتر، کوچکتر یا مساوی بودن) عدد حدسی، نسبت به عدد مطلوب را از پیمایشکننده خود دریافت میکند.
کریم به عنوان مسئول مسابقه باید این تولیدکنندهها را بررسی کند، اما چون توانایی برنامهنویسی در کریم مشاهده نمیشود، از شما کمک میخواهد که تابعی به عنوان پیمایشکننده برای بررسی این تولیدکنندهها بنویسید.
# پروژه اولیه
پروژه اولیه را از [اینجا](http://bayanbox.ir/download/128931233525929665/guess-generator.zip) دانلود کنید.
ساختار فایلهای این پروژه به صورت زیر است.
```
guess-generator
├── generators.py
└── source.py
```
# جزئیات
تولیدکنندهها انتظار دارند مقادیر زیر را از پیمایشکننده خود دریافت کنند:
- `G`: عدد حدسی از عدد مطلوب بزرگتر باشد.
- `L`: عدد حدسی از عدد مطلوب کوچکتر باشد.
- `E`: عدد حدسی با عدد مطلوب برابر باشد.
یک نمونه از تولیدکننده مورد نظر:
```python
import random
def guess_generator(min_value, max_value):
num = random.randint(min_value, max_value + 1)
resp = (yield num)
while resp != 'E': # Equal
if resp == 'G': # Greater
max_value = num - 1
elif resp == 'L': # Less
min_value = num + 1
num = random.randint(min_value, max_value + 1)
resp = (yield num)
```
شما باید تابعی بنویسید که پارامترهای زیر را دریافت کند:
- `guess_generator`: تولیدکنندهای که باید پیمایش شود.
- `min_value`: حداقل مقدار برای حدس
- `max_value`: حداکثر مقدار برای حدس
- `assumed_number`: عدد فرضی برای حدس
و در خروجی یک لیست با شرایط زیر برگرداند:
- لیست شامل تمام اعداد حدس زده شده توسط تولیدکننده به ترتیب پیمایش باشد.
- بعد از هر حدس عجیب یک عضو `'!'` باشد.
یک حدس عجیب است اگر یکی از شرایط زیر را داشته باشد:
- اگر بعد از دریافت `G` از طرف پیمایشگر عددی بزرگتر یا مساوی حدس قبلی حدس زده شود، این یک حدس عجیب است!
- اگر بعد از دریافت `L` از طرف پیمایشگر عددی کوچکتر یا مساوی حدس قبلی حدس زده شود، این یک حدس عجیب است!
- اگر بعد از دریافت `E` از طرف پیمایشگر حدس زدن عدد ادامه پیدا کند، این یک حدس عجیب است!
- اگر عدد حدسی کمتر از `min_value` یا بیشتر از `max_value` باشد، این یک حدس عجیب است!
- اگر در کل فرایند پیمایش سه مرتبه حدس عجیب اتفاق افتاد، یک عضو `'!!!'` به لیست خروجی اضافه شود و پیمایش متوقف شود.
برای مثال:
```python
import generators
from source import guess_generator_iterator
gen = generators.guess_generator_1_correct
min_value, max_value, num = 1, 100, 50
lst = guess_generator_iterator(gen, min_value, max_value, num)
print(lst)
gen = generators.guess_generator_2_lazy
min_value, max_value, num = 1, 10, 7
lst = guess_generator_iterator(gen, min_value, max_value, num)
print(lst)
gen = generators.guess_generator_3_careless
min_value, max_value, num = 1, 30, 15
lst = guess_generator_iterator(gen, min_value, max_value, num)
print(lst)
gen = generators.guess_generator_4_stupid
min_value, max_value, num = 1, 10, 5
lst = guess_generator_iterator(gen, min_value, max_value, num)
print(lst)
```
خروجی نمونه بالا:
```python
[5, 15, 74, 71, 55, 49, 50]
[1, 2, 3, 4, 5, 6, 7]
[22, 2, 8, 9, 20, 18, 11, 15, 16, '!', 14, '!', 14, '!', '!!!']
[4, 3, '!', 2, '!', 1, '!', '!!!']
```
در این مثال تولیدکنندههای اول و دوم میتوانند به درستی عدد خواسته شده را حدس بزنند و هیچ حدس عجیبی هم نداریم؛ بنابراین حدسهای تولیدکننده به ترتیب داخل یک لیست خروجی داده میشود. در دو مثال بعدی هر کدام از تولیدکنندهها سه حدس عجیب دارند که بعد از هر کدام از آن حدسها یک `'!'` به لیست اضافه میشود و در آخر هم یک `'!!!'` به لیست اضافه میشود و حاصل برگردانده میشود.
# نکات
+ شما تنها مجاز به تغییر فایل `source.py` و تکمیل تابع
`guess_generator_iterator` هستید.
+ برای فرستادن کد صرفا فایل `source.py` را با فرمت `zip` فشرده کرده و بفرستید.
+ میتوانید کد تست نمونه را با استفاده از این [لینک](https://quera.ir/qbox/download/4eOWrvF1eb/chess_generator.zip) دانلود کنید.