Skip to content

Commit 15bcba4

Browse files
committed
Explicación Reto 8
1 parent 3eccb30 commit 15bcba4

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

retos/reto-8/README.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# Reto 8
2+
3+
Los elfos están muy ocupados en el taller de Santa Claus organizando regalos 🎁 para la víspera de Navidad 🎄.
4+
5+
El formato de entrada es especial, ya que indica el número de regalos y el tipo de regalo con letras de la a a la z. Por ejemplo, `'66a11b'` significa 66 regalos a y 11 regalos b.
6+
7+
Los elfos tienen un **sistema especial** para organizar los regalos:
8+
9+
- Cada 10 regalos del mismo tipo se empaquetan en una caja, representada por {x}. Por ejemplo, 20 regalos tipo a se empaquetan en 2 cajas así: {a}{a}.
10+
- Cada 5 cajas se apilan en un palé, representado por [x]. Por ejemplo, 10 cajas de a se apilan en 2 palés de esta manera: [a][a]
11+
- Cualquier regalo adicional se coloca en una bolsa, representada por () y se colocan todas dentro. Por ejemplo 4 regalos de b se colocan en una bolsa así (bbbb)
12+
13+
**Los regalos luego se colocan en el siguiente orden**: palés, cajas y bolsas. Y los regalos aparecen en el mismo orden que la cadena de entrada.
14+
15+
Tu tarea es escribir una función organizeGifts que tome una cadena de regalos como argumento y devuelva una cadena representando el almacén.
16+
17+
```js
18+
const result1 = organizeGifts(`76a11b`);
19+
console.log(result1);
20+
// '[a]{a}{a}(aaaaaa){b}(b)'
21+
22+
/* Explicación:
23+
24+
76a: 76 regalos tipo 'a' se empaquetarían en 7 cajas y sobrarían 6 regalos, resultando en 1 palé [a] (por las primeras 5 cajas), 2 cajas sueltas {a}{a} y una bolsa con 6 regalos (aaaaaa)
25+
26+
11b: 11 regalos tipo 'b' se empaquetarían en 1 caja y sobraría 1 regalo, resultando en 1 caja suelta {b} y una bolsa con 1 regalo (b) */
27+
```
28+
29+
# Solución
30+
31+
Por cada regalo debemos ir agrupandolos en cantidades de 50, luego de 10 y luego los sobrantes, es decir que por cada 50, vamos a tener un `[a]`, luego por cada 10 un `{a}` y luego por cada sobrante, los agregaremos dentro de parentesis, es decir que si nos sobran 4: `(aaaa)`
32+
33+
Para separar cada regalo y cada nombre del regalo podemos usar regex:
34+
35+
```js
36+
const countGifts = gifts.match(/\d+/g);
37+
const nameGifts = gifts.match(/[^0-9]/g);
38+
```
39+
40+
Ya solo quedaria ir iterando uno por uno agregando las cajas necesarias, siendo `c` la cantidad del regalo, `g` el nombre del regalo y `a` un string donde almacenamos las cajas:
41+
42+
```js
43+
c = +c;
44+
45+
a += `[${g}]`.repeat(c / 50);
46+
c %= 50;
47+
48+
a += `{${g}}`.repeat(c / 10);
49+
c %= 10;
50+
51+
a += `(${g.repeat(c)})`.repeat(+!!c);
52+
```
53+
54+
Solo queda unir estos strings y esa sería nuestra respuesta.
55+
56+
## Optimización
57+
58+
Si revisaste mi solución, verás algunas cosas raras, estas son importantes para lograr el puntaje más alto, ya que se encargan de reducir la complejidad.
59+
60+
### Ciclo con Complejidad 0
61+
62+
Al parecer, hacer uso de `for .. of` no aumenta la complejidad, este itera un arreglo, `countGifts`.
63+
64+
### Usar `.repeat()` para evitar el último condicional
65+
66+
Podemos usar repeat con el valor numerico del signo de `c`, ya que el caso en el que necesitamos que no se agreguen los regalos extra a la respuesta es cuando `c == 0`, así que si repetimos `+!!c` veces el texto, en el caso de `c == 0` se repetirá 0 veces y en cualquier otro caso solo 1.

0 commit comments

Comments
 (0)