-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathReto #4.js
More file actions
70 lines (53 loc) · 1.95 KB
/
Reto #4.js
File metadata and controls
70 lines (53 loc) · 1.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/**
*Reto #4: 🧮 Descifra el PIN de Santa
Los elfos han encontrado el código cifrado que protege la puerta del taller de Santa 🔐. El PIN tiene 4 dígitos, y está escondido dentro de bloques como estos:
[1++][2-][3+][<]
Escribe una función que descifre el PIN a partir del código.
El código está formado por bloques entre corchetes [...] y cada bloque genera un dígito del PIN.
Un bloque normal tiene la forma [nOP...], donde n es un número (0-9) y después puede haber una lista de operaciones (opcionales).
Las operaciones se aplican en orden al número y son:
+ suma 1
- resta 1
El resultado siempre es un dígito (aritmética mod 10), por ejemplo 9 + 1 → 0 y 0 - 1 → 9.
También existe el bloque especial [<], que repite el dígito del bloque anterior.
Si al final hay menos de 4 dígitos, se debe devolver null.
*/
/* TESTs */
console.log(decodeSantaPin('[1++][2-][3+][<]'));
// "3144"
console.log(decodeSantaPin('[9+][0-][4][<]'));
// "0944"
console.log(decodeSantaPin('[1+][2-]'));
// null (solo 2 dígitos)
console.log(decodeSantaPin('[<][0-][4][<]'));
// "null" (primero es repetir pero no hay anterior)
/**
* @param {string} code - The code to decipher
* @returns {string} The deciphered PIN
*/
function decodeSantaPin(code) {
let groups=code.match(/[^[\]]+/g)||[];
const ans = groups.reduce((carry,block)=>{
if(block === '<')
return carry + (carry.slice(-1) || '');
const digit = ((parseInt(block)+(block.split('+').length-1)-(block.split('-').length-1)) % 10 + 10) % 10;
return carry + digit;
},'');
/*
groups.forEach((value,key)=>{
if(value[0]==='<'){
if(ans.length > 0)
ans += key > 0 ? ans[ans.length-1] : '';}
else{
let carry=parseInt(value[0]);
for(let i=1;i<value.length;i++){
if(value[i] === '+')
carry = (carry + 1) % 10;
else
carry = (carry - 1 + 10) % 10;
}
ans += carry;
}
})*/
return ans.length===4?ans:null;
}