Skip to content

Commit 8c29618

Browse files
authored
Merge pull request #12 from marcode24/2023
✨ add challenge-10 solution
2 parents 3b83a6d + d50e0d6 commit 8c29618

File tree

4 files changed

+132
-0
lines changed

4 files changed

+132
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const createChristmasTree = (ornaments, height) => {
2+
const heightSucessive = (height / 2) * (height + 1);
3+
const repeatOrnaments = [
4+
...ornaments.repeat((heightSucessive / ornaments.length) + 1),
5+
].join(' ');
6+
const spaces = ' '.repeat(height - 1);
7+
8+
let tree = '';
9+
let i = 0;
10+
let counter = 0;
11+
while (counter < height) {
12+
const ornamentsLine = repeatOrnaments.substring(i, i + 2 * counter + 1);
13+
const level = `${spaces.substring(counter)}${ornamentsLine}\n`;
14+
tree += level;
15+
i += 2 * (counter + 1);
16+
counter++;
17+
}
18+
19+
return `${tree}${' '.repeat(height - 1)}|\n`;
20+
};
21+
22+
module.exports = createChristmasTree;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const createChristmasTree = require('./index');
2+
3+
describe('10 => Crea tu propio arbol de navidad', () => {
4+
const testCases = [
5+
{
6+
input: ['x', 3],
7+
output: ' x\n x x\nx x x\n |\n',
8+
},
9+
{
10+
input: ['xo', 4],
11+
output: ' x\n o x\n o x o\nx o x o\n |\n',
12+
},
13+
{
14+
input: ['123', 5],
15+
output: ' 1\n 2 3\n 1 2 3\n 1 2 3 1\n2 3 1 2 3\n |\n',
16+
},
17+
{
18+
input: ['*@o', 3],
19+
output: ' *\n @ o\n* @ o\n |\n',
20+
},
21+
];
22+
23+
it('should return a string type', () => {
24+
expect(typeof createChristmasTree('x', 3)).toBe('string');
25+
});
26+
27+
it.each(testCases)('should return the correct output', (testCase) => {
28+
expect(createChristmasTree(...testCase.input)).toBe(testCase.output);
29+
});
30+
});

README.md

+6
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ npm run test 'year'/'challenge'/index.test.js
6161
| 02 | [Ponemos en marcha la fábrica](https://adventjs.dev/es/challenges/2023/2) | 🟢 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/02-ponemos-en-marcha-la-fabrica) |
6262
| 03 | [El elfo travieso](https://adventjs.dev/es/challenges/2023/3) | 🟢 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/03-el-elfo-travieso) |
6363
| 04 | [Dale la vuelta a los paréntesis](https://adventjs.dev/es/challenges/2023/4) | 🟡 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/04-dale-la-vuelta-a-los-parentesis) |
64+
| 05 | [El cybertruck de santa](https://adventjs.dev/es/challenges/2023/5) | 🟡 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/05-el-cybertruck-de-santa) |
65+
| 06 | [Los renos a prueba](https://adventjs.dev/es/challenges/2023/6) | 🟢 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/06-los-renos-a-prueba) |
66+
| 07 | [Las cajas en 3D](https://adventjs.dev/es/challenges/2023/7) | 🟢 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/07-las-cajas-en-3d) |
67+
| 08 | [Ordenando el almácen](https://adventjs.dev/es/challenges/2023/8) | 🟡 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/08-ordenando-el-almacen) |
68+
| 09 | [Alterna las luces](https://adventjs.dev/es/challenges/2023/9) | 🟢 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/09-alterna-las-luces) |
69+
| 10 | [Crea tu propio árbol de navidad](https://adventjs.dev/es/challenges/2023/10) | 🟢 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/10-crea-tu-propio-arbol-de-navidad) |
6470

6571
Difficulties legend:
6672
🟢 Easy 🟡 Medium 🔴 Hard

0 commit comments

Comments
 (0)