| import re |
| from .explainer_types import ExplainerResult, ExplainerScaffold |
|
|
|
|
| def explain_probability_question(text: str) -> ExplainerResult | None: |
| t = text.lower() |
|
|
| |
| probability_signals = [ |
| "probability", |
| "chance", |
| "odds", |
| "random", |
| "chosen at random", |
| "selected at random", |
| "picked at random", |
| "drawn", |
| "without replacement", |
| "with replacement", |
| ] |
|
|
| has_probability = any(p in t for p in probability_signals) |
|
|
| if not has_probability: |
| return None |
|
|
| givens = [] |
| relationships = [] |
| constraints = [] |
| trap_notes = [] |
|
|
| numbers = re.findall(r"\b\d+\b", t) |
|
|
| if numbers: |
| givens.append(f"Numbers mentioned: {', '.join(numbers[:5])}") |
| else: |
| givens.append("A situation involving possible outcomes is described") |
|
|
| if "without replacement" in t: |
| relationships.append("The probabilities change after each selection") |
| constraints.append("The total number of items decreases after each draw") |
|
|
| if "with replacement" in t: |
| relationships.append("The probabilities stay the same for each selection") |
|
|
| if "at least" in t: |
| relationships.append("This may require using the complement (1 - probability of the opposite event)") |
|
|
| if "both" in t or "and" in t: |
| relationships.append("You may need to combine probabilities of multiple events occurring together") |
|
|
| if "or" in t: |
| relationships.append("You may need to consider multiple possible favorable cases") |
|
|
| |
| relationships.append("Probability = favorable outcomes ÷ total possible outcomes") |
|
|
| asks_for = "the probability of a specific event occurring" |
|
|
| trap_notes.extend([ |
| "Make sure you correctly identify the total number of possible outcomes", |
| "Check whether events are independent or dependent", |
| "Watch for 'at least' — often easier to use the complement", |
| "Be careful not to double count outcomes", |
| ]) |
|
|
| return ExplainerResult( |
| understood=True, |
| topic="probability", |
| asks_for=asks_for, |
| givens=givens, |
| constraints=constraints, |
| relationships=relationships, |
| needed_concepts=[ |
| "favorable vs total outcomes", |
| "independent vs dependent events", |
| "complement rule", |
| ], |
| trap_notes=trap_notes, |
| strategy_hint="Start by identifying all possible outcomes, then count how many satisfy the condition.", |
| plain_english="The question is asking you to work out how likely an event is by comparing favorable outcomes to all possible outcomes.", |
| ) |