satyacode
Background
Back to js-loops

03-auto-rickshaw-meter.js

JavaScript
1/**
2 * 🛺 Pappu ka Auto Rickshaw Meter (Mumbai Style)
3 *
4 * Pappu auto chalata hai Mumbai mein. Uska meter thoda unique hai - distance
5 * ke hisaab se rate change hota hai. Aur agar passenger ne waiting karaya,
6 * toh uska bhi charge lagta hai.
7 *
8 * Fare calculation (use while loop, process km by km):
9 *   - First 1 km (minimum fare): Rs 30
10 *   - Km 2 to 5 (i.e., next 4 km): Rs 15 per km
11 *   - Beyond 5 km: Rs 10 per km
12 *   - Distance ko Math.ceil() karo (e.g., 3.2 km = 4 km charge)
13 *
14 * Waiting charges:
15 *   - Rs 5 per 2 minutes of waiting
16 *   - Waiting minutes ko bhi Math.ceil() karo for pairs
17 *     (e.g., 3 min = 2 pairs = Rs 10, 5 min = 3 pairs = Rs 15)
18 *   - If waitingMinutes is not provided, default is 0
19 *
20 * Validation:
21 *   - Agar distance ek positive number nahi hai, return -1
22 *   - Agar waitingMinutes negative hai, return -1
23 *
24 * @param {number} distance - Distance in kilometers
25 * @param {number} [waitingMinutes=0] - Waiting time in minutes
26 * @returns {number} Total fare in rupees, or -1 for invalid input
27 *
28 * @example
29 *   calculateAutoFare(3)    // => 60  (30 + 15 + 15)
30 *   calculateAutoFare(7, 4) // => 120 (30 + 60 + 20 + 10)
31 *   calculateAutoFare(0.5)  // => 30  (ceil to 1 km = minimum fare)
32 *   calculateAutoFare(-2)   // => -1
33 */
34export function calculateAutoFare(distance, waitingMinutes = 0) {
35  if( typeof distance !== "number" || distance <= 0  || waitingMinutes < 0){
36    return -1
37  }
38
39  distance = Math.ceil(distance)
40  let fare = 0;
41  let counter = 1;
42  while(distance >= counter){
43    if(counter == 1){
44      fare = 30
45    } else if(1 < counter && counter <= 5){
46      fare += 15
47    }else if(counter > 5){
48      fare += 10
49    }
50    counter++
51  }
52
53  let waitingPairs = Math.ceil(waitingMinutes/2)
54
55  let waitingFare = waitingPairs * 5;
56
57  return fare + waitingFare
58  
59}
60