Skip to content

Commit 0ee1e24

Browse files
authored
Merge pull request #6 from marcode24/2023-02
📦 update package
2 parents 7d31613 + b23c28d commit 0ee1e24

File tree

12 files changed

+368
-6
lines changed

12 files changed

+368
-6
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Reto 02: Ponemos en marcha la fabrica
2+
3+
## Problema
4+
5+
En el taller de Santa, los elfos tienen una lista de regalos que desean fabricar y un conjunto limitado de materiales.
6+
7+
Los regalos son cadenas de texto y los materiales son caracteres. Tu tarea es escribir una función que, dada una lista de regalos y los materiales disponibles, devuelva una lista de los regalos que se pueden fabricar.
8+
9+
Un regalo se puede fabricar si contamos con todos los materiales necesarios para fabricarlo.
10+
11+
```js
12+
const gifts = ['tren', 'oso', 'pelota']
13+
const materials = 'tronesa'
14+
15+
manufacture(gifts, materials) // ["tren", "oso"]
16+
// 'tren' SÍ porque sus letras están en 'tronesa'
17+
// 'oso' SÍ porque sus letras están en 'tronesa'
18+
// 'pelota' NO porque sus letras NO están en 'tronesa'
19+
20+
const gifts = ['juego', 'puzzle']
21+
const materials = 'jlepuz'
22+
23+
manufacture(gifts, materials) // ["puzzle"]
24+
25+
const gifts = ['libro', 'ps5']
26+
const materials = 'psli'
27+
28+
manufacture(gifts, materials) // []
29+
```
30+
31+
## Mi solución
32+
33+
```js
34+
const manufacture = (gifts, materials) => gifts.filter((gift) => (
35+
[...gift].every((letter) => materials.includes(letter))));
36+
```
37+
38+
## Explicación de mi solución
39+
40+
1. Utilizo el método `filter` para filtrar los regalos que se pueden fabricar. Para ello, utilizo el método `every` para comprobar que todas las letras del regalo están en los materiales disponibles. Para ello, convierto el regalo en un array de letras utilizando el operador de propagación `...` y compruebo que todas las letras están en los materiales utilizando el método `includes`.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
const manufacture = (gifts, materials) => gifts.filter((gift) => (
2+
[...gift].every((letter) => materials.includes(letter))));
3+
4+
module.exports = manufacture;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const manufacture = require('./index');
2+
3+
describe('02 => Ponemos en marcha la fabrica', () => {
4+
const testCases = [
5+
{
6+
input: [['tren', 'oso', 'pelota'], 'tronesa'],
7+
output: ['tren', 'oso'],
8+
},
9+
{
10+
input: [['coche', 'muñeca', 'balon'], 'ocmuñalb'],
11+
output: [],
12+
},
13+
{
14+
input: [['patineta', 'robot', 'libro'], 'nopor'],
15+
output: [],
16+
},
17+
{
18+
input: [[], 'letras'],
19+
output: [],
20+
},
21+
{
22+
input: [['juego', 'puzzle'], 'jlepuz'],
23+
output: ['puzzle'],
24+
},
25+
];
26+
27+
it('should return an array type ', () => {
28+
expect(Array.isArray(manufacture(['a'], ['a']))).toBe(true);
29+
});
30+
31+
it.each(testCases)('should return $output', ({ input, output }) => {
32+
expect(manufacture(...input)).toEqual(output);
33+
});
34+
});

2023/03-el-elfo-travieso/README.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Reto 03: El elfo travieso
2+
3+
## Problema
4+
5+
En el taller de Santa, **un elfo travieso** ha estado jugando en la cadena de fabricación de regalos, añadiendo o eliminando un paso no planificado.
6+
7+
Tienes la secuencia original de pasos en la fabricación original y la secuencia modificada modified que puede incluir un paso extra o faltar un paso.
8+
9+
Tu tarea **es escribir una función que identifique y devuelva el primer paso extra que se ha añadido o eliminado en la cadena de fabricación.** Si no hay ninguna diferencia entre las secuencias, devuelve una cadena vacía.
10+
11+
```js
12+
const original = 'abcd'
13+
const modified = 'abcde'
14+
findNaughtyStep(original, modified) // 'e'
15+
16+
const original = 'stepfor'
17+
const modified = 'stepor'
18+
findNaughtyStep(original, modified) // 'f'
19+
20+
const original = 'abcde'
21+
const modified = 'abcde'
22+
findNaughtyStep(original, modified) // ''
23+
```
24+
25+
A tener en cuenta:
26+
27+
- **Siempre habrá un paso de diferencia o ninguno.**
28+
- **La modificación puede ocurrir en cualquier lugar de la cadena.**
29+
- **La secuencia original puede estar vacía**

2023/03-el-elfo-travieso/index.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const findNaughtyStep = (original, modified) => {
2+
const maxLength = Math.max(original.length, modified.length);
3+
4+
for (let i = 0; i < maxLength; i++) {
5+
if (original[i] !== modified[i]) {
6+
return original.length > modified.length ? original[i] : modified[i];
7+
}
8+
}
9+
10+
return '';
11+
};
12+
13+
module.exports = findNaughtyStep;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const findNaughtyStep = require('./index');
2+
3+
describe('03 => El elfo travieso', () => {
4+
const testCases = [
5+
{
6+
input: ['abcd', 'abcde'],
7+
output: 'e',
8+
},
9+
{
10+
input: ['abcde', 'abcd'],
11+
output: 'e',
12+
},
13+
{
14+
input: ['xxxx', 'xxoxx'],
15+
output: 'o',
16+
},
17+
{
18+
input: ['stepfor', 'stepor'],
19+
output: 'f',
20+
},
21+
{
22+
input: ['iiiii', 'iiiii'],
23+
output: '',
24+
},
25+
];
26+
27+
it('should return a string type', () => {
28+
expect(typeof findNaughtyStep('a', 'a')).toBe('string');
29+
});
30+
31+
it.each(testCases)('should return $output', ({ input, output }) => {
32+
expect(findNaughtyStep(...input)).toBe(output);
33+
});
34+
});
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# Reto 04: Dale la vuelta a los parentesis
2+
3+
## Problema
4+
5+
En el taller de Santa 🎅, algunos mensajes navideños han sido escritos de manera peculiar: **las letras dentro de los paréntesis deben ser leídas al revés**
6+
7+
**Santa necesita que estos mensajes estén correctamente formateados.** Tu tarea es escribir una función que tome una cadena de texto y revierta los caracteres dentro de cada par de paréntesis, eliminando los paréntesis en el mensaje final.
8+
9+
Eso sí, ten en cuenta que **pueden existir paréntesis anidados**, por lo que debes invertir los caracteres en el orden correcto.
10+
11+
```js
12+
const a = decode('hola (odnum)')
13+
console.log(a) // hola mundo
14+
15+
const b = decode('(olleh) (dlrow)!')
16+
console.log(b) // hello world!
17+
18+
const c = decode('sa(u(cla)atn)s')
19+
console.log(c) // santaclaus
20+
21+
// Paso a paso:
22+
// 1. Invertimos el anidado -> sa(ualcatn)s
23+
// 2. Invertimos el que queda -> santaclaus
24+
```
25+
26+
Notas:
27+
28+
- Las cadenas de entrada siempre estarán bien formadas con paréntesis que coinciden correctamente, no necesitas validarlos.
29+
- En el mensaje final no deben quedar paréntesis.
30+
- El nivel máximo de anidamiento es 2.
31+
32+
## Mi solución
33+
34+
**Solucion 1:**
35+
36+
```js
37+
const decode = (message) => {
38+
let result = '';
39+
const stack = [];
40+
41+
[...message].forEach((char) => {
42+
if (char === '(') {
43+
stack.push(result);
44+
result = '';
45+
} else if (char === ')') {
46+
result = `${stack.pop()}${result.split('').reverse().join('')}`;
47+
} else {
48+
result += char;
49+
}
50+
});
51+
52+
return result;
53+
};
54+
```
55+
56+
**Solucion 2:**
57+
58+
```js
59+
const decode2 = (message) => {
60+
const regex = /\(([^()]+)\)/;
61+
let match = message.match(regex);
62+
while (match) {
63+
const reversed = match[1].split('').reverse().join('');
64+
message = message.replace(match[0], reversed);
65+
match = message.match(regex);
66+
}
67+
return message;
68+
};
69+
```
70+
71+
## Explicación de mi solución
72+
73+
**Solucion 1:**
74+
75+
1. Inicializo la variable `result` a una cadena vacía y la variable `stack` a un array vacío.
76+
2. Convierto la cadena de entrada en un array de caracteres utilizando el operador de propagación `...` y recorro el array utilizando el método `forEach`.
77+
3. Si el caracter es un paréntesis de apertura, añado el valor de `result` al array `stack` y reinicio `result` a una cadena vacía.
78+
4. Si el caracter es un paréntesis de cierre, invierto el valor de `result` y lo concateno con el último valor del array `stack`.
79+
5. Si el caracter no es un paréntesis, lo añado a `result`.
80+
6. Devuelvo `result`.
81+
82+
**Solucion 2:**
83+
84+
1. Utilizo una expresión regular para buscar el primer paréntesis de apertura y cierre con cualquier caracter entre ellos.
85+
2. Mientras exista un paréntesis de apertura y cierre, invierto los caracteres entre los paréntesis y los reemplazo en la cadena de entrada.
86+
3. Devuelvo la cadena de entrada.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// complejidad: 3
2+
const decode = (message) => {
3+
let result = '';
4+
const stack = [];
5+
6+
[...message].forEach((char) => {
7+
if (char === '(') {
8+
stack.push(result);
9+
result = '';
10+
} else if (char === ')') {
11+
result = `${stack.pop()}${result.split('').reverse().join('')}`;
12+
} else {
13+
result += char;
14+
}
15+
});
16+
17+
return result;
18+
};
19+
20+
// complejidad: 2
21+
const decode2 = (message) => {
22+
const regex = /\(([^()]+)\)/;
23+
let match = message.match(regex);
24+
while (match) {
25+
const reversed = match[1].split('').reverse().join('');
26+
message = message.replace(match[0], reversed);
27+
match = message.match(regex);
28+
}
29+
return message;
30+
};
31+
32+
module.exports = {
33+
decode,
34+
decode2,
35+
};
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
const { decode, decode2 } = require('./index');
2+
3+
describe('04 => Dale la vuelta a los parentesis', () => {
4+
const testCases = [
5+
{
6+
input: 'hola (odnum)',
7+
output: 'hola mundo',
8+
},
9+
{
10+
input: '(olleh) (dlrow)!',
11+
output: 'hello world!',
12+
},
13+
{
14+
input: 'sa(u(cla)atn)s',
15+
output: 'santaclaus',
16+
},
17+
{
18+
input: '((nta)(sa))',
19+
output: 'santa',
20+
},
21+
];
22+
23+
it('should return a string type', () => {
24+
expect(typeof decode('a')).toBe('string');
25+
expect(typeof decode2('a')).toBe('string');
26+
});
27+
28+
it.each(testCases)('should return $output', ({ input, output }) => {
29+
expect(decode(input)).toBe(output);
30+
expect(decode2(input)).toBe(output);
31+
});
32+
});

README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@ Built by [@midudev](https://twitter.com/midudev)
88

99
## 🎯 2023 Challenges
1010

11-
<details>
12-
<summary show>Show / Hide</summary>
11+
<details open>
12+
<summary>Show / Hide</summary>
1313

14-
| # | Challenge | Difficulty | My Solution |
15-
| :-: | ------------------------------------------------------------------------------------------- | :--------: | :------------------------------------------------------------------------------------------------: |
16-
| 01 | [¡Primer regalo repetido!](https://adventjs.dev/es/challenges/2023/1) | 🟢 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/01-primer-regalo-repetido) |
14+
| # | Challenge | Difficulty | My Solution |
15+
| :-: | ------------------------------------------------------------------------------------------- | :--------: | :------------------------------------------------------------------------------------------------------------: |
16+
| 01 | [¡Primer regalo repetido!](https://adventjs.dev/es/challenges/2023/1) | 🟢 | [here](https://github.com/marcode24/adventjs-solutions/tree/main/2023/01-primer-regalo-repetido) |
17+
| 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) |
18+
| 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) |
19+
| 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) |
1720

1821
Difficulties legend:
1922
🟢 Easy 🟡 Medium 🔴 Hard

0 commit comments

Comments
 (0)