File size: 3,157 Bytes
d2213a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"""Генератор задач: формула полной вероятности с использованием 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'