Skip to content

Commit e228204

Browse files
authored
Merge pull request #10 from marcode24/2023
✨ add challenge-08 solution
2 parents 19c786c + b4f8b51 commit e228204

File tree

3 files changed

+110
-0
lines changed

3 files changed

+110
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# Reto 08: Ordenando el almacen
2+
3+
## Problema
4+
5+
Los elfos están muy ocupados en el taller de Santa Claus organizando regalos 🎁 para la víspera de Navidad 🎄.
6+
7+
El formato de entrada es especial, ya que indica el número de regalos y el tipo de regalo con letras de la a a la z. Por ejemplo, '66a11b' significa 66 regalos a y 11 regalos b.
8+
9+
Los elfos tienen un **sistema especial** para organizar los regalos:
10+
11+
- Cada 10 regalos del mismo tipo se empaquetan en una caja, representada por {x}. Por ejemplo, 20 regalos tipo a se empaquetan en 2 cajas así: {a}{a}.
12+
- Cada 5 cajas se apilan en un palé, representado por [x]. Por ejemplo, 10 cajas de a se apilan en 2 palés de esta manera: `[a][a]`
13+
- Cualquier regalo adicional se coloca en una bolsa, representada por () y se colocan todas dentro. Por ejemplo 4 regalos de b se colocan en una bolsa así (bbbb)
14+
15+
**Los regalos luego se colocan en el siguiente orden:** palés, cajas y bolsas. Y los regalos aparecen en el mismo orden que la cadena de entrada.
16+
17+
Tu tarea es escribir una función `organizeGifts` que tome una cadena de regalos como argumento y devuelva una cadena representando el almacén.
18+
19+
```js
20+
const result1 = organizeGifts(`76a11b`)
21+
console.log(result1)
22+
// '[a]{a}{a}(aaaaaa){b}(b)'
23+
24+
/* Explicación:
25+
26+
76a: 76 regalos tipo 'a' se empaquetarían en 7 cajas y sobrarían 6 regalos, resultando en 1 palé [a] (por las primeras 5 cajas), 2 cajas sueltas {a}{a} y una bolsa con 6 regalos (aaaaaa)
27+
28+
11b: 11 regalos tipo 'b' se empaquetarían en 1 caja y sobraría 1 regalo, resultando en 1 caja suelta {b} y una bolsa con 1 regalo (b)
29+
*/
30+
```
31+
32+
## Mi solución
33+
34+
```js
35+
const organizeGifts = (gifts) => {
36+
const PALLET_SIZE = 50;
37+
const BOX_SIZE = 10;
38+
39+
const giftsArray = gifts.match(/\d+[a-z]/g);
40+
return giftsArray.map((gift) => {
41+
const [quantity, type] = gift.match(/(\d+)([a-z])/).slice(1);
42+
const pales = Math.floor(quantity / PALLET_SIZE);
43+
const boxes = (quantity % PALLET_SIZE) / BOX_SIZE;
44+
const bags = quantity % BOX_SIZE;
45+
46+
return `[${type}]`.repeat(pales)
47+
+ `{${type}}`.repeat(boxes)
48+
+ `(${type.repeat(bags)})`.repeat(bags > 0);
49+
}).join('');
50+
};
51+
```
52+
53+
## Explicación de mi solución
54+
55+
1. Primero, se define el tamaño de los palés y de las cajas.
56+
2. Luego, se obtiene un array con los regalos y su cantidad.
57+
3. Después, se itera sobre el array de regalos y se calcula la cantidad de palés, cajas y bolsas que se necesitan para cada regalo.
58+
4. Finalmente, se retorna un string con el almacén organizado.

2023/08-ordenando-el-almacen/index.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
const organizeGifts = (gifts) => {
2+
const PALLET_SIZE = 50;
3+
const BOX_SIZE = 10;
4+
5+
const giftsArray = gifts.match(/\d+[a-z]/g);
6+
return giftsArray.map((gift) => {
7+
const [quantity, type] = gift.match(/(\d+)([a-z])/).slice(1);
8+
const pales = Math.floor(quantity / PALLET_SIZE);
9+
const boxes = (quantity % PALLET_SIZE) / BOX_SIZE;
10+
const bags = quantity % BOX_SIZE;
11+
12+
return `[${type}]`.repeat(pales)
13+
+ `{${type}}`.repeat(boxes)
14+
+ `(${type.repeat(bags)})`.repeat(bags > 0);
15+
}).join('');
16+
};
17+
18+
module.exports = organizeGifts;
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
const organizeGifts = require('./index');
2+
3+
describe('08 => Ordenando el almacen', () => {
4+
const testCases = [
5+
{
6+
input: '76a11b',
7+
output: '[a]{a}{a}(aaaaaa){b}(b)',
8+
},
9+
{
10+
input: '20a',
11+
output: '{a}{a}',
12+
},
13+
{
14+
input: '70b120a4c',
15+
output: '[b]{b}{b}[a][a]{a}{a}(cccc)',
16+
},
17+
{
18+
input: '9c',
19+
output: '(ccccccccc)',
20+
},
21+
{
22+
input: '19d51e',
23+
output: '{d}(ddddddddd)[e](e)',
24+
},
25+
];
26+
27+
it('should return a string type', () => {
28+
expect(typeof organizeGifts('3c')).toBe('string');
29+
});
30+
31+
it.each(testCases)('should return the correct output', (testCase) => {
32+
expect(organizeGifts(testCase.input)).toBe(testCase.output);
33+
});
34+
});

0 commit comments

Comments
 (0)