问题描述
这是一个任务:
传输摩尔斯电码时,国际标准规定 那个:
“点” – 是 1 个时间单位长。 “Dash” – 是 3 个时间单位。暂停 字符中的点和破折号之间 - 是 1 个时间单位长。暂停 单词内的字符之间 - 长度为 3 个时间单位。中间暂停 words – 是 7 个时间单位。但是,标准没有规定 “时间单位”是多长。事实上,不同的运营商会 以不同的速度传输。业余爱好者可能需要几秒钟 传输单个字符,熟练的专业人员可以传输60个字符 每分钟字数,机器人发射器可能会更快。
对于这个kata,我们假设执行了消息接收 由定期检查线路的硬件自动执行,以及 如果线路已连接(远程站的钥匙已关闭),则 1 为 记录,如果线路未连接(遥控器向上),则为 0 记录。消息完全收到后,它会发送给您 解码为仅包含符号 0 和 1 的字符串。
例如,消息hey JUDE,即······ · 可能会收到如下:
11001100110011000000110000001111111001100111111001111111000000000000001100111111001111110010101010101010101010101010101010000000000000101010101010101010101010101010101000000000000011001111110010101010101010101010101010101010101010101010101010101010101010000000000001010
如您所见,根据 标准,并且硬件每次对线路精确采样两次 “点”。
也就是说,您的任务是实现两个功能:
函数decodeBits(bits),应该找出传输速率 的消息,正确地将消息解码为点,破折号 - 和 空格(字符之间一个,单词之间三个)并返回那些 作为字符串。请注意,一些额外的 0 可能会自然出现在 消息的开头和结尾,请务必忽略它们。还有如果 你很难辨别 1 的特定序列是否是一个点 或破折号,假设它是一个点。 2. 函数 decodeMorse(morseCode),它将获取前一个函数的输出并返回一个人类可读的字符串。
这是我的代码:
var MORSE_CODE = {
".-":"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",};
var decodeBits = function(bits){
const trimBits = bits.replace(/(^0+|0+$)/g,'').split('')
const result = []
var word = []
if(trimBits.length > 3){
trimBits.every((v,i,array) => {
if(i > 0 && i < array.length - 1){
return v == array[i-1] ? word.push(v) : result.push(word) && (word = []) && word.push(v)
}else if(i == array.length - 1){
return v == array[i-1] ? word.push(v) && result.push(word) : result.push(word) && result.push([v])
}else{
return word.push(v)
}
})
if(result.length === 1){
return result[0][0] == 1 ? '.'.repeat(result[0].length / 3) : '-'.repeat(result[0].length / 3)
}else if(result.map((v) => v.join(''))[1].length == 1 && result.length == 3){
let result1 = result.map((v) => v.join(''))
return result1.map((v) => v[0] == 1 ? '.' : ' ').join('')
}else{
return result.map((v) => v.join('')).map((v) => {
if(v[0] == 0){
if(v.length % 2 == 0){
if(v.length > 6){
return ' '
}if(v.length == 6){
return ' '
}else{
return ' '
}
}else if(v.length >= 6){
return ' '
}else if(v.length === 3){
return ' '
}else{
return String.fromCharCode(32)
}
}else if(v[0] == 1){
if(v.length % 2 == 0 && v.length % 3 != 0){
return String.fromCharCode(46).repeat(v.length / 2)
}else if(v.length % 3 == 0){
return String.fromCharCode(45)
}else{
return String.fromCharCode(46)
}
}
}).join('')
}
}else{
return trimBits.every((v,arr) => v === arr[0]) && trimBits[0] == 1 ? '.' : '..'
}
}
var decodeMorse = function(morseCode){
return morseCode.split(' ').map((v) => v.split(' ')).map((v) => v.map((val) => MORSE_CODE[val.replace(/ /g,'')]).join('')).join(' ')
}
decodeMorse(decodeBits('1100110011001100000011000000111111001100111111001111110000000000000011001111110011111100111111000000110011001111110000001111110011001100000011'))// returns 'hey JUDE'
decodeMorse(decodeBits('1110111')) //returns EE
console.log(decodeMorse(decodeBits('00011100010101010001000000011101110101110001010111000101000111010111010001110101110000000111010101000101110100011101110111000101110111000111010000000101011101000111011101110001110101011100000001011101110111000101011100011101110001011101110100010101000000011101110111000101010111000100010111010000000111000101010100010000000101110101000101110001110111010100011101011101110000000111010100011101110111000111011101000101110101110101110'))) //THE QUICK broWN FOX JUMPS OVER THE LAZY DOG.
问题是每次我运行我的代码时都会遇到同样的问题:
Expected: 'A',instead got: 'EE'
Expected: 'M',instead got: 'EE'
Expected: 'E',instead got: 'I'
Expected: 'THE QUICK broWN FOX JUMPS OVER THE LAZY DOG.',instead got: 'T H E Q U I C K B R O W N F O X J U M P S O V E R T H E L A Z Y D O G .'
我已经尽了最大的努力,而且我已经成功了。有人可以帮我在这里找到解决方案吗?我在这段代码中做错了什么?
用于调试:
decodeMorse(decodeBits('1100110011001100000011000000111111001100111111001111110000000000000011001111110011111100111111000000110011001111110000001111110011001100000011'))// returns 'hey JUDE'
decodeMorse(decodeBits('1110111')) //returns EE
更新帖子!我非常接近。空格和单个字母有问题。
附言错误可能出在解码器逻辑中,我试图解决我应该将什么推送到数组 result
破折号或点。
解决方法
我已经做到了!我的第一个 js 中最有趣的任务。失败的原因是条件错误的空间。我应该防止空格可以是奇数和偶数个零。 请点赞。也许它会帮助某人。我花了将近10个小时来解决它xD
var MORSE_CODE = {
".-":"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",};
var decodeBits = function(bits){
const trimBits = bits.replace(/(^0+|0+$)/g,'').split('')
const result = []
var word = []
if(trimBits.length > 3){
trimBits.every((v,i,array) => {
if(i > 0 && i < array.length - 1){
return v == array[i-1] ? word.push(v) : result.push(word) && (word = []) && word.push(v)
}else if(i == array.length - 1){
return v == array[i-1] ? word.push(v) && result.push(word) : result.push(word) && result.push([v])
}else{
return word.push(v)
}
})
if(result.length === 1){
return result[0][0] == 1 ? '.' : '-'.repeat(result[0].length / 3)
}else if(result.map((v) => v.join(''))[1].length == 1 && result.length == 3){
let result1 = result.map((v) => v.join(''))
return result1.map((v) => v[0] == 1 ? (v.length <= 2 ? '.' : '-') : (v.length >= 1 ? ' ' : ' ')).join('')
}else{
return result.map((v) => v.join('')).map((v) => {
if(v[0] == 0){
if(v.length % 2 == 0){
if(v.length > 6){
return ' '
}if(v.length == 6){
return ' '
}else{
return ' '
}
}else if(v.length == 7){
return ' '
}else if(v.length == 3){
return ' '
}else if(v.length > 7){
return ' '.repeat(v.length / 7 - 1)
}else{
return ' '
}
}else if(v[0] == 1){
if(v.length % 2 == 0 && v.length % 3 != 0){
return String.fromCharCode(46).repeat(v.length / 2)
}else if(v.length % 3 == 0){
return String.fromCharCode(45)
}else{
return String.fromCharCode(46)
}
}
}).join('')
}
}else{
return trimBits.every((v,arr) => v === arr[0]) && trimBits[0] == 1 ? '.' : '..'
}
}
var decodeMorse = function(morseCode){
return morseCode.split(' ').map((v) => v.split(' ')).map((v) => v.map((val) => MORSE_CODE[val.replace(/\s/g,'')]).join('')).join(' ')
}
console.log(decodeMorse(decodeBits('1110110111')))
console.log(decodeMorse(decodeBits('00011100010101010001000000011101110101110001010111000101000111010111010001110101110000000111010101000101110100011101110111000101110111000111010000000101011101000111011101110001110101011100000001011101110111000101011100011101110001011101110100010101000000011101110111000101010111000100010111010000000111000101010100010000000101110101000101110001110111010100011101011101110000000111010100011101110111000111011101000101110101110101110')))
console.log(decodeMorse(decodeBits('11111100111111')))
console.log(decodeMorse(decodeBits('1100110011001100000011000000111111001100111111001111110000000000000011001111110011111100111111000000110011001111110000001111110011001100000011')))