Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit c1e3c82

Browse files
✨ Add challenge-22 solution
1 parent f962cc0 commit c1e3c82

File tree

3 files changed

+188
-0
lines changed

3 files changed

+188
-0
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
# Reto 22: Genera-combinaciones-de-regalos
2+
3+
Santa Claus πŸŽ… estΓ‘ revisando una **lista de juguetes ΓΊnicos que podrΓ­a incluir en su bolsa mΓ‘gica de regalos.** Quiere explorar todas las combinaciones posibles de juguetes. Quiere ver todas las combinaciones que realmente contengan al menos un juguete.
4+
5+
Tu tarea es escribir una funciΓ³n que, dado un array de juguetes, **devuelva todas las combinaciones posibles.**
6+
7+
Importante: Debes devolverlo en el orden que aparecen los juguetes y de combinaciones de 1 a n juguetes.
8+
9+
```js
10+
generateGiftSets(['car', 'doll', 'puzzle'])
11+
// [
12+
// ['car'],
13+
// ['doll'],
14+
// ['puzzle'],
15+
// ['car', 'doll'],
16+
// ['car', 'puzzle'],
17+
// ['doll', 'puzzle'],
18+
// ['car', 'doll', 'puzzle']
19+
// ]
20+
21+
generateGiftSets(['ball'])
22+
// [
23+
// ['ball']
24+
// ]
25+
26+
generateGiftSets(['game', 'pc'])
27+
// [
28+
// ['game'],
29+
// ['pc'],
30+
// ['game', 'pc']
31+
// ]
32+
```
33+
34+
**Nota: En el array de entrada siempre habrΓ‘ al menos un juguete y nunca habrΓ‘ juguetes duplicados.**
35+
36+
**Consejo**: Hay muchas formas de solucionar este problema, pero el backtracking puede ser una buena opciΓ³n. πŸ˜‰
37+
38+
## Mi soluciΓ³n explicada
39+
40+
```js
41+
/* eslint-disable no-inner-declarations */
42+
function generateGiftSets(gifts) {
43+
const results = [];
44+
function backtracking(start, currentSet) {
45+
if (currentSet.length > 0) {
46+
results.push([...currentSet]);
47+
}
48+
49+
for (let i = start; i < gifts.length; i++) {
50+
currentSet.push(gifts[i]);
51+
backtracking(i + 1, currentSet);
52+
currentSet.pop();
53+
}
54+
}
55+
56+
backtracking(0, []);
57+
58+
return results.sort((a, b) => a.length - b.length);
59+
}
60+
```
61+
62+
Para poder resolver este problema, utilizaremos un enfoque de backtracking. A grandes rasgos, el backtracking es una tΓ©cnica que consiste en probar todas las posibles combinaciones de una soluciΓ³n, y si en algΓΊn momento nos damos cuenta de que no es posible llegar a una soluciΓ³n vΓ‘lida, retrocedemos y probamos otra combinaciΓ³n.
63+
64+
En este caso, la funciΓ³n `generateGiftSets` recibe un array de juguetes y devuelve todas las combinaciones posibles. Para ello, creamos un array `results` que almacenarΓ‘ todas las combinaciones vΓ‘lidas.
65+
66+
Dentro de la funciΓ³n `generateGiftSets`, definimos una funciΓ³n interna llamada `backtracking` que se encargarΓ‘ de generar las combinaciones. Esta funciΓ³n recibe dos parΓ‘metros: `start` (que indica la posiciΓ³n inicial desde la que se deben considerar los juguetes) y `currentSet` (que es el conjunto actual de juguetes que estamos evaluando).
67+
68+
En la funciΓ³n `backtracking`, primero verificamos si el conjunto actual `currentSet` tiene al menos un juguete, y si es asΓ­, lo agregamos al array `results`. Luego, recorremos los juguetes a partir de la posiciΓ³n `start` y vamos generando las combinaciones de forma recursiva. Para ello, agregamos un juguete al conjunto actual, llamamos a la funciΓ³n `backtracking` con la siguiente posiciΓ³n y el conjunto actual, y luego eliminamos el ΓΊltimo juguete agregado para probar con el siguiente. De esta forma, vamos generando todas las combinaciones posibles.
69+
70+
Finalmente, retornamos el array `results` ordenado por la longitud de cada combinaciΓ³n, de menor a mayor.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
function generateGiftSets(gifts) {
2+
const results = [];
3+
function backtracking(start, currentSet) {
4+
if (currentSet.length > 0) {
5+
results.push([...currentSet]);
6+
}
7+
8+
for (let i = start; i < gifts.length; i++) {
9+
currentSet.push(gifts[i]);
10+
backtracking(i + 1, currentSet);
11+
currentSet.pop();
12+
}
13+
}
14+
15+
backtracking(0, []);
16+
17+
return results.sort((a, b) => a.length - b.length);
18+
}
19+
module.exports = generateGiftSets;
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
const generateGiftSets = require('./index');
2+
3+
describe('22 => Genera-combinaciones-de-regalos', () => {
4+
const TEST_CASES = [
5+
{
6+
input: ['car'],
7+
output: [['car']],
8+
},
9+
{
10+
input: ['car', 'doll', 'puzzle'],
11+
output: [
12+
['car'],
13+
['doll'],
14+
['puzzle'],
15+
['car', 'doll'],
16+
['car', 'puzzle'],
17+
['doll', 'puzzle'],
18+
['car', 'doll', 'puzzle'],
19+
],
20+
},
21+
{
22+
input: ['car', 'doll'],
23+
output: [['car'], ['doll'], ['car', 'doll']],
24+
},
25+
{
26+
input: ['apple', 'banana', 'cherry', 'date'],
27+
output: [
28+
['apple'],
29+
['banana'],
30+
['cherry'],
31+
['date'],
32+
['apple', 'banana'],
33+
['apple', 'cherry'],
34+
['apple', 'date'],
35+
['banana', 'cherry'],
36+
['banana', 'date'],
37+
['cherry', 'date'],
38+
['apple', 'banana', 'cherry'],
39+
['apple', 'banana', 'date'],
40+
['apple', 'cherry', 'date'],
41+
['banana', 'cherry', 'date'],
42+
['apple', 'banana', 'cherry', 'date'],
43+
],
44+
},
45+
{
46+
input: ['pen', 'notebook', 'eraser', 'pencil', 'marker'],
47+
output: [
48+
['pen'],
49+
['notebook'],
50+
['eraser'],
51+
['pencil'],
52+
['marker'],
53+
['pen', 'notebook'],
54+
['pen', 'eraser'],
55+
['pen', 'pencil'],
56+
['pen', 'marker'],
57+
['notebook', 'eraser'],
58+
['notebook', 'pencil'],
59+
['notebook', 'marker'],
60+
['eraser', 'pencil'],
61+
['eraser', 'marker'],
62+
['pencil', 'marker'],
63+
['pen', 'notebook', 'eraser'],
64+
['pen', 'notebook', 'pencil'],
65+
['pen', 'notebook', 'marker'],
66+
['pen', 'eraser', 'pencil'],
67+
['pen', 'eraser', 'marker'],
68+
['pen', 'pencil', 'marker'],
69+
['notebook', 'eraser', 'pencil'],
70+
['notebook', 'eraser', 'marker'],
71+
['notebook', 'pencil', 'marker'],
72+
['eraser', 'pencil', 'marker'],
73+
['pen', 'notebook', 'eraser', 'pencil'],
74+
['pen', 'notebook', 'eraser', 'marker'],
75+
['pen', 'notebook', 'pencil', 'marker'],
76+
['pen', 'eraser', 'pencil', 'marker'],
77+
['notebook', 'eraser', 'pencil', 'marker'],
78+
['pen', 'notebook', 'eraser', 'pencil', 'marker'],
79+
],
80+
},
81+
{
82+
input: [],
83+
output: [],
84+
},
85+
];
86+
87+
it('should return array type', () => {
88+
const result = generateGiftSets(['car']);
89+
expect(Array.isArray(result)).toBe(true);
90+
});
91+
92+
it.each(TEST_CASES)(
93+
'should return an array with $output.length elements',
94+
({ input, output }) => {
95+
const result = generateGiftSets(input);
96+
expect(result).toHaveLength(output.length);
97+
},
98+
);
99+
});

0 commit comments

Comments
(0)

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /