Skip to content

Commit caaea83

Browse files
mouredev#31 - javascript
1 parent cd455da commit caaea83

File tree

1 file changed

+309
-0
lines changed

1 file changed

+309
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,309 @@
1+
//#31 - Simulador Juegos Olímpicos
2+
/*
3+
* EJERCICIO:
4+
* ¡Los JJOO de París 2024 han comenzado!
5+
* Crea un programa que simule la celebración de los juegos.
6+
* El programa debe permitir al usuario registrar eventos y participantes,
7+
* realizar la simulación de los eventos asignando posiciones de manera aleatoria
8+
* y generar un informe final. Todo ello por terminal.
9+
* Requisitos:
10+
* 1. Registrar eventos deportivos.
11+
* 2. Registrar participantes por nombre y país.
12+
* 3. Simular eventos de manera aleatoria en base a los participantes (mínimo 3).
13+
* 4. Asignar medallas (oro, plata y bronce) basándose en el resultado del evento.
14+
* 5. Mostrar los ganadores por cada evento.
15+
* 6. Mostrar el ranking de países según el número de medallas.
16+
* Acciones:
17+
* 1. Registro de eventos.
18+
* 2. Registro de participantes.
19+
* 3. Simulación de eventos.
20+
* 4. Creación de informes.
21+
* 5. Salir del programa.
22+
*/
23+
24+
let log = console.log;
25+
26+
window.addEventListener('load', ()=>{
27+
const body = document.querySelector('body');
28+
const title = document.createElement('h1');
29+
30+
body.style.setProperty('background', '#000');
31+
body.style.setProperty('text-align', 'center');
32+
33+
title.textContent = 'Retosparaprogramadores #31.';
34+
title.style.setProperty('font-size', '3.5vmax');
35+
title.style.setProperty('color', '#fff');
36+
title.style.setProperty('line-height', '100vh');
37+
38+
body.appendChild(title);
39+
40+
setTimeout(()=>{
41+
alert('Retosparaprogramadores #31. Please open the Browser Developer Tools.');
42+
}, 2000);
43+
log( 'Retosparaprogramadores #31');
44+
});
45+
46+
function shuffleArray(array) {
47+
for (let i = array.length - 1; i > 0; i--) {
48+
const j = Math.floor(Math.random() * (i + 1));
49+
[array[i], array[j]] = [array[j], array[i]];
50+
}
51+
return array;
52+
}
53+
54+
class Events {
55+
constructor() {
56+
this.events = {};
57+
this.prizes = new Prizes();
58+
}
59+
60+
addEvent(event) {
61+
if (this.events[event]) {
62+
log(`There's a ${event} event already registered.`);
63+
} else {
64+
this.events[event] = [];
65+
log(`Event ${event} registered.`);
66+
}
67+
}
68+
69+
addPlayer(player) {
70+
if (!this.events[player.event]) {
71+
log(`Event ${player.event} is not registered.`);
72+
return;
73+
}
74+
75+
let isPlayer = this.events[player.event].find(p => p.name === player.name);
76+
if (!isPlayer) {
77+
this.events[player.event].push(player);
78+
log(`Player ${player.name} added to ${player.event} event.`);
79+
} else {
80+
log(`The player ${player.name} is already registered to ${player.event} event.`);
81+
}
82+
}
83+
84+
randomEvents() {
85+
let eventsList = Object.keys(this.events);
86+
return shuffleArray(eventsList);
87+
}
88+
89+
showParticipantsForEvent(event) {
90+
if (this.events[event]) {
91+
log(`Participants for ${event} event:`);
92+
this.events[event].forEach(p => log(`${p.name} from ${p.country}`));
93+
} else {
94+
log(`There's no participant registered for the ${event} event.`);
95+
}
96+
}
97+
98+
showRegistryData() {
99+
for (let key in this.events) {
100+
log(`${key} event:`);
101+
this.events[key].forEach(element => {
102+
log(`${element.name} from ${element.country}`);
103+
});
104+
}
105+
}
106+
}
107+
108+
class Player {
109+
constructor(name, event, country) {
110+
this.name = name;
111+
this.country = country;
112+
this.event = event;
113+
}
114+
}
115+
116+
class Prizes {
117+
constructor() {
118+
this.gold = {};
119+
this.silver = {};
120+
this.bronze = {};
121+
this.countryMedals = {};
122+
}
123+
124+
addGold(player) {
125+
this.addPrize(player, 'gold');
126+
}
127+
128+
addSilver(player) {
129+
this.addPrize(player, 'silver');
130+
}
131+
132+
addBronze(player) {
133+
this.addPrize(player, 'bronze');
134+
}
135+
136+
addPrize(player, type) {
137+
if (!this[type][player.event]) {
138+
this[type][player.event] = [];
139+
}
140+
if (!this[type][player.event].find(p => p.name === player.name)) {
141+
this[type][player.event].push(player);
142+
this.countCountryMedal(player.country, type);
143+
}
144+
}
145+
146+
countCountryMedal(country, type) {
147+
if (!this.countryMedals[country]) {
148+
this.countryMedals[country] = { gold: 0, silver: 0, bronze: 0 };
149+
}
150+
this.countryMedals[country][type]++;
151+
}
152+
153+
showWinners() {
154+
log('Winners:');
155+
for (let event in this.gold) {
156+
log(`${event}: Gold - ${this.gold[event].map(p => p.name).join(', ')}`);
157+
log(` Silver - ${this.silver[event] ? this.silver[event].map(p => p.name).join(', ') : 'None'}`);
158+
log(` Bronze - ${this.bronze[event] ? this.bronze[event].map(p => p.name).join(', ') : 'None'}`);
159+
}
160+
}
161+
162+
showCountryMedals() {
163+
log('Country Medal Count:');
164+
for (let country in this.countryMedals) {
165+
log(`${country}: Gold - ${this.countryMedals[country].gold}, Silver - ${this.countryMedals[country].silver}, Bronze - ${this.countryMedals[country].bronze}`);
166+
}
167+
}
168+
}
169+
170+
const eventSimulator = (events) => {
171+
for (let key in events.events) {
172+
if (events.events[key].length >= 3) {
173+
let winners = shuffleArray(events.events[key]);
174+
events.prizes.addGold(winners[0]);
175+
events.prizes.addSilver(winners[1]);
176+
events.prizes.addBronze(winners[2]);
177+
} else {
178+
log(`Not enough participants for ${key} event.`);
179+
}
180+
}
181+
events.prizes.showWinners();
182+
}
183+
184+
let dummyData = [
185+
['Bob Marley', 'Archery', 'Jamaica'],
186+
['Lenny Kravitz', 'Swimming', 'USA'],
187+
['John Lennon', 'Weightlifting', 'England'],
188+
['Lorenna McKennit', '100m Sprint', 'Somewhere in Europe'],
189+
['Alice', '200m Freestyle', 'The Rabbit Hole'],
190+
['Che Guevara', '3000m Steeplechase', 'Argentina'],
191+
['Buda', 'Discus Throw', 'India'],
192+
['Bugs Bunny', 'Archery', 'Disney'],
193+
['Asterix', 'Swimming', 'Comics'],
194+
['Lucky Luke', 'Weightlifting', 'Comics'],
195+
['Jerry Maguire', '100m Sprint', 'Comics'],
196+
['Atreyo', '200m Freestyle', 'Book'],
197+
['Simón Bolívar', '3000m Steeplechase', 'Venezuela'],
198+
['Goku', 'Discus Throw', 'Anime'],
199+
['Shihiro', 'Archery', 'Anime'],
200+
['Ruby', 'Swimming', 'Book'],
201+
['Crows', 'Weightlifting', 'Book'],
202+
['Devian', '100m Sprint', 'Book'],
203+
['Peque', '200m Freestyle', 'My World'],
204+
['Sophy', '3000m Steeplechase', 'My World'],
205+
['Beth', 'Discus Throw', 'My World']
206+
];
207+
208+
209+
let firstRound = new Events();
210+
211+
const olympicEvents = ['Archery', 'Swimming', 'Weightlifting', '100m Sprint', '200m Freestyle', '3000m Steeplechase', 'Discus Throw'].forEach(event => firstRound.addEvent(event));
212+
213+
dummyData.forEach(d => firstRound.addPlayer(new Player(d[0], d[1], d[2])));
214+
215+
firstRound.showRegistryData();
216+
217+
eventSimulator(firstRound);
218+
219+
/* Possible Output:
220+
221+
Register events
222+
Updated list of events
223+
224+
Event Archery registered.
225+
Event Swimming registered.
226+
Event Weightlifting registered.
227+
Event 100m Sprint registered.
228+
Event 200m Freestyle registered.
229+
Event 3000m Steeplechase registered.
230+
Event Discus Throw registered.
231+
232+
Register players
233+
234+
Player Bob Marley added to Archery event.
235+
Player Lenny Kravitz added to Swimming event.
236+
Player John Lennon added to Weightlifting event.
237+
Player Lorenna McKennit added to 100m Sprint event.
238+
Player Alice added to 200m Freestyle event.
239+
Player Che Guevara added to 3000m Steeplechase event.
240+
Player Buda added to Discus Throw event.
241+
Player Bugs Bunny added to Archery event.
242+
Player Asterix added to Swimming event.
243+
Player Lucky Luke added to Weightlifting event.
244+
Player Jerry Maguire added to 100m Sprint event.
245+
Player Atreyo added to 200m Freestyle event.
246+
Player Simón Bolívar added to 3000m Steeplechase event.
247+
Player Goku added to Discus Throw event.
248+
Player Shihiro added to Archery event.
249+
Player Ruby added to Swimming event.
250+
Player Crows added to Weightlifting event.
251+
Player Devian added to 100m Sprint event.
252+
Player Peque added to 200m Freestyle event.
253+
Player Sophy added to 3000m Steeplechase event.
254+
Player Beth added to Discus Throw event.
255+
256+
Show registered data
257+
258+
Simulate events
259+
Archery event:
260+
Bob Marley from Jamaica
261+
Bugs Bunny from Disney
262+
Shihiro from Anime
263+
Swimming event:
264+
Lenny Kravitz from USA
265+
Asterix from Comics
266+
Ruby from Book
267+
Weightlifting event:
268+
John Lennon from England
269+
Lucky Luke from Comics
270+
Crows from Book
271+
100m Sprint event:
272+
Lorenna McKennit from Somewhere in Europe
273+
Jerry Maguire from Comics
274+
Devian from Book
275+
200m Freestyle event:
276+
Alice from The Rabbit Hole
277+
Atreyo from Book
278+
Peque from My World
279+
3000m Steeplechase event:
280+
Che Guevara from Argentina
281+
Simón Bolívar from Venezuela
282+
Sophy from My World
283+
Discus Throw event:
284+
Buda from India
285+
Goku from Anime
286+
Beth from My World
287+
Winners:
288+
Archery: Gold - Shihiro
289+
Silver - Bob Marley
290+
Bronze - Bugs Bunny
291+
Swimming: Gold - Lenny Kravitz
292+
Silver - Ruby
293+
Bronze - Asterix
294+
Weightlifting: Gold - Crows
295+
Silver - John Lennon
296+
Bronze - Lucky Luke
297+
100m Sprint: Gold - Jerry Maguire
298+
Silver - Lorenna McKennit
299+
Bronze - Devian
300+
200m Freestyle: Gold - Peque
301+
Silver - Alice
302+
Bronze - Atreyo
303+
3000m Steeplechase: Gold - Simón Bolívar
304+
Silver - Sophy
305+
Bronze - Che Guevara
306+
Discus Throw: Gold - Goku
307+
Silver - Buda
308+
Bronze - Beth
309+
*/

0 commit comments

Comments
 (0)