diff --git a/2024/01-primer-regalo-repetido/README.md b/2024/01-primer-regalo-repetido/README.md
new file mode 100644
index 0000000..48b5e4a
--- /dev/null
+++ b/2024/01-primer-regalo-repetido/README.md
@@ -0,0 +1,20 @@
+# Reto 01: 🎁 ¡Primer regalo repetido!
+
+**Santa Claus** 🎅 ha recibido una lista de números mágicos que representan regalos 🎁, pero algunos de ellos están duplicados y deben ser eliminados para evitar confusiones. Además, **los regalos deben ser ordenados en orden ascendente antes de entregárselos a los elfos.**
+
+Tu tarea es escribir una función que reciba una lista de números enteros (que pueden incluir duplicados) y devuelva una nueva lista sin duplicados, ordenada en orden ascendente.
+
+```js
+const gifts1 = [3, 1, 2, 3, 4, 2, 5]
+const preparedGifts1 = prepareGifts(gifts1)
+console.log(preparedGifts1) // [1, 2, 3, 4, 5]
+
+const gifts2 = [6, 5, 5, 5, 5]
+const preparedGifts2 = prepareGifts(gifts2)
+console.log(preparedGifts2) // [5, 6]
+
+const gifts3 = []
+const preparedGifts3 = prepareGifts(gifts3)
+console.log(preparedGifts3) // []
+// No hay regalos, la lista queda vacía
+```
diff --git a/2024/01-primer-regalo-repetido/index.js b/2024/01-primer-regalo-repetido/index.js
new file mode 100644
index 0000000..267db60
--- /dev/null
+++ b/2024/01-primer-regalo-repetido/index.js
@@ -0,0 +1,5 @@
+function prepareGifts(gifts) {
+ return [...new Set(gifts)].sort((a, b) => a - b);
+}
+
+module.exports = prepareGifts;
diff --git a/2024/01-primer-regalo-repetido/index.test.js b/2024/01-primer-regalo-repetido/index.test.js
new file mode 100644
index 0000000..ea9b658
--- /dev/null
+++ b/2024/01-primer-regalo-repetido/index.test.js
@@ -0,0 +1,39 @@
+const prepareGifts = require('./index');
+
+describe('01 => Primer-regalo-repetido', () => {
+ const TEST_CASES = [
+ {
+ input: [3, 1, 2, 3, 4, 2, 5],
+ output: [1, 2, 3, 4, 5],
+ },
+ {
+ input: [5, 5, 5, 5],
+ output: [5],
+ },
+ {
+ input: [1, 2, 3],
+ output: [1, 2, 3],
+ },
+ {
+ input: [],
+ output: [],
+ },
+ {
+ input: [10, 20, 10, 30, 20, 30, 40],
+ output: [10, 20, 30, 40],
+ },
+ {
+ input: [3, 1, 2, 3, 1, 2],
+ output: [1, 2, 3],
+ },
+ ];
+
+ it('should return an array', () => {
+ const { input } = TEST_CASES[0];
+ expect(prepareGifts(input)).toBeInstanceOf(Array);
+ });
+
+ it.each(TEST_CASES)('should return $output', ({ input, output }) => {
+ expect(prepareGifts(input)).toEqual(output);
+ });
+});
diff --git a/README.md b/README.md
index 6d15060..9374d2b 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
@@ -44,17 +44,33 @@ npm run test:2021
npm run test:2022
# or
npm run test:2023
+# or
+npm run test:2024
# Run specific test
npm run test 'year'/'challenge'/index.test.js
```
-## 🎯 2023 Challenges
+## 🎯 2024 Challenges
Show / Hide
+| # | Challenge | Difficulty | My Solution | My Score |
+| :-: | ------------------------------------------------------------------------------------------- | :--------: | :------------------------------------------------------------------------------------------------------------: | :-----------: |
+| 01 | [🎁 ¡Primer regalo repetido!](https://adventjs.dev/es/challenges/2024/1) | 🟢 | [here](./2024/01-primer-regalo-repetido/index.js) | ⭐⭐⭐⭐⭐ |
+
+Difficulties legend:
+🟢 Easy 🟡 Medium 🔴 Hard
+
+
+
+## 🎯 2023 Challenges
+
+
+Show / Hide
+
| # | Challenge | Difficulty | My Solution |
| :-: | ------------------------------------------------------------------------------------------- | :--------: | :------------------------------------------------------------------------------------------------------------: |
| 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) |
diff --git a/package-lock.json b/package-lock.json
index 2ee87e8..91e061e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,6 +7,7 @@
"": {
"name": "adventjs-solutions",
"version": "1.0.0",
+ "hasInstallScript": true,
"license": "MIT",
"devDependencies": {
"eslint": "^8.30.0",
@@ -1929,10 +1930,11 @@
"dev": true
},
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
@@ -4298,12 +4300,13 @@
"dev": true
},
"node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "braces": "^3.0.2",
+ "braces": "^3.0.3",
"picomatch": "^2.3.1"
},
"engines": {
@@ -7081,9 +7084,9 @@
"dev": true
},
"cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"requires": {
"path-key": "^3.1.0",
@@ -8817,12 +8820,12 @@
"dev": true
},
"micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"requires": {
- "braces": "^3.0.2",
+ "braces": "^3.0.3",
"picomatch": "^2.3.1"
}
},
diff --git a/package.json b/package.json
index 35c0350..618ada5 100644
--- a/package.json
+++ b/package.json
@@ -8,9 +8,15 @@
"test:2021": "jest --testPathPattern=2021",
"test:2022": "jest --testPathPattern=2022",
"test:2023": "jest --testPathPattern=2023",
+ "test:2024": "jest --testPathPattern=2024",
"lint": "eslint **/*.js",
"lint:fix": "eslint **/*.js --fix",
- "prepare": "husky install"
+ "prepare": "husky install",
+ "postinstall": "npm run prepare"
+ },
+ "prettier": {
+ "singleQuote": true,
+ "trailingComma": "all"
},
"keywords": [
"midudev",