0

我有一个有点深奥的问题。我的程序想要解码莫尔斯电码。

关键是,我需要处理任何角色。任何符合我的系统并且可以对应于字母的随机字符都应该被接受。意思是,字母“Q”由“- - . -”表示,但我的程序会将任何字符串(由适当的newchar信号分隔)视为Q,例如“dj ir j kw”(long long短长)。

存在不同步的危险,所以我需要实现一个“新角色”信号。我选择这个是“xxxx”,如 4 个字母。对于白色的空格符号,我选择了“xxxxxx”,6 个字符。

长话短说,我如何根据分隔符的长度(4 个连续符号)将要解码的字符串拆分为可读字符,因为我无法真正确定性地知道哪些字母将构成 newchar 分隔符?

4

2 回答 2

1

这个问题的措辞不是很清楚。

例如,在这里您将空间显示为符号 Q 的各部分之间的分隔符:

例如“dj ir j kw”(长长短长)

后来你说:

对于白色的空格符号,我选择了“xxxxxx”,6 个字符。

那是空格的符号,还是您在符号中使用的分隔符(例如上面的 Q)?你的帖子没有说。

在这种情况下,与往常一样,一个例子胜过千言万语。您应该已经展示了一些可能输入的示例,并展示了您希望如何解析它们。

如果你的意思是“dj ir j kw jfkl abpzoq jfkl dj ir j kw”应该被解码为“Q Q”,而你只想知道如何通过它们的长度来匹配令牌,那么......这个问题很简单。有一百万种方法可以做到这一点。

在 Lua 中,我会分两次完成。首先,将消息转换为仅包含每个连续字符块长度的字符串:

message = 'dj ir j kw jfkl abpzoq jfkl dj ir j kw'

message = message:gsub('(%S+)%s*', function(s) return #s end)

print(message) --> 22124642212

然后拆分数字 4 得到每个组

for group in message:gmatch('[^4]+') do
    print(group)
end

这给了你:

2212
6
2212

所以你可以像这样转换:

function translate(message)
    local lengthToLetter = {
        ['2212'] = 'Q',
        [   '6'] = ' ',
    }
    local translation = {}
    message = message:gsub('(%S+)%s*', function(s) return #s end)
    for group in message:gmatch('[^4]+') do
        table.insert(translation, lengthToLetter[group] or '?')
    end
    return table.concat(translation)
end

print(translate(message))
于 2012-09-20T23:19:11.223 回答
0

这将通过任何len连续出现的来拆分字符串char,这可能是字符或模式字符类(例如),或者如果未传递 ,则可以是%s任何字符(即.) 。char

它通过在传递给 string.find 的模式中使用反向引用来做到这一点,例如(.)%1%1%1匹配任何重复四次的字符。

其余的只是一个标准的字符串拆分器;这里唯一真正的 Lua 特性是模式的选择。

-- split str, using (char * len) as the delimiter
-- leave char blank to split on len repetitions of any character
local function splitter(str, len, char)
  -- build pattern to match len continuous occurrences of char
  -- "(x)%1%1%1%1" would match "xxxxx" etc.
  local delim = "("..(char or ".")..")" .. string.rep("%1", len-1)
  local pos, out = 1, {}
  -- loop through the string, find the pattern,
  -- and string.sub the rest of the string into a table
  while true do
    local m1, m2 = string.find(str, delim, pos)
    -- no sign of the delimiter; add the rest of the string and bail
    if not m1 then 
      out[#out+1] = string.sub(str, pos)
      break
    end
    out[#out+1] = string.sub(str, pos, m1-1)
    pos = m2+1
    -- string ends with the delimiter; bail
    if m2 == #str then
      break
    end
  end
  return out
end

-- and the result?
print(unpack(splitter("dfdsfsdfXXXXXsfsdfXXXXXsfsdfsdfsdf", 5)))
-- dfdsfsdf, sfsdf, sfsdfsdfsdf
于 2012-09-21T02:51:50.110 回答