AdventJS - Reto #1: ¡Automatizando envolver regalos de navidad!
Tags: javascript, typescript, adventjs, adventofcode
Published: 2022-12-10 00:12:45

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/13fw2r43bpu6z2bedfm5.png)

### [Reto #1: ¡Automatizando envolver regalos de navidad!](https://adventjs.dev/es/challenges/2022/1)

**Instrucciones:**

Este año los elfos han comprado una máquina que envuelve regalos. Pero… ¡no viene programada! Necesitamos crear un algoritmo que le ayude en la tarea.

A la máquina se le pasa un array con los regalos. Cada regalo es un string. Necesitamos que la máquina envuelva cada regalo en papel de regalo y lo coloque en un array de regalos envueltos.

El papel de regalo es el símbolo `*` y para envolver un regalo se coloca el símbolo `*` de forma que rodee totalmente al string por todos los lados. Por ejemplo:

```javascript
const gifts = ['cat', 'game', 'socks']
const wrapped = wrapping(gifts)

console.log(wrapped)
/* [
  "*****\n*cat*\n*****",
  "******\n*game*\n******",
  "*******\n*socks*\n*******"
] */
```

Como ves, el papel de regalo envuelve el string. Por arriba y por abajo, para no dejar ningún hueco, las esquinas también están cubiertas por el papel de regalo.

**Nota**: El carácter `\n` representa un salto de línea.

**¡Ojo!** Asegúrate que pones el número correcto de * para envolver completamente el string. Pero no demasiados. Sólo los necesarios para cubrir el string.

Ah, **y no modifiques (mutes) el array original**.

**_Lo anterior son las instrucciones originales descritas en la página del reto._**

**¡OJO! Si aún no has completado el reto, no sigas leyendo porque el spoiler será en grande.** 😁

**Mi solución:**

La intención del reto es que cualquier texto dentro del arreglo de datos quede "cubierto" de asteriscos por todos sus lados sin excedernos. Es decir, el resultado final debe ser algo como esto:

```
*****
*cat*
*****
```
Si te fijas bien, cada palabra quedará envuelta en una especie de cajita de regalos formada por los propios asteriscos. Entonces, si lees los ejemplos del enunciado, te darás cuenta que cada palabra tiene una línea superior, una inferior y dos laterales, todas formadas... ¿Con qué? Si, exacto, con asteriscos.

Para ello deberás recorrer el arreglo y tener en cuenta el tamaño de la palabra para colocar la cantidad de `*` justas y necesarias.

Veamos el código que luego pasaré a explicar con un poco más de detalle:

```javascript
function wrapping(gifts) {
  let wrapped = [];
  gifts.forEach(function(value) {
    let len = value.length + 2;    
    let gift = "\n*"+value+"*\n";
    let startEnd = "*".repeat(len);
    let wrap = startEnd + gift + startEnd;    
    wrapped.push(wrap);       
  })
  return wrapped;
}
```
**Nota**: _Hay mejores soluciones pero les comparto con la primera opción que pasé el reto_. (Al final del artículo compartiré las que vaya encontrando).

**Explicación:**

- `let wrapped = [];` Inicializo el arreglo que almacenará los regalos envueltos.
- `gifts.forEach(function(value){}` Recorro el arreglo inicial para tratar los datos.
- `let len = value.length + 2;` Declaro una variable en donde tomo el tamaño del string que leo y le sumo siempre 2 para que quede cubierto por encima y por debajo. 
- `let gift = "\n*"+value+"*\n";` La palabra estará envuelta en sus laterales siempre con 1 asterisco de cada lado y se agregan los saltos de líneas (`\n`) correspondientes.
- `let startEnd = "*".repeat(len);` En esta variable creo el string correspondiente a la cantidad de asteriscos necesarios según el tamaño que habíamos calculado anteriormente, para ello, se utiliza el método **[repeat](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/String/repeat)**.
- `let wrap = startEnd + gift + startEnd;` Concateno de la forma más sencilla posible la línea inicial, la palabra envuelta y la línea final.
- `wrapped.push(wrap);` Agrego al arreglo declarado inicialmente el string ya envuelto.
- `return wrapped;` Devuelvo los regalos envueltos y hago felices a muchos niños en esta navidad 😃

**Resultado:**
- 127 puntos
- Complejidad cognitiva: 1
- 2925 ops/s (Aunque en un principio marcó sobre los 3k)

A medida que fui leyendo del proyecto me encontré con algunas publicaciones que me han servido de inspiración y para comparar los resultados. Se las dejo por acá:

- [Serie Advent.js 2022 de Cristian Fernando - Reto #1](https://dev.to/duxtech/adventjs-reto-1-automatizando-envolver-regalos-de-navidad-133n)
- [Canal YouTube asdex dev - Reto #1](https://www.youtube.com/watch?v=MDoLaXWLvFg)

Nos leemos en el siguiente reto.