From d13ee4fa441a4eba0440de96380d1efe54427b4c Mon Sep 17 00:00:00 2001 From: Marco Cruz Date: Tue, 10 Dec 2024 16:51:05 -0600 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=20Add=20challenge-11=20solution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md | 87 +++++++++++++++++++ .../index.js | 7 ++ .../index.test.js | 35 ++++++++ 3 files changed, 129 insertions(+) create mode 100644 2024/11-nombres-de-archivos-codificados/README.md create mode 100644 2024/11-nombres-de-archivos-codificados/index.js create mode 100644 2024/11-nombres-de-archivos-codificados/index.test.js diff --git a/2024/11-nombres-de-archivos-codificados/README.md b/2024/11-nombres-de-archivos-codificados/README.md new file mode 100644 index 0000000..329ea66 --- /dev/null +++ b/2024/11-nombres-de-archivos-codificados/README.md @@ -0,0 +1,87 @@ +# Reto 11: Nombres-de-archivos-codificados + +**El Grinch ha hackeado 🏴‍☠️ los sistemas del taller de Santa Claus** y ha codificado los nombres de todos los archivos importantes. Ahora los elfos no pueden encontrar los archivos originales y necesitan tu ayuda para descifrar los nombres. + +Cada archivo sigue este formato: + +- Comienza con un número (puede contener cualquier cantidad de dígitos). +- Luego tiene un guion bajo `_`. +- Continúa con un **nombre de archivo y su extensión.** +- Finaliza con una extensión extra al final (que no necesitamos). + +Ten en cuenta que el nombre de los archivos pueden contener letras (a-z, A-Z), números (0-9), **otros guiones bajos** (_) y guiones (-). + +Tu tarea es implementar una función que reciba un string con el nombre de un archivo codificado y devuelva solo la parte importante: **el nombre del archivo y su extensión.** + +Ejemplos: + +```js +decodeFilename('2023122512345678_sleighDesign.png.grinchwa') +// ➞ "sleighDesign.png" + +decodeFilename('42_chimney_dimensions.pdf.hack2023') +// ➞ "chimney_dimensions.pdf" + +decodeFilename('987654321_elf-roster.csv.tempfile') +// ➞ "elf-roster.csv" +``` + +## Mi solución explicada + +```js +function decodeFilename(filename) { + const underscoreIndex = filename.indexOf('_'); + const lastDotIndex = filename.lastIndexOf('.'); + return filename.slice(underscoreIndex + 1, lastDotIndex); +} +``` + +Para resolver este reto, de manera sencilla, he utilizado el método `slice()` para extraer la parte del string que necesitamos. ¿Como es que funciona `slice()`? Lo que hace es devolver una copia de una parte del string, desde el índice inicial hasta el índice final (sin incluirlo). Ejemplo: + +```js +const str = 'Hello, World!'; +console.log(str.slice(7, 12)); // "World" +``` + +En este caso, `slice(7, 12)` extrae la parte del string desde el índice 7 hasta el índice 12 (sin incluirlo), devolviendo `"World"`. + +Ahora, para resolver este reto, he utilizado `slice()` de la siguiente manera: + +Primero, obtengo el índice del guion bajo `_` con el método `indexOf()`. ¿Por qué el primer guion bajo? Porque el número que está al principio del string es lo que no necesitamos. + +Luego, obtengo el índice del último punto `.` con el método `lastIndexOf()`. ¿Por qué el último punto? Porque el punto que está al final del string es lo que no necesitamos. + +Finalmente, utilizo el método `slice()` para extraer la parte del string que necesitamos. + +Veamos con un ejemplo: + +Supongamos que tengo la siguiente cadena: + +```js +const filename = '2023122512345678_sleighDesign.png.grinchwa'; +``` + +Primero, obtengo el índice del primer guion bajo `_` con el método `indexOf()`: + +```js +// const underscoreIndex = '2023122512345678_sleighDesign.png.grinchwa'.indexOf('_'); +const underscoreIndex = filename.indexOf('_'); // 16 +``` + +Luego, obtengo el índice del último punto `.` con el método `lastIndexOf()`: + +```js +// const lastDotIndex = '2023122512345678_sleighDesign.png.grinchwa'.lastIndexOf('.'); +const lastDotIndex = filename.lastIndexOf('.'); // 29 +``` + +Finalmente, utilizo el método `slice()` para extraer la parte del string que necesitamos: + +```js +// return '2023122512345678_sleighDesign.png.grinchwa'.slice(underscoreIndex + 1, lastDotIndex); +return filename.slice(underscoreIndex + 1, lastDotIndex); // "sleighDesign.png" +``` + +Y eso es todo lo que necesitamos para resolver este reto. 🎉 + +**Igual podemos hacerlo con expresiones regulares, pero esta solución es más sencilla y fácil de entender.** diff --git a/2024/11-nombres-de-archivos-codificados/index.js b/2024/11-nombres-de-archivos-codificados/index.js new file mode 100644 index 0000000..408966c --- /dev/null +++ b/2024/11-nombres-de-archivos-codificados/index.js @@ -0,0 +1,7 @@ +function decodeFilename(filename) { + const underscoreIndex = filename.indexOf('_'); + const lastDotIndex = filename.lastIndexOf('.'); + return filename.slice(underscoreIndex + 1, lastDotIndex); +} + +module.exports = decodeFilename; diff --git a/2024/11-nombres-de-archivos-codificados/index.test.js b/2024/11-nombres-de-archivos-codificados/index.test.js new file mode 100644 index 0000000..f98bc4a --- /dev/null +++ b/2024/11-nombres-de-archivos-codificados/index.test.js @@ -0,0 +1,35 @@ +const decodeFilename = require('./index'); + +describe('11 => Nombres-de-archivos-codificados', () => { + const TEST_CASES = [ + { + input: '2023122512345678_sleighDesign.png.grinchwa', + output: 'sleighDesign.png', + }, + { + input: '42_chimney_dimensions.pdf.hack2023', + output: 'chimney_dimensions.pdf', + }, + { + input: '987654321_elf-roster.csv.tempfile', + output: 'elf-roster.csv', + }, + { + input: '2024120912345678_magic_wand-blueprint.jpg.grinchbackup', + output: 'magic_wand-blueprint.jpg', + }, + { + input: '51231_trainSchedule.txt.extra', + output: 'trainSchedule.txt', + }, + ]; + + it('should return string type', () => { + const testCase = TEST_CASES[0]; + expect(typeof decodeFilename(testCase.input)).toBe('string'); + }); + + it.each(TEST_CASES)('should return $output', ({ input, output }) => { + expect(decodeFilename(input)).toBe(output); + }); +}); From 012c2b848d60e40e5b7850957aa2f224690ee93c Mon Sep 17 00:00:00 2001 From: Marco Cruz Date: Tue, 10 Dec 2024 16:57:59 -0600 Subject: [PATCH 2/3] =?UTF-8?q?=E2=9C=A8=20Add=20challenge-11=20solution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2024/11-nombres-de-archivos-codificados/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/2024/11-nombres-de-archivos-codificados/README.md b/2024/11-nombres-de-archivos-codificados/README.md index 329ea66..343efc2 100644 --- a/2024/11-nombres-de-archivos-codificados/README.md +++ b/2024/11-nombres-de-archivos-codificados/README.md @@ -72,13 +72,15 @@ Luego, obtengo el índice del último punto `.` con el método `lastIndexOf()`: ```js // const lastDotIndex = '2023122512345678_sleighDesign.png.grinchwa'.lastIndexOf('.'); -const lastDotIndex = filename.lastIndexOf('.'); // 29 +const lastDotIndex = filename.lastIndexOf('.'); // 33 ``` Finalmente, utilizo el método `slice()` para extraer la parte del string que necesitamos: ```js // return '2023122512345678_sleighDesign.png.grinchwa'.slice(underscoreIndex + 1, lastDotIndex); +// return '2023122512345678_sleighDesign.png.grinchwa'.slice(16 + 1, 33); +// return '2023122512345678_sleighDesign.png.grinchwa'.slice(17, 33); return filename.slice(underscoreIndex + 1, lastDotIndex); // "sleighDesign.png" ``` From c86ed58039cfbf6bf04da8dc9adc3a3efcef28f0 Mon Sep 17 00:00:00 2001 From: Marco Cruz Date: Tue, 10 Dec 2024 16:59:28 -0600 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=93=9D=20Update=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f48531e..23b9287 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,7 @@ npm run test 'year'/'challenge'/index.test.js | 08 | [🦌 La carrera de renos](https://adventjs.dev/es/challenges/2024/8) | 🟢 | [here](./2024/08-la-carrera-de-renos/index.js) | ⭐⭐⭐⭐⭐ | | 09 | [🚂 El tren mágico](https://adventjs.dev/es/challenges/2024/9) | 🟡 | [here](./2024/09-el-tren-magico/index.js) | ⭐⭐⭐⭐⭐ | | 10 | [🧑‍💻 El ensamblador élfico](https://adventjs.dev/es/challenges/2024/10) | 🟡 | [here](./2024/10-el-ensamblador-elfico/index.js) | ⭐⭐⭐⭐⭐ | +| 11 | [📂 Nombres de archivos codificados](https://adventjs.dev/es/challenges/2024/11) | 🟢 | [here](./2024/11-nombres-de-archivos-codificados/index.js) | ⭐⭐⭐⭐⭐ | Difficulties legend: 🟢 Easy 🟡 Medium 🔴 Hard