"""Генератор задач: формула полной вероятности с использованием 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'