I created a function to encrypt and decrypt messages. the encrypting works fine. but when I try to log encrypted Hello World!
it just logs H
.
JavaScript
x
52
52
1
const chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz".split("");
2
const numbs = "0123456789".split("");
3
const symbols = "!@#$%^&*()_+-=[]{}|;':,./<>?" ".split("");
4
5
function encrypt(message) {
6
message = message.split("")
7
var output = []
8
message.forEach(element => {
9
if (chars.includes(element)) {
10
output.push("c" + chars.indexOf(element))
11
} else if (numbs.includes(element)) {
12
output.push("n" + numbs.indexOf(element))
13
} else if (symbols.includes(element)) {
14
output.push("s" + symbols.indexOf(element))
15
} else {
16
console.log(element)
17
throw new Error(`Unknown character`)
18
}
19
});
20
return output.join("")
21
}
22
23
function decrypt(message) {
24
message = message.split("");
25
var output = [];
26
var prevDeter;
27
var prevNumbs = [];
28
message.forEach(element => {
29
if (element == "c") {
30
prevDeter = "c"
31
if (prevNumbs.length > 0) {
32
output.push(chars[parseInt(prevNumbs.join(""))])
33
}
34
} else if (element == "n") {
35
prevDeter = "n"
36
if (prevNumbs.length > 0) {
37
output.push(numbs[parseInt(prevNumbs.join(""))])
38
}
39
} else if (element == "s") {
40
prevDeter = "s"
41
if (prevNumbs.length > 0) {
42
output.push(symbols[parseInt(prevNumbs.join(""))])
43
}
44
} else {
45
prevNumbs.push(element)
46
}
47
});
48
return output.join("")
49
}
50
51
//expected to log Hello World! but logs H and when starting the message with a symbol or number it just logs nothing
52
console.log(decrypt(encrypt("Hello World!")))
Fixed it, i edited the encoding system to place a – between chars and the decoding system to just split the message at – and check if the element starts with c n or s. and then i just used substring to get the number and decrypt it
JavaScript
1
43
43
1
const chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz".split("");
2
const numbs = "0123456789".split("");
3
const symbols = "!@#$%^&*()_+-=[]{}|;':,./<>?" ".split("");
4
5
function encrypt(message) {
6
message = message.split("");
7
var output = [];
8
message.forEach(element => {
9
if(chars.includes(element)) {
10
output.push("-c" + chars.indexOf(element));
11
}else if(numbs.includes(element)) {
12
output.push("-n" + numbs.indexOf(element));
13
}else if(symbols.includes(element)) {
14
output.push("-s" + symbols.indexOf(element));
15
}else{
16
console.log(element);
17
throw new Error(`Unknown character`);
18
};
19
});
20
return output.join("");
21
};
22
23
function decrypt(message) {
24
message = message.split("-");
25
console.log(message)
26
var output = [];
27
message.forEach(element => {
28
if(element.startsWith("c")) {
29
output.push(chars[element.substring(1)]);
30
}else if(element.startsWith("n")) {
31
output.push(numbs[element.substring(1)]);
32
}else if(element.startsWith("s")) {
33
output.push(symbols[element.substring(1)]);
34
}else if(element.length < 1){
35
36
}else{
37
throw new Error(`Invalid message`);
38
}
39
});
40
return output.join("");
41
};
42
43
console.log(decrypt(encrypt("Hello World!")));
Advertisement
Answer
You need to split the encoded string based on set/index pairs. This is easy enough to do with a look-ahead regular expression and splitting before a c
, n
or an s
. /(?=[cns])/
JavaScript
1
47
47
1
const chars = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz".split("");
2
const numbs = "0123456789".split("");
3
const symbols = "!@#$%^&*()_+-=[]{}|;':,./<>?" ".split("");
4
5
function encrypt(message) {
6
message = message.split("")
7
var output = []
8
message.forEach(element => {
9
if (chars.includes(element)) {
10
output.push("c" + chars.indexOf(element))
11
} else if (numbs.includes(element)) {
12
output.push("n" + numbs.indexOf(element))
13
} else if (symbols.includes(element)) {
14
output.push("s" + symbols.indexOf(element))
15
} else {
16
console.log(element)
17
throw new Error(`Unknown character`)
18
}
19
});
20
return output.join("")
21
}
22
23
function decrypt(message) {
24
message = message.split(/(?=[cns])/);
25
var output = [];
26
message.forEach(element => {
27
let set;
28
switch(element[0]){
29
case 'c':
30
set = chars;
31
break;
32
case 'n':
33
set = numbs;
34
break;
35
case 's':
36
set = symbols;
37
break;
38
}
39
const index = parseInt(element.substring(1));
40
output.push(set[index]);
41
});
42
return output.join('');
43
}
44
const encrypted = encrypt("Hello World!");
45
console.log(encrypted);
46
//expected to log Hello World! but logs H and when starting the message with a symbol or number it just logs nothing
47
console.log(decrypt(encrypted));