Skip to content

Commit 5881a5c

Browse files
authored
Merge pull request #11 from marcode24/2024-03
✨ Add challenge-03 solution
2 parents f6f3ae3 + 49003e7 commit 5881a5c

File tree

5 files changed

+233
-0
lines changed

5 files changed

+233
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# Desafio 3: Siguiendo la pista de la IA ΩMEGA
2+
3+
La IA maligna ΩMEGA está causando problemas en el sistema de control de la empresa. Estamos siguiendo su rastro y necesitamos averiguar cuántos pasos ha tomado para llegar a la salida (ya sea por la izquierda o por la derecha).
4+
5+
ΩMEGA cuenta con una lista de instrucciones de salto. Cada instrucción indica el número de posiciones que debe moverse en esa misma lista.
6+
7+
- Número positivo: ΩMEGA avanza ese número de posiciones.
8+
- Número negativo: Retrocede ese número de posiciones.
9+
- Cero: Se queda en la misma posición (pero cuenta como movimiento).
10+
11+
**Importante:** Cada vez que ΩMEGA lee una instrucción, incrementa el valor de esa instrucción en 1 después de usarla.
12+
13+
- Si encuentra un 2, avanza 2 posiciones y luego esa instrucción se convierte en 3.
14+
- Si encuentra un 0, se queda en su posición y luego esa instrucción se convierte en 1.
15+
- Si encuentra un -3, retrocede 3 posiciones y luego esa instrucción se convierte en -2.
16+
17+
Voy a darte un ejemplo. Entre paréntesis te indicaré la instrucción actual en la que se encuentra ΩMEGA.
18+
19+
Lista de instrucciones: **1 2 4 1 -2**
20+
21+
```txt
22+
Inicio: (1) 2 4 1 -2 // → ΩMEGA empieza en la posición 0
23+
Paso 1: 2 (2) 4 1 -2 // → Avanza una posición y la instrucción se convierte en 2
24+
Paso 2: 2 3 4 (1) -2 // → Avanza 2 posiciones y la instrucción se convierte en 3
25+
Paso 3: 2 3 4 2 (-2) // → Avanza una posición y la instrucción se convierte en 2
26+
Paso 4: 2 3 (4) 2 -1 // → Retrocede dos posiciones y pasa a -1
27+
Paso 5: 2 3 4 2 -1 // → Avanza 4 posiciones y escapa
28+
Resultado: 5
29+
```
30+
31+
Otro ejemplo con lista de instrucciones: **0 1 2 3 -1**
32+
33+
```txt
34+
Inicio: (0) 1 2 3 -1 // → ΩMEGA empieza en la posición 0
35+
Paso 1: (1) 1 2 3 -1 // → No avanza pero incrementa la instrucción en 1
36+
Paso 2: 2 (1) 2 3 -1 // → Avanza una posición y la instrucción se convierte en 2
37+
Paso 3: 2 2 (2) 3 -1 // → Avanza una posición y la instrucción se convierte en 2
38+
Paso 4: 2 2 3 3 (-1) // → Avanza dos posiciones y la instrucción se convierte en 3
39+
Paso 5: 2 2 3 (3) 0 // → Retrocede una posición y la instrucción se convierte en 0
40+
Paso 6: 2 2 3 4 0 // → Avanza tres posiciones y escapa
41+
Resultado: 6
42+
```
43+
44+
Otro ejemplo saliendo por la izquierda: **1 -2 5**
45+
46+
```txt
47+
Inicio: (1) -2 5 // → ΩMEGA empieza en la posición 0
48+
Paso 1: 2 (-2) 5 // → Avanza una posición y la instrucción se convierte en 1
49+
Paso 2: 2 -1 5 // → Retrocede dos posiciones y sale por la izquierda
50+
Resultado: 2
51+
```
52+
53+
¡Ten en cuenta que, **si la lista empieza por un número negativo**, entonces `ΩMEGA` saldrá por la izquierda en un sólo paso!
54+
55+
Accede a este trace.txt. Tiene una lista de los movimientos que realizó ΩMEGA separados por salto de línea. Necesito que calcules los pasos que necesito ΩMEGA para salir de cada instrucción por línea, que sumes todos los resultados y me digas el resultado final de pasos que necesito ΩMEGA en total y el resultado de la última línea, separado por guión.
56+
57+
Por ejemplo, si necesitó 99 pasos en total sumándo los pasos de cada línea y para la instrucción de la última línea necesitó 13 pasos entonces la solución a enviar sería `submit 99-13`
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const fs = require('fs');
2+
3+
function calculateSteps(instructions) {
4+
let steps = 0;
5+
let position = 0;
6+
7+
while (position >= 0 && position < instructions.length) {
8+
steps++;
9+
const jump = instructions[position];
10+
instructions[position]++;
11+
position += jump;
12+
}
13+
14+
return steps;
15+
}
16+
17+
function processTraceFile(traceFilePath) {
18+
const instructionSets = fs
19+
.readFileSync(traceFilePath, 'utf-8')
20+
.trim()
21+
.split('\n');
22+
23+
let totalSteps = 0;
24+
let stepsForLastSet = 0;
25+
26+
instructionSets.forEach((line, index) => {
27+
const instructions = line.split(' ').map(Number);
28+
const steps = calculateSteps(instructions);
29+
totalSteps += steps;
30+
31+
if (index === instructionSets.length - 1) {
32+
stepsForLastSet = steps;
33+
}
34+
});
35+
36+
return `submit ${totalSteps}-${stepsForLastSet}`;
37+
}
38+
39+
module.exports = { processTraceFile, calculateSteps };
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const { processTraceFile, calculateSteps } = require('./solution');
2+
3+
describe('2024 | 03-siguiendo-la-pista-de-la-ia-omega', () => {
4+
describe('calculateSteps', () => {
5+
const TEST_CASES = [
6+
{
7+
input: '1 2 4 1 -2',
8+
output: 5,
9+
},
10+
{
11+
input: '0 1 2 3 -1',
12+
output: 6,
13+
},
14+
{
15+
input: '1 -2 5',
16+
output: 2,
17+
},
18+
];
19+
20+
it.each(TEST_CASES)('should return $output', ({ input, output }) => {
21+
const instructions = input.split(' ').map(Number);
22+
expect(calculateSteps(instructions)).toBe(output);
23+
});
24+
});
25+
26+
describe('processTraceFile', () => {
27+
const TEST_CASES = [
28+
{
29+
input: './2024/03-siguiendo-la-pista-de-la-ia-omega/trace.txt',
30+
output: 'submit 453-15',
31+
},
32+
];
33+
34+
it.each(TEST_CASES)('should return $output', ({ input, output }) => {
35+
expect(processTraceFile(input)).toBe(output);
36+
});
37+
});
38+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
1 2 4 1 -2
2+
0 1 2 3 -1
3+
0 1 1 1
4+
1 2 3 4 -1
5+
0 0 1 1 1
6+
2 -1 0 2 1
7+
0 1 0 1
8+
3 0 -2 1
9+
1 1 1 1 1 1
10+
1 2 3 4 -1
11+
0 0 1 1 1
12+
2 -1 0 2 1
13+
0 1 0 1
14+
3 0 -2 1
15+
1 1 1 1 1 1
16+
-1 0 1 -2 2
17+
1 2 4 1 -2
18+
0 1 2 3 -1
19+
0 1 1 1
20+
-1 0 1 -2 2
21+
1 2 4 1 -2
22+
0 1 2 3 -1
23+
0 1 1 1
24+
1 2 3 4 -1
25+
0 0 1 1 1
26+
2 -1 0 2 1
27+
0 1 0 1
28+
3 0 -2 1
29+
1 1 1 1 1 1
30+
-1 0 1 -2 2
31+
1 2 4 1 -2
32+
0 1 2 3 -1
33+
0 1 1 1
34+
1 2 3 4 -1
35+
0 0 1 1 1
36+
2 -1 0 2 1
37+
0 1 0 1
38+
3 0 -2 1
39+
1 1 1 1 1 1
40+
-1 0 1 -2 2
41+
1 2 4 1 -2
42+
0 1 2 3 -1
43+
-1 0 1 -2 2
44+
1 2 4 1 -2
45+
0 1 2 3 -1
46+
0 1 1 1
47+
1 2 3 4 -1
48+
0 0 1 1 1
49+
2 -1 0 2 1
50+
0 1 0 1
51+
3 0 -2 1
52+
1 1 1 1 1 1
53+
-1 0 1 -2 2
54+
1 2 4 1 -2
55+
0 1 2 3 -1
56+
0 1 1 1
57+
0 1 1 1
58+
1 2 3 4 -1
59+
0 0 1 1 1
60+
2 -1 0 2 1
61+
0 1 0 1
62+
3 0 -2 1
63+
1 1 1 1 1 1
64+
-1 0 1 -2 2
65+
1 2 4 1 -2
66+
0 1 2 3 -1
67+
0 1 1 1
68+
1 2 3 4 -1
69+
0 0 1 1 1
70+
2 -1 0 2 1
71+
0 1 0 1
72+
3 0 -2 1
73+
1 1 1 1 1 1
74+
-1 0 1 -2 2
75+
1 2 4 1 -2
76+
0 1 2 3 -1
77+
0 1 1 1
78+
1 2 3 4 -1
79+
0 0 1 1 1
80+
2 -1 0 2 1
81+
-1 0 1 -2 2
82+
1 2 4 1 -2
83+
0 1 2 3 -1
84+
0 1 1 1
85+
1 2 3 4 -1
86+
0 0 1 1 1
87+
2 -1 0 2 1
88+
0 1 0 1
89+
3 0 -2 1
90+
1 1 1 1 1 1
91+
-1 0 1 -2 2
92+
1 2 4 1 -2
93+
0 1 2 3 -1
94+
0 1 1 1
95+
0 1 0 1
96+
3 0 -2 1
97+
1 1 1 1 1 1
98+
1 0 1 0 1 0 1 0 1 4 5 6 7 8

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ npm run test 'year'/'folder-name'/solution.test.js
5050
| :-: | ----------------------------------------------------------------- |:----: | :------------------------------------------------------------------------------------------------------: |
5151
| 01 | [!Consigue acceso a la terminal!](https://codember.dev) || [here](./2024/01-consigue-acceso-a-la-terminal/solution.js) |
5252
| 02 | [Detectando acceso no deseado](https://codember.dev) || [here](./2024/02-detectando-acceso-no-deseado/solution.js) |
53+
| 03 | [!Siguiendo la pista de la IA ΩMEGA!](https://codember.dev) || [here](./2024/03-siguiendo-la-pista-de-la-ia-omega/solution.js) |
5354
</details>
5455

5556
## 🎯 2023 Challenges

0 commit comments

Comments
 (0)