AdventJS - Reto #1: ¡Automatizando envolver regalos de navidad!
José Ayrám
Posted on December 10, 2022
Reto #1: ¡Automatizando envolver regalos de navidad!
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:
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:
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. -
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á:
Nos leemos en el siguiente reto.
Posted on December 10, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.