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