Debug and extend obstacle-run statistics classes
Company: Headway
Role: Software Engineer
Category: Coding & Algorithms
Difficulty: medium
Interview Round: Technical Screen
## Problem: Obstacle course run statistics (debug + implement)
You are building software to track how long racers take to complete an obstacle course.
### Domain model
- A **Course** has:
- `title` (string)
- `obstacle_count` (int): number of obstacles in the course
- A **Run** represents one attempt on a Course:
- `obstacle_times`: list of per-obstacle completion times (seconds)
- `complete`: boolean that becomes `True` when `len(obstacle_times) == course.obstacle_count`
- `add_obstacle_time(t)`: appends a time for the next obstacle; throws if run is already complete
- `get_run_time()`: sum of the recorded times so far (for incomplete runs, sum of completed obstacles)
- A **RunCollection** stores many runs for the *same* course:
- `add_run(run)`: adds a Run; rejects runs from a different Course
- `personal_best()`: the minimum total time among **complete** runs
### Tasks
1. **Debugging:**
- There is a bug in the provided `RunCollection` implementation that causes an existing unit test to fail.
- Fix `RunCollection` so that the provided test suite passes.
2. **Implement `best_of_bests()` in `RunCollection`:**
- Definition: the fastest possible run time if everything went perfectly.
- Compute it by taking, for each obstacle index `i`, the minimum observed time for obstacle `i` across **all runs** that reached that obstacle (including incomplete runs), and summing these per-obstacle minima.
- Add (or update) a unit test verifying correctness.
3. **Implement `chance_of_personal_best(test_run)` using simulation:**
- Input: an **in-progress** `Run` (may have completed some obstacles but not all).
- Assume that for each remaining obstacle `i` not yet completed in `test_run`, the time to complete obstacle `i` is drawn **uniformly at random** from the set of historical times recorded for obstacle `i` in the run collection (including obstacle times from incomplete runs, as long as that obstacle time exists).
- Run **10,000 trials**:
- For each trial, sample times for the missing obstacles and add them to `test_run`’s current elapsed time.
- Count the fraction of trials where the completed simulated total time is **<=** the current `personal_best()`.
- Return that fraction as a float.
- Accuracy requirement: the returned value should be within **±0.02** of the true probability.
4. **Testing & code quality discussion:**
- What additional tests would you add (beyond the provided ones)?
- After implementing `best_of_bests()` and `chance_of_personal_best()`, what improvements would you make to the codebase (structure, naming, performance, reliability, determinism of tests, etc.)?
### Notes / edge cases to consider
- Some runs may be incomplete.
- `personal_best()` is defined only over complete runs.
- The run collection is assumed to contain runs for exactly one course.
- Sampling for obstacle `i` requires there to be at least one historical time recorded for that obstacle.
Quick Answer: This question evaluates object-oriented design, debugging, algorithmic reasoning, and probabilistic simulation competencies by requiring fixes to class behavior, implementation of aggregate statistics, and a Monte Carlo-based probability estimator.