【问题标题】:Decode the Morse code, advanced JS (codewars)解码莫尔斯电码,高级 JS(codewars)
【发布时间】:2021-01-04 15:51:28
【问题描述】:

这是一个任务:

在传输莫尔斯电码时,国际标准规定 那:

“点”——长度为 1 个时间单位。 “Dash”——长度为 3 个时间单位。暂停 字符中的点和破折号之间 - 长度为 1 个时间单位。暂停 单词中的字符之间 - 长度为 3 个时间单位。之间暂停 单词 – 长度为 7 个时间单位。但是,标准并没有具体说明 “时间单位”是多长时间。事实上,不同的运营商会 以不同的速度传输。业余爱好者可能需要几秒钟 传输单个字符,熟练的专业人员可以传输 60 每分钟字数,机器人发射器可能会更快。

对于这个 kata,我们假设执行了消息接收 由定期检查线路的硬件自动执行,并且 如果线路已连接(远程站的键已按下),则为 1 记录,如果线路未连接(遥控键向上),则为 0 记录下来。消息被完全接收后,它会发送给您 解码为仅包含符号 0 和 1 的字符串。

例如消息HEY JUDE,即·····-·--·---···--·· · 可能收到如下:

11001100110011000000110000001111110011001111110011111100000000000000110011111100111111001111110000001100110011111000000101101010101011

如您所见,根据 标准,并且硬件每次准确地对线路进行两次采样 “点”。

也就是说,你的任务是实现两个功能:

函数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, i, 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 dash 或 dot。

【问题讨论】:

  • 现在,代码没有按照你说的做,因为你没有包含MORSE_CODE的定义...
  • 我现在就修复它
  • 您似乎在使用every 来获得副作用;您应该对输出做一些事情(一个布尔值,指示数组的每个元素是否满足条件),或者使用forEach 进行没有有意义的返回值的普通迭代。我还建议在该函数中的代码中不要那么“聪明”。第一次阅读时并不清楚return v == array[i - 1] ? word.push(v) : result.push(word) &amp;&amp; (word = []) &amp;&amp; word.push(v) 会做什么。我发现如果我的代码有问题,我要做的第一件事就是确保我可以大声朗读并理解它。
  • 这段代码做得很好(相信我:))。错误出现在我试图通过数组return result.map((v) =&gt; v.join('')).map((v)... 进行解码的逻辑中,而在某处我遗漏了一些东西。
  • 我认为我缺少的是问题所在。您可以编辑 sn-p 以包含返回错误输出的输入示例吗?例如,是什么给了你那些预期的:'...',而不是得到:'...' 错误?

标签: javascript arrays math morse-code


【解决方案1】:

我已经做到了!我的第一个 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, i, 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')))

【讨论】:

  • 为什么 K 是 1110110111 而不是 111010111?
  • if(v.length % 2 == 0 &amp;&amp; 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) } 此代码正在检查它。您可以阅读下面的任务。
  • 我不是在问为什么代码接受它。我从人类的角度问为什么K,即-.-,所以111 0 1 0 111,被接受为1110110111,所以点有两个。
猜你喜欢
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2015-09-03
  • 1970-01-01
相关资源
最近更新 更多