Skip to content

Commit d2ed47b

Browse files
authored
Merge pull request #29 from marcode24/2024-11
✨ Add challenge-11 solution
2 parents a3ea249 + c86ed58 commit d2ed47b

File tree

4 files changed

+132
-0
lines changed

4 files changed

+132
-0
lines changed
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# Reto 11: Nombres-de-archivos-codificados
2+
3+
**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.
4+
5+
Cada archivo sigue este formato:
6+
7+
- Comienza con un número (puede contener cualquier cantidad de dígitos).
8+
- Luego tiene un guion bajo `_`.
9+
- Continúa con un **nombre de archivo y su extensión.**
10+
- Finaliza con una extensión extra al final (que no necesitamos).
11+
12+
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 (-).
13+
14+
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.**
15+
16+
Ejemplos:
17+
18+
```js
19+
decodeFilename('2023122512345678_sleighDesign.png.grinchwa')
20+
// ➞ "sleighDesign.png"
21+
22+
decodeFilename('42_chimney_dimensions.pdf.hack2023')
23+
// ➞ "chimney_dimensions.pdf"
24+
25+
decodeFilename('987654321_elf-roster.csv.tempfile')
26+
// ➞ "elf-roster.csv"
27+
```
28+
29+
## Mi solución explicada
30+
31+
```js
32+
function decodeFilename(filename) {
33+
const underscoreIndex = filename.indexOf('_');
34+
const lastDotIndex = filename.lastIndexOf('.');
35+
return filename.slice(underscoreIndex + 1, lastDotIndex);
36+
}
37+
```
38+
39+
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:
40+
41+
```js
42+
const str = 'Hello, World!';
43+
console.log(str.slice(7, 12)); // "World"
44+
```
45+
46+
En este caso, `slice(7, 12)` extrae la parte del string desde el índice 7 hasta el índice 12 (sin incluirlo), devolviendo `"World"`.
47+
48+
Ahora, para resolver este reto, he utilizado `slice()` de la siguiente manera:
49+
50+
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.
51+
52+
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.
53+
54+
Finalmente, utilizo el método `slice()` para extraer la parte del string que necesitamos.
55+
56+
Veamos con un ejemplo:
57+
58+
Supongamos que tengo la siguiente cadena:
59+
60+
```js
61+
const filename = '2023122512345678_sleighDesign.png.grinchwa';
62+
```
63+
64+
Primero, obtengo el índice del primer guion bajo `_` con el método `indexOf()`:
65+
66+
```js
67+
// const underscoreIndex = '2023122512345678_sleighDesign.png.grinchwa'.indexOf('_');
68+
const underscoreIndex = filename.indexOf('_'); // 16
69+
```
70+
71+
Luego, obtengo el índice del último punto `.` con el método `lastIndexOf()`:
72+
73+
```js
74+
// const lastDotIndex = '2023122512345678_sleighDesign.png.grinchwa'.lastIndexOf('.');
75+
const lastDotIndex = filename.lastIndexOf('.'); // 33
76+
```
77+
78+
Finalmente, utilizo el método `slice()` para extraer la parte del string que necesitamos:
79+
80+
```js
81+
// return '2023122512345678_sleighDesign.png.grinchwa'.slice(underscoreIndex + 1, lastDotIndex);
82+
// return '2023122512345678_sleighDesign.png.grinchwa'.slice(16 + 1, 33);
83+
// return '2023122512345678_sleighDesign.png.grinchwa'.slice(17, 33);
84+
return filename.slice(underscoreIndex + 1, lastDotIndex); // "sleighDesign.png"
85+
```
86+
87+
Y eso es todo lo que necesitamos para resolver este reto. 🎉
88+
89+
**Igual podemos hacerlo con expresiones regulares, pero esta solución es más sencilla y fácil de entender.**
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
function decodeFilename(filename) {
2+
const underscoreIndex = filename.indexOf('_');
3+
const lastDotIndex = filename.lastIndexOf('.');
4+
return filename.slice(underscoreIndex + 1, lastDotIndex);
5+
}
6+
7+
module.exports = decodeFilename;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const decodeFilename = require('./index');
2+
3+
describe('11 => Nombres-de-archivos-codificados', () => {
4+
const TEST_CASES = [
5+
{
6+
input: '2023122512345678_sleighDesign.png.grinchwa',
7+
output: 'sleighDesign.png',
8+
},
9+
{
10+
input: '42_chimney_dimensions.pdf.hack2023',
11+
output: 'chimney_dimensions.pdf',
12+
},
13+
{
14+
input: '987654321_elf-roster.csv.tempfile',
15+
output: 'elf-roster.csv',
16+
},
17+
{
18+
input: '2024120912345678_magic_wand-blueprint.jpg.grinchbackup',
19+
output: 'magic_wand-blueprint.jpg',
20+
},
21+
{
22+
input: '51231_trainSchedule.txt.extra',
23+
output: 'trainSchedule.txt',
24+
},
25+
];
26+
27+
it('should return string type', () => {
28+
const testCase = TEST_CASES[0];
29+
expect(typeof decodeFilename(testCase.input)).toBe('string');
30+
});
31+
32+
it.each(TEST_CASES)('should return $output', ({ input, output }) => {
33+
expect(decodeFilename(input)).toBe(output);
34+
});
35+
});

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ npm run test 'year'/'challenge'/index.test.js
6969
| 08 | [🦌 La carrera de renos](https://adventjs.dev/es/challenges/2024/8) | 🟢 | [here](./2024/08-la-carrera-de-renos/index.js) | ⭐⭐⭐⭐⭐ |
7070
| 09 | [🚂 El tren mágico](https://adventjs.dev/es/challenges/2024/9) | 🟡 | [here](./2024/09-el-tren-magico/index.js) | ⭐⭐⭐⭐⭐ |
7171
| 10 | [🧑‍💻 El ensamblador élfico](https://adventjs.dev/es/challenges/2024/10) | 🟡 | [here](./2024/10-el-ensamblador-elfico/index.js) | ⭐⭐⭐⭐⭐ |
72+
| 11 | [📂 Nombres de archivos codificados](https://adventjs.dev/es/challenges/2024/11) | 🟢 | [here](./2024/11-nombres-de-archivos-codificados/index.js) | ⭐⭐⭐⭐⭐ |
7273

7374
Difficulties legend:
7475
🟢 Easy 🟡 Medium 🔴 Hard

0 commit comments

Comments
 (0)