Spaces:
Sleeping
Sleeping
| """Генератор задач: формула полной вероятности с использованием pymorphy3""" | |
| from core.base_generator import BaseTaskGenerator | |
| from models.task import Task | |
| from config import COMPLEXITY_CONFIG | |
| from fractions import Fraction | |
| import random | |
| import pymorphy3 | |
| morph = pymorphy3.MorphAnalyzer() | |
| def inflect(word: str, gram_tags: set): | |
| parsed = morph.parse(word)[0].inflect(gram_tags) | |
| if parsed: | |
| return parsed.word | |
| return word | |
| class TotalProbabilityGenerator(BaseTaskGenerator): | |
| """Генератор задач про формулу полной вероятности""" | |
| def generate(self) -> Task: | |
| """Генерация задачи""" | |
| config = COMPLEXITY_CONFIG[self.complexity] | |
| factory1_percent = random.choice([35, 40, 45, 55, 65, 85]) | |
| factory2_percent = 100 - factory1_percent | |
| factory1_defect = random.choice([1, 3, 5]) | |
| factory2_defect = random.choice([1, 3, 5, 20]) | |
| items = ['стекло', 'яйцо', 'сумка', 'насос'] | |
| item = random.choice(items) | |
| item_plural_acc = inflect(item, {'plur', 'accs'}) # родительный падеж множественного числа | |
| item_plural_gen = inflect(item, {'plur', 'gent'}) | |
| item_gender = morph.parse(item)[0].tag.gender | |
| buy = inflect('купленный', {'sing', 'nomn', item_gender}) | |
| defect = inflect('бракованный', {'sing', 'ablt', item_gender}) | |
| item_singular_acc = inflect(item, {'sing', 'accs'}) # винительный падеж единственного числа | |
| question = ( | |
| f"Две фабрики выпускают {item_plural_acc}. " | |
| f"Первая фабрика выпускает {factory1_percent}% этих {item_plural_gen}, " | |
| f"вторая — {factory2_percent}%. " | |
| f"Найдите вероятность того, что случайно {buy} в магазине {item} окажется {defect}." | |
| ) | |
| p = (factory1_percent / 100) * (factory1_defect / 100) + (factory2_percent / 100) * (factory2_defect / 100) | |
| answer = round(p, 4) | |
| steps = [ | |
| f"1. Вероятность от первой фабрики и брак: {factory1_percent / 100} × {factory1_defect / 100} = {(factory1_percent * factory1_defect) / 10000:.4f}", | |
| f"2. Вероятность от второй фабрики и брак: {factory2_percent / 100} × {factory2_defect / 100} = {(factory2_percent * factory2_defect) / 10000:.4f}", | |
| f"3. Суммарная вероятность: {(factory1_percent * factory1_defect + factory2_percent * factory2_defect) / 10000:.4f} = {answer}" | |
| ] | |
| return Task( | |
| type='total_probability', | |
| question=question, | |
| answer=answer, | |
| answer_fraction=f"{answer:.4f}", | |
| solution=f"Вероятность = {answer}", | |
| steps=steps, | |
| complexity=self.complexity | |
| ) | |
| def get_type(self) -> str: | |
| return 'total_probability' | |