|
| 1 | +# Reto 10: Crea tu propio arbol de navidad |
| 2 | + |
| 3 | +## Problema |
| 4 | + |
| 5 | +¡Vaya idea ha tenido Sam Elfman! Quiere ofrecer un servicio que te crea un **árbol de Navidad 🎄 personalizado** en cuestión de segundos. |
| 6 | + |
| 7 | +Para crearlo nos pasan una **cadena de caracteres para formar el árbol** y un **número que indica la altura del mismo.** |
| 8 | + |
| 9 | +Cada carácter de la cadena representa un adorno del árbol, y vamos utilizándolos **de forma cíclica** hasta llegar a la altura indicada. **Como mínimo siempre nos pasarán uno.** |
| 10 | + |
| 11 | +Debemos devolver un **string** multilínea con el árbol de Navidad formado con los adornos, la altura indicada **más una última línea con el tronco formado por el carácter |** en el centro y, finalmente, un salto de línea `\n.` |
| 12 | + |
| 13 | +Por ejemplo si recibimos la cadena "123" y el número 4 como altura, tendríamos que construir este árbol: |
| 14 | + |
| 15 | +```txt |
| 16 | + 1 |
| 17 | + 2 3 |
| 18 | + 1 2 3 |
| 19 | +1 2 3 1 |
| 20 | + | |
| 21 | +``` |
| 22 | + |
| 23 | +Si recibimos la cadena *@o y el número 3, el árbol que debemos devolver es: |
| 24 | + |
| 25 | +```txt |
| 26 | + * |
| 27 | + @ o |
| 28 | +* @ o |
| 29 | + | |
| 30 | +``` |
| 31 | + |
| 32 | +Nota: |
| 33 | + |
| 34 | +- **El árbol siempre debe estar centrado, para ello añade espacios en blanco a la izquierda de cada línea.** |
| 35 | +- **Crea espacios sólo a la izquierda de cada línea del árbol. No dejes espacios en blanco a la derecha.** |
| 36 | +- **Los adornos tienen un espacio en blanco entre ellos de separación.** |
| 37 | + |
| 38 | +## Mi solución |
| 39 | + |
| 40 | +```js |
| 41 | +const createChristmasTree = (ornaments, height) => { |
| 42 | + const heightSucessive = (height / 2) * (height + 1); |
| 43 | + const repeatOrnaments = [ |
| 44 | + ...ornaments.repeat((heightSucessive / ornaments.length) + 1), |
| 45 | + ].join(' '); |
| 46 | + const spaces = ' '.repeat(height - 1); |
| 47 | + |
| 48 | + let tree = ''; |
| 49 | + let i = 0; |
| 50 | + let counter = 0; |
| 51 | + while (counter < height) { |
| 52 | + const ornamentsLine = repeatOrnaments.substring(i, i + 2 * counter + 1); |
| 53 | + const level = `${spaces.substring(counter)}${ornamentsLine}\n`; |
| 54 | + tree += level; |
| 55 | + i += 2 * (counter + 1); |
| 56 | + counter++; |
| 57 | + } |
| 58 | + |
| 59 | + return `${tree}${' '.repeat(height - 1)}|\n`; |
| 60 | +}; |
| 61 | +``` |
| 62 | + |
| 63 | +## Explicación de mi solución |
| 64 | + |
| 65 | +1. Calculo la cantidad de adornos que necesito para la altura indicada, teniendo en cuenta que cada nivel tiene un adorno más que el anterior. |
| 66 | +2. Repito la cadena de adornos la cantidad de veces necesaria para tener la cantidad de adornos necesarios. |
| 67 | +3. Creo una variable para guardar el árbol. |
| 68 | +4. Creo un bucle que se repita tantas veces como niveles tenga el árbol. |
| 69 | +5. En cada iteración, creo una variable para guardar los adornos de ese nivel. |
| 70 | +6. Creo una variable para guardar los espacios en blanco que necesito para centrar los adornos. |
| 71 | +7. Creo una variable para guardar el nivel del árbol. |
| 72 | +8. Concateno el nivel del árbol a la variable del árbol. |
| 73 | +9. Incremento el contador de niveles. |
| 74 | +10. Devuelvo el árbol. |
0 commit comments