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