feat: Ciphers/MorseCode Algorithm (#1315)

* [feat] New algorithm

* [test] Add new test for ParityOutlier.js

* [fix] Reset indentation

* [fix] Reset indentation

* [fix] Style changes

* fix: improve code efficiency and a glitch

* test: adds a new possible test case

* fix: style fix

* fix: delete redundant comments and else statements

* [fix] style fix

* feat: New algorithm

* fix: fixed custom code symbols

* test: add test for MorseCode

* test: add case with custom code symbols

* delete files from main branch

* fix: style fix

* fix: style fix

* fix: delete unnecessary quotes
This commit is contained in:
Arnold Zhou
2023-05-01 16:17:47 +10:00
committed by GitHub
parent e6df6ebad6
commit 331a4d26cf
2 changed files with 101 additions and 0 deletions

85
Ciphers/MorseCode.js Normal file
View File

@ -0,0 +1,85 @@
/**
* @author mrmagic2020
* @description Enciphers a combination of letters, numbers and symbols into morse code.
* @see https://en.wikipedia.org/wiki/Morse_code
* @param {string} msg The message to be enciphered.
* @param {string} dot Symbol representing the dots.
* @param {string} dash Symbol representing the dash.
* @returns {string} Enciphered morse code.
* @example morse('Hello World!') = '**** * *-** *-** --- *-- --- *-* *-** -** -*-*--'
*/
const morse = (msg, dot = '*', dash = '-') => {
const key = {
A: '*-',
B: '-***',
C: '-*-*',
D: '-**',
E: '*',
F: '**-*',
G: '--*',
H: '****',
I: '**',
J: '*---',
K: '-*-',
L: '*-**',
M: '--',
N: '-*',
O: '---',
P: '*--*',
Q: '--*-',
R: '*-*',
S: '***',
T: '-',
U: '**-',
V: '***-',
W: '*--',
X: '-**-',
Y: '-*--',
Z: '--**',
1: '*----',
2: '**---',
3: '***--',
4: '****-',
5: '*****',
6: '-****',
7: '--***',
8: '---**',
9: '----*',
0: '-----',
'.': '*-*-*-',
',': '--**--',
'?': '**--**',
'!': '-*-*--',
'\'': '*----*',
'"': '*-**-*',
'(': '-*--*',
')': '-*--*-',
'&': '*-***',
':': '---***',
';': '-*-*-*',
'/': '-**-*',
_: '**--*-',
'=': '-***-',
'+': '*-*-*',
'-': '-****-',
$: '***-**-',
'@': '*--*-*'
}
let newMsg = ''
msg.toString().split('').forEach((e) => {
if (/[a-zA-Z]/.test(e)) {
newMsg += key[e.toUpperCase()].replaceAll('*', dot).replaceAll('-', dash)
} else if (Object.keys(key).includes(e)) {
newMsg += key[e].replaceAll('*', dot).replaceAll('-', dash)
} else {
newMsg += e
}
newMsg += ' '
})
return newMsg.trim()
}
export { morse }

View File

@ -0,0 +1,16 @@
import { morse } from '../MorseCode'
describe('Testing morse function', () => {
it('should return an enciphered string with a given input string', () => {
expect(morse('Hello World!')).toBe('**** * *-** *-** --- *-- --- *-* *-** -** -*-*--')
expect(morse('1+1=2')).toBe('*---- *-*-* *---- -***- **---')
})
it('should leave symbols that does not have its corresponding morse representation', () => {
expect(morse('© 2023 GitHub, Inc.')).toBe('© **--- ----- **--- ***-- --* ** - **** **- -*** --**-- ** -* -*-* *-*-*-')
})
it('should be able to accept custom morse code symbols', () => {
expect(morse('Nodejs', '.', '|')).toBe('|. ||| |.. . .||| ...')
})
})