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