|
| 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