satyacode
Background
Back to js-loops

12-indian-railways.js

JavaScript
1  /**
2   * 🚂 IRCTC Tatkal Reservation System
3   *
4   * IRCTC ka simplified reservation system bana! Passengers ka list hai,
5   * trains ka list hai with available seats. Har passenger ko uski preferred
6   * class mein seat dene ki koshish kar. Agar nahi mili, toh fallback class
7   * try kar. Agar woh bhi nahi, toh waitlist kar de.
8   *
9   * Train object structure:
10   *   { trainNumber: "12345", name: "Rajdhani Express",
11   *     seats: { sleeper: 3, ac3: 2, ac2: 1, ac1: 0 } }
12   *
13   * Passenger object structure:
14   *   { name: "Rahul", trainNumber: "12345",
15   *     preferred: "ac3", fallback: "sleeper" }
16   *
17   * Rules (use nested loops):
18   *   - Process passengers in order (FIFO - first come first served)
19   *   - For each passenger:
20   *     1. Find the train matching trainNumber
21   *     2. Try preferred class first: if seats > 0, allocate (decrement seat count)
22   *        Result: { name, trainNumber, class: preferred, status: "confirmed" }
23   *     3. If preferred not available, try fallback class
24   *        Result: { name, trainNumber, class: fallback, status: "confirmed" }
25   *     4. If neither available, waitlist the passenger
26   *        Result: { name, trainNumber, class: preferred, status: "waitlisted" }
27   *     5. If train not found, result:
28   *        { name, trainNumber, class: null, status: "train_not_found" }
29   *   - Seats are MUTATED: when a seat is allocated, decrement the count
30   *     so later passengers see updated availability
31   *
32   * Validation:
33   *   - Agar passengers ya trains array nahi hai ya empty hai, return []
34   *
35   * @param {Array<{name: string, trainNumber: string, preferred: string, fallback: string}>} passengers
36   * @param {Array<{trainNumber: string, name: string, seats: Object<string, number>}>} trains
37   * @returns {Array<{name: string, trainNumber: string, class: string|null, status: string}>}
38   *
39   * @example
40   *   railwayReservation(
41   *     [{ name: "Rahul", trainNumber: "12345", preferred: "ac3", fallback: "sleeper" }],
42   *     [{ trainNumber: "12345", name: "Rajdhani", seats: { sleeper: 5, ac3: 0, ac2: 1, ac1: 0 } }]
43   *   )
44   *   // ac3 has 0 seats, try fallback sleeper (5 seats), allocated!
45   *   // => [{ name: "Rahul", trainNumber: "12345", class: "sleeper", status: "confirmed" }]
46   */
47  export function railwayReservation(passengers, trains) {
48    if((!Array.isArray(passengers) || passengers.length === 0) || (!Array.isArray(trains) || trains.length === 0)){
49      return []
50    }
51    let results = []
52
53    for(let passenger of passengers){
54      let train = null;
55
56      for(let j = 0; j< trains.length ; j++){
57        if(passenger.trainNumber === trains[j].trainNumber){
58          train = trains[j];
59          break
60        }
61      }
62
63      if(train === null){
64        results.push({
65          name:passenger.name,
66          trainNumber: passenger.trainNumber,
67          class: null,
68          status: "train_not_found"
69        })
70        continue
71      }
72      if(train.seats[passenger.preferred] > 0){
73        train.seats[passenger.preferred]--
74        results.push({
75          name:passenger.name,
76          trainNumber:passenger.trainNumber,
77          class: passenger.preferred,
78          status:"confirmed"
79        })
80        continue
81      }
82      if(train.seats[passenger.fallback] > 0){
83        train.seats[passenger.fallback]--
84        results.push({
85          name:passenger.name,
86          trainNumber:passenger.trainNumber,
87          class: passenger.fallback,
88          status:"confirmed"
89        });
90        continue
91      }
92      results.push({
93        name: passenger.name,
94        trainNumber: passenger.trainNumber,
95        class: passenger.preferred,
96        status: "waitlisted"
97      })
98    }
99  return results
100  }
101