Description
Company: Uber
Problem Statement
Implement Uber's fare calculation engine. Given the parameters of a completed trip, compute the total fare charged to the rider.
Fare Formula
fare = max(
base_fare + (per_mile_rate * miles) + (per_minute_rate * minutes) + tolls + booking_fee,
minimum_fare
)
final_fare = fare * surge_multiplier
The function must handle multiple product types (UberX, UberXL, Uber Black) with different rate cards.
Function Signature
@dataclass
class RateCard:
base_fare: int # cents
per_mile_rate: int # cents per mile
per_minute_rate: int # cents per minute
booking_fee: int # cents
minimum_fare: int # cents
@dataclass
class Trip:
distance_miles: float
duration_minutes: float
tolls_cents: int
surge_multiplier: float
rate_card: RateCard
def calculate_fare(trip: Trip) -> dict:
"""
Returns:
{
"base_component": int, # base_fare in cents
"distance_component": int, # per_mile_rate * miles in cents
"time_component": int, # per_minute_rate * minutes in cents
"tolls": int, # tolls in cents
"booking_fee": int, # booking fee in cents
"subtotal": int, # sum before surge, with minimum applied
"surge_multiplier": float,
"total": int # final fare in cents (rounded to nearest cent)
}
"""
Examples
Example 1: Standard trip
rate_card = RateCard(
base_fare=200, per_mile_rate=150, per_minute_rate=25,
booking_fee=250, minimum_fare=800
)
trip = Trip(
distance_miles=5.2, duration_minutes=18.0,
tolls_cents=0, surge_multiplier=1.0, rate_card=rate_card
)
base_component = 200
distance_component = 150 * 5.2 = 780
time_component = 25 * 18 = 450
tolls = 0
booking_fee = 250
raw_subtotal = 200 + 780 + 450 + 0 + 250 = 1680
subtotal = max(1680, 800) = 1680
total = round(1680 * 1.0) = 1680
Output: {"base_component": 200, "distance_component": 780, "time_component": 450,
"tolls": 0, "booking_fee": 250, "subtotal": 1680,
"surge_multiplier": 1.0, "total": 1680}
Example 2: Minimum fare kicks in
rate_card = RateCard(
base_fare=200, per_mile_rate=150, per_minute_rate=25,
booking_fee=250, minimum_fare=800
)
trip = Trip(
distance_miles=0.3, duration_minutes=2.0,
tolls_cents=0, surge_multiplier=1.0, rate_card=rate_card
)
raw_subtotal = 200 + 45 + 50 + 0 + 250 = 545
subtotal = max(545, 800) = 800
total = 800
Example 3: Surge pricing
rate_card = RateCard(
base_fare=200, per_mile_rate=150, per_minute_rate=25,
booking_fee=250, minimum_fare=800
)
trip = Trip(
distance_miles=5.2, duration_minutes=18.0,
tolls_cents=350, surge_multiplier=1.75, rate_card=rate_card
)
subtotal = 200 + 780 + 450 + 350 + 250 = 2030
total = round(2030 * 1.75) = 3553
Constraints
- All monetary values are in cents (integers) to avoid floating-point errors
0 < distance_miles <= 5000 < duration_minutes <= 6000 <= tolls_cents <= 100001.0 <= surge_multiplier <= 5.0distance_componentandtime_componentshould be rounded to nearest cent before summing
Edge Cases
- Very short trip triggers minimum fare
- Surge on minimum fare (minimum fare is also surged)
- Zero tolls
- Extremely long trip (airport rides)
- Rate card with 0 base fare (some markets)
Complexity Target
- Time: O(1)
- Space: O(1)
Discussion (0)
All comments are anonymous. Your identity is not shared.
Loading comments...
Loading editor…
OUTPUTLast run results appear here.
No output yet. Click "Run Code" to see results.