From d6b5a91bb1c6d2faf612b75955cca8e558b4864a Mon Sep 17 00:00:00 2001 From: marco cruz Date: Sun, 10 Dec 2023 16:56:45 -0600 Subject: [PATCH 1/2] :sparkles: add challenge-10 solution --- .../README.md | 74 +++++++++++++++++++ .../index.js | 22 ++++++ .../index.test.js | 30 ++++++++ 3 files changed, 126 insertions(+) create mode 100644 2023/10-crea-tu-propio-arbol-de-navidad/README.md create mode 100644 2023/10-crea-tu-propio-arbol-de-navidad/index.js create mode 100644 2023/10-crea-tu-propio-arbol-de-navidad/index.test.js diff --git a/2023/10-crea-tu-propio-arbol-de-navidad/README.md b/2023/10-crea-tu-propio-arbol-de-navidad/README.md new file mode 100644 index 0000000..e1e3ba7 --- /dev/null +++ b/2023/10-crea-tu-propio-arbol-de-navidad/README.md @@ -0,0 +1,74 @@ +# Reto 10: Crea tu propio arbol de navidad + +## Problema + +¡Vaya idea ha tenido Sam Elfman! Quiere ofrecer un servicio que te crea un **árbol de Navidad 🎄 personalizado** en cuestión de segundos. + +Para crearlo nos pasan una **cadena de caracteres para formar el árbol** y un **número que indica la altura del mismo.** + +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.** + +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.` + +Por ejemplo si recibimos la cadena "123" y el número 4 como altura, tendríamos que construir este árbol: + +```txt + 1 + 2 3 + 1 2 3 +1 2 3 1 + | +``` + +Si recibimos la cadena *@o y el número 3, el árbol que debemos devolver es: + +```txt + * + @ o +* @ o + | +``` + +Nota: + +- **El árbol siempre debe estar centrado, para ello añade espacios en blanco a la izquierda de cada línea.** +- **Crea espacios sólo a la izquierda de cada línea del árbol. No dejes espacios en blanco a la derecha.** +- **Los adornos tienen un espacio en blanco entre ellos de separación.** + +## Mi solución + +```js +const createChristmasTree = (ornaments, height) => { + const heightSucessive = (height / 2) * (height + 1); + const repeatOrnaments = [ + ...ornaments.repeat((heightSucessive / ornaments.length) + 1), + ].join(' '); + const spaces = ' '.repeat(height - 1); + + let tree = ''; + let i = 0; + let counter = 0; + while (counter < height) { + const ornamentsLine = repeatOrnaments.substring(i, i + 2 * counter + 1); + const level = `${spaces.substring(counter)}${ornamentsLine}\n`; + tree += level; + i += 2 * (counter + 1); + counter++; + } + + return `${tree}${' '.repeat(height - 1)}|\n`; +}; +``` + +## Explicación de mi solución + +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. +2. Repito la cadena de adornos la cantidad de veces necesaria para tener la cantidad de adornos necesarios. +3. Creo una variable para guardar el árbol. +4. Creo un bucle que se repita tantas veces como niveles tenga el árbol. +5. En cada iteración, creo una variable para guardar los adornos de ese nivel. +6. Creo una variable para guardar los espacios en blanco que necesito para centrar los adornos. +7. Creo una variable para guardar el nivel del árbol. +8. Concateno el nivel del árbol a la variable del árbol. +9. Incremento el contador de niveles. +10. Devuelvo el árbol. diff --git a/2023/10-crea-tu-propio-arbol-de-navidad/index.js b/2023/10-crea-tu-propio-arbol-de-navidad/index.js new file mode 100644 index 0000000..def63a3 --- /dev/null +++ b/2023/10-crea-tu-propio-arbol-de-navidad/index.js @@ -0,0 +1,22 @@ +const createChristmasTree = (ornaments, height) => { + const heightSucessive = (height / 2) * (height + 1); + const repeatOrnaments = [ + ...ornaments.repeat((heightSucessive / ornaments.length) + 1), + ].join(' '); + const spaces = ' '.repeat(height - 1); + + let tree = ''; + let i = 0; + let counter = 0; + while (counter < height) { + const ornamentsLine = repeatOrnaments.substring(i, i + 2 * counter + 1); + const level = `${spaces.substring(counter)}${ornamentsLine}\n`; + tree += level; + i += 2 * (counter + 1); + counter++; + } + + return `${tree}${' '.repeat(height - 1)}|\n`; +}; + +module.exports = createChristmasTree; diff --git a/2023/10-crea-tu-propio-arbol-de-navidad/index.test.js b/2023/10-crea-tu-propio-arbol-de-navidad/index.test.js new file mode 100644 index 0000000..5026ab9 --- /dev/null +++ b/2023/10-crea-tu-propio-arbol-de-navidad/index.test.js @@ -0,0 +1,30 @@ +const createChristmasTree = require('./index'); + +describe('10 => Crea tu propio arbol de navidad', () => { + const testCases = [ + { + input: ['x', 3], + output: ' x\n x x\nx x x\n |\n', + }, + { + input: ['xo', 4], + output: ' x\n o x\n o x o\nx o x o\n |\n', + }, + { + input: ['123', 5], + output: ' 1\n 2 3\n 1 2 3\n 1 2 3 1\n2 3 1 2 3\n |\n', + }, + { + input: ['*@o', 3], + output: ' *\n @ o\n* @ o\n |\n', + }, + ]; + + it('should return a string type', () => { + expect(typeof createChristmasTree('x', 3)).toBe('string'); + }); + + it.each(testCases)('should return the correct output', (testCase) => { + expect(createChristmasTree(...testCase.input)).toBe(testCase.output); + }); +}); From d50e0d6857115d8052389c95ee173b96bf7a813d Mon Sep 17 00:00:00 2001 From: marco cruz Date: Sun, 10 Dec 2023 17:05:40 -0600 Subject: [PATCH 2/2] :memo: update README --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index bf859b2..b9aa761 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,12 @@ npm run test 'year'/'challenge'/index.test.js | 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) | | 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) | | 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) | +| 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) | +| 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) | +| 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) | +| 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) | +| 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) | +| 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) | Difficulties legend: 🟢 Easy 🟡 Medium 🔴 Hard