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