cswork / libraryOpen practice workspace

Interview questions · Headway

Debug and extend obstacle-run statistics classes

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.

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.

Community answers

Nothing here yet.

Join in on CSWork →