Problem
- Digital Cypher assigns to each letter of the alphabet unique number.
- Digital Cypher는 알파벳 고유 번호의 각 문자를 지정한다.
// a b c d e f g h i j k l m
// 1 2 3 4 5 6 7 8 9 10 11 12 13
// n o p q r s t u v w x y z
// 14 15 16 17 18 19 20 21 22 23 24 25 26
- Instead of letters in encrypted word we write the corresponding number.
- 암호화한 문자 대신에, 대응 숫자를 작성한다.
// h e l l o
// 8 5 12 12 15
- Then we add to each obtained digit consecutive digits from the key.
- 그런 다음, 각 digit에 연속적인 digit(key)을 더한다.
// h e l l o
// 8 5 12 12 15
// + 1 9 3 9 1
// ----------------
// 9 14 15 21 16
- Write a function that accepts ‘str’ string and ‘key’ number and returns an array of integers representing encoded ‘str’.
- 암호화된 str을 나타내는 정수의 배열을 반환한다.
- The str input string consists of lowercase characters only.
- The key input number is a positive integer.
Solution 01
function encode(str, key) {
const cypher = {
a: 1,
b: 2,
c: 3,
d: 4,
e: 5,
f: 6,
g: 7,
h: 8,
i: 9,
j: 10,
k: 11,
l: 12,
m: 13,
n: 14,
o: 15,
p: 16,
q: 17,
r: 18,
s: 19,
t: 20,
u: 21,
v: 22,
w: 23,
x: 24,
y: 25,
z: 26
};
key = key.toString();
str = str.split('');
let keyIndex = 0;
let result = [];
str.forEach(i => {
result.push(cypher[i] + Number(key[keyIndex]));
keyIndex++;
if (keyIndex >= key.length) {
keyIndex = 0;
}
});
return result;
}
encode('hello', 1939); // [9, 14, 15, 21, 16]
encode('apple', 1988); // [2, 25, 24, 20, 6]
forEach()
: 배열의 각 element에 대해 제공된 함수를 차례로 한 번씩 호출한다.
split()
: 문자열을 부분 문자열로 분할하고, 새 배열로 반환한다.
push()
: 배열의 끝에 새 element를 추가하고, 새로운 길이를 반환한다.
toString()
: 숫자를 문자열로 변환한다.
Solution 02
function encode(str, key) {
key = key.toString();
return str.split('').map((i, index) => i.charCodeAt() - 96 + Number(key[index % key.length]));
}
encode('hello', 1939); // [9, 14, 15, 21, 16]
encode('apple', 1988); // [2, 25, 24, 20, 6]
map()
: 배열 내 모든 element에 대해, 호출한 함수의 결과를 모아 새로운 배열을 반환한다.
charCodeAt()
: 문자열의 지정된 index에 있는 문자의 Unicode를 반환한다.