Skip to content

Commit f8839e0

Browse files
authored
Merge pull request #41 from marcode24/2024-23
✨ Add challenge-23 solution
2 parents 32b628e + 920dc59 commit f8839e0

File tree

4 files changed

+174
-0
lines changed

4 files changed

+174
-0
lines changed

Diff for: 2024/23-encuentra-los-numeros-perdidos/README.md

+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# Reto 23: Encuentra-los-numeros-perdidos
2+
3+
Los elfos están trabajando en un sistema para verificar las listas de regalos de los niños 👧👦. Sin embargo, ¡algunas listas están incompletas y **faltan números**!
4+
5+
Tu tarea es escribir **una función que, dado un array de números, encuentre todos los números que faltan entre 1 y n** (donde n es el tamaño del array o el número más alto del array).
6+
7+
Eso sí, ten en cuenta que:
8+
9+
- Los números pueden aparecer más de una vez y otros pueden faltar
10+
- El array siempre contiene números enteros positivos
11+
- Siempre se empieza a contar desde el 1
12+
13+
```js
14+
findMissingNumbers([1, 2, 4, 6])
15+
// [3, 5]
16+
17+
findMissingNumbers([4, 8, 7, 2])
18+
// [1, 3, 5, 6]
19+
20+
findMissingNumbers([3, 2, 1, 1])
21+
// []
22+
23+
findDisappearedNumbers([5, 5, 5, 3, 3, 2, 1])
24+
// [4]
25+
```
26+
27+
## Mi solución explicada
28+
29+
**NOTA** Para correr este código necesitas la versión 22 o superior de Node.js. En caso contrario, puedes crear una función `difference` que haga lo mismo que `Set.prototype.difference`.
30+
31+
```js
32+
Set.prototype.difference = function (set) {
33+
return new Set([...this].filter((x) => !set.has(x)));
34+
};
35+
```
36+
37+
```js
38+
function findMissingNumbers(nums) {
39+
const maxNumber = Math.max(...nums);
40+
const fullSetOfNumbers = new Set(
41+
Array.from({ length: maxNumber }, (_, index) => index + 1),
42+
);
43+
const uniqueNumbers = new Set(nums);
44+
const missingNumbers = fullSetOfNumbers.difference(uniqueNumbers);
45+
return [...missingNumbers];
46+
}
47+
```
48+
49+
Para resolver este reto, utilice diferencia de conjuntos. Esto consiste en crear un conjunto con todos los números del 1 al número más alto del array, luego crear un conjunto con los números únicos del array y finalmente obtener la diferencia entre ambos conjuntos.
50+
51+
Para esto utilice el método `Math.max` para obtener el número más alto del array, luego cree un conjunto con todos los números del 1 al número más alto del array utilizando `Array.from` y `Set`. Después cree un conjunto con los números únicos del array utilizando `Set`. Finalmente obtuve la diferencia entre ambos conjuntos y devolví un array con los números faltantes.
52+
53+
**Veamos un ejemplo**:
54+
55+
Supongamos que tenemos el siguiente array:
56+
57+
```js
58+
const nums = [1, 2, 4, 6];
59+
```
60+
61+
Primero obtenemos el número más alto del array, en este caso es el número 6:
62+
63+
```js
64+
const maxNumber = Math.max(...nums);
65+
// const maxNumber = Math.max(...[1, 2, 4, 6]);
66+
// const maxNumber = Math.max(1, 2, 4, 6);
67+
const maxNumber = 6;
68+
```
69+
70+
Luego creamos un conjunto con todos los números del 1 al número más alto del array, para este caso utilizamos `Array.from` y `Set`, donde `Array.from` crea un array con los números del 1 al 6 y `Set` convierte ese array en un conjunto:
71+
72+
```js
73+
const fullSetOfNumbers = new Set(
74+
Array.from({ length: maxNumber }, (_, index) => index + 1),
75+
);
76+
77+
// Array.from({ length: 6 }, (_, index) => index + 1);
78+
// Array.from([undefined, undefined, undefined, undefined, undefined, undefined], (_, index) => index + 1);
79+
// [1, 2, 3, 4, 5, 6]
80+
81+
// new Set([1, 2, 3, 4, 5, 6]);
82+
83+
const fullSetOfNumbers = new Set([1, 2, 3, 4, 5, 6]);
84+
```
85+
86+
Después creamos un conjunto con los números únicos del array, para este caso utilizamos `Set`:
87+
88+
```js
89+
const uniqueNumbers = new Set(nums);
90+
// const uniqueNumbers = new Set([1, 2, 4, 6]);
91+
const uniqueNumbers = new Set([1, 2, 4, 6]);
92+
```
93+
94+
Finalmente obtenemos la diferencia entre ambos conjuntos, para esto utilizamos el método `difference` que creamos previamente:
95+
96+
```js
97+
const missingNumbers = fullSetOfNumbers.difference(uniqueNumbers);
98+
// const missingNumbers = [1, 2, 3, 4, 5, 6].difference([1, 2, 4, 6]);
99+
// const missingNumbers = [3, 5];
100+
const missingNumbers = [3, 5];
101+
```
102+
103+
`difference` lo que hace es obtener la diferencia entre ambos conjuntos, es decir, los números que están en el primer conjunto pero no en el segundo. Por ejemplo: la diferencia de elementos que esta en `fullSetOfNumbers` pero no en `uniqueNumbers`, es decir, si `fullSetOfNumbers` es `[1, 2, 3, 4, 5, 6]` y `uniqueNumbers` es `[1, 2, 4, 6]`, entonces la diferencia es `[3, 5]`, que son los números faltantes.
104+
105+
Y devolvemos un array con los números faltantes:
106+
107+
```js
108+
return [...missingNumbers];
109+
// return [3, 5];
110+
return [3, 5];
111+
```
112+
113+
Así es como resolví este reto utilizando diferencia de conjuntos 🎉

Diff for: 2024/23-encuentra-los-numeros-perdidos/index.js

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/* eslint-disable func-names */
2+
/* eslint-disable no-extend-native */
3+
Set.prototype.difference = function (set) {
4+
return new Set([...this].filter((x) => !set.has(x)));
5+
};
6+
7+
// La función de set.difference() esta disponible desde la version 22 de nodejs
8+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/difference#browser_compatibility
9+
// Para poder utilizarla en versiones anteriores de nodejs, se debe de agregar la función al prototipo de Set
10+
11+
function findMissingNumbers(nums) {
12+
const maxNumber = Math.max(...nums);
13+
const fullSetOfNumbers = new Set(
14+
Array.from({ length: maxNumber }, (_, index) => index + 1),
15+
);
16+
const uniqueNumbers = new Set(nums);
17+
const missingNumbers = fullSetOfNumbers.difference(uniqueNumbers);
18+
return [...missingNumbers];
19+
}
20+
21+
module.exports = findMissingNumbers;

Diff for: 2024/23-encuentra-los-numeros-perdidos/index.test.js

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const findMissingNumbers = require('./index');
2+
3+
describe('23 => Encuentra-los-numeros-perdidos', () => {
4+
const TEST_CASES = [
5+
{
6+
input: [1, 2, 4, 6],
7+
output: [3, 5],
8+
},
9+
{
10+
input: [4, 8, 7, 2],
11+
output: [1, 3, 5, 6],
12+
},
13+
{
14+
input: [3, 2, 1, 1],
15+
output: [],
16+
},
17+
{
18+
input: [5, 5, 5, 3, 3, 2, 1],
19+
output: [4],
20+
},
21+
{
22+
input: [1, 2, 3, 4, 5],
23+
output: [],
24+
},
25+
];
26+
27+
it('should return an array', () => {
28+
const result = findMissingNumbers([1, 2, 4, 6]);
29+
expect(Array.isArray(result)).toBe(true);
30+
});
31+
32+
it.each(TEST_CASES)(
33+
'should return the missing numbers',
34+
({ input, output }) => {
35+
const result = findMissingNumbers(input);
36+
expect(result).toEqual(output);
37+
},
38+
);
39+
});

Diff for: README.md

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ npm run test 'year'/'challenge'/index.test.js
8181
| 20 | [🎁 Encuentra los regalos faltantes y duplicados](https://adventjs.dev/es/challenges/2024/20) | 🟢 | [here](./2024/20-encuentra-los-regalos-faltantes-y-duplicados/index.js) | [here](./2024/20-encuentra-los-regalos-faltantes-y-duplicados/README.md#mi-solución-explicada) | ⭐⭐⭐⭐⭐ |
8282
| 21 | [🎄 Calcula la altura del árbol de Navidad](https://adventjs.dev/es/challenges/2024/21) | 🟢 | [here](./2024/21-calcula-la-altura-del-arbol-de-navidad/index.js) | [here](./2024/21-calcula-la-altura-del-arbol-de-navidad/README.md#mi-solución-explicada) | ⭐⭐⭐⭐⭐ |
8383
| 22 | [🎁 Genera combinaciones de regalos](https://adventjs.dev/es/challenges/2024/22) | 🟡 | [here](./2024/22-genera-combinaciones-de-regalos/index.js) | [here](./2024/22-genera-combinaciones-de-regalos/README.md#mi-solución-explicada) | ⭐⭐⭐⭐⭐ |
84+
| 23 | [🔢 Encuentra los números perdidos](https://adventjs.dev/es/challenges/2024/23) | 🟢 | [here](./2024/23-encuentra-los-numeros-perdidos/index.js) | [here](./2024/23-encuentra-los-numeros-perdidos/README.md#mi-solución-explicada) | ⭐⭐⭐⭐⭐ |
8485

8586
Difficulties legend:
8687
🟢 Easy 🟡 Medium 🔴 Hard

0 commit comments

Comments
 (0)