satyacode
Background
Back to js-datatype-intermediate

08-ipl-auction-purse.js

JavaScript
1/**
2 * 🏏 IPL Auction Purse Manager
3 *
4 * IPL mega auction chal rahi hai! Team ka total purse (budget) diya hai
5 * aur players ki list di hai jinhe khareedna hai. Tujhe calculate karna
6 * hai ki team ne kitna spend kiya, kitna bacha, aur kuch stats banana hai.
7 *
8 * Rules:
9 *   - team object: { name: "CSK", purse: 9000 } (purse in lakhs)
10 *   - players array: [{ name: "Dhoni", role: "wk", price: 1200 }, ...]
11 *   - role can be: "bat", "bowl", "ar" (all-rounder), "wk" (wicketkeeper)
12 *   - Calculate:
13 *     - totalSpent: sum of all player prices (use reduce)
14 *     - remaining: purse - totalSpent
15 *     - playerCount: total players bought
16 *     - costliestPlayer: player object with highest price
17 *     - cheapestPlayer: player object with lowest price
18 *     - averagePrice: Math.round(totalSpent / playerCount)
19 *     - byRole: object counting players per role using reduce
20 *       e.g., { bat: 3, bowl: 4, ar: 2, wk: 1 }
21 *     - isOverBudget: boolean, true agar totalSpent > purse
22 *   - Hint: Use reduce(), filter(), sort(), find(), every(), some(),
23 *     Array.isArray(), Math.round(), spread operator
24 *
25 * Validation:
26 *   - Agar team object nahi hai ya team.purse positive number nahi hai, return null
27 *   - Agar players array nahi hai ya empty hai, return null
28 *
29 * @param {{ name: string, purse: number }} team - Team info with budget
30 * @param {Array<{ name: string, role: string, price: number }>} players
31 * @returns {{ teamName: string, totalSpent: number, remaining: number, playerCount: number, costliestPlayer: object, cheapestPlayer: object, averagePrice: number, byRole: object, isOverBudget: boolean } | null}
32 *
33 * @example
34 *   iplAuctionSummary(
35 *     { name: "CSK", purse: 9000 },
36 *     [{ name: "Dhoni", role: "wk", price: 1200 }, { name: "Jadeja", role: "ar", price: 1600 }]
37 *   )
38 *   // => { teamName: "CSK", totalSpent: 2800, remaining: 6200, playerCount: 2,
39 *   //      costliestPlayer: { name: "Jadeja", role: "ar", price: 1600 },
40 *   //      cheapestPlayer: { name: "Dhoni", role: "wk", price: 1200 },
41 *   //      averagePrice: 1400, byRole: { wk: 1, ar: 1 }, isOverBudget: false }
42 *
43 *   iplAuctionSummary({ name: "RCB", purse: 500 }, [{ name: "Kohli", role: "bat", price: 1700 }])
44 *   // => { ..., remaining: -1200, isOverBudget: true }
45 */
46export function iplAuctionSummary(team, players) {
47  if( !team ||typeof team !== "object" ||team.purse == "null" || team.purse <= 0 || !Number.isFinite(team.purse)){
48    return null
49  }
50
51  if(!Array.isArray(players) || players.length === 0){
52    return null
53  }
54
55  const totalSpent = players.reduce((accumulator, value)=> value.price + accumulator, 0)
56  const remaining = team.purse - totalSpent;
57  
58  const playerCount = players.length
59
60  const costliestPlayer = players.reduce((maxPlayer, currentPlayer) => {
61  return currentPlayer.price > maxPlayer.price ? currentPlayer : maxPlayer;
62});
63
64    const cheapestPlayer = players.reduce((minPlayer, currentPlayer) => {
65     return currentPlayer.price < minPlayer.price ? currentPlayer : minPlayer;
66   });
67
68const averagePrice = Math.round(totalSpent/playerCount)
69
70const byRole = players.reduce((acc, player) => {
71  if (acc[player.role]) {
72    acc[player.role] += 1;
73  } else {
74    acc[player.role] = 1;
75  }
76  return acc;
77}, {});
78
79const isOverBudget = totalSpent > team.purse
80   return { teamName: team.name, totalSpent, remaining, playerCount, costliestPlayer, cheapestPlayer, averagePrice, byRole, isOverBudget }
81}
82