我有一个有点深奥的问题。我的程序想要解码摩尔斯电码。
关键是,我需要处理任何字符。任何符合我的系统并且可以对应于字母的随机字符都应该被接受。意思是,字母“Q”由“ - - 。 - ”表示,但我的程序会将任何字符串(由适当的newchar信号分隔)视为Q,例如“dj ir j kw”(long long短暂的。)
存在失去同步的危险,因此我需要实现“新角色”信号。我选择这个是“xxxx”,如4个字母。对于白色空格符号,我选择了“xxxxxx”,6个字符。
长话短说,如何根据分隔符的长度(4个连续符号)将要解码的字符串拆分为可读字符,因为我无法确定地知道< em>什么字母组成newchar分隔符?
答案 0 :(得分:1)
问题的措辞不是很明确。
例如,在这里,您将空格显示为符号Q:
的各个部分之间的分隔符例如“dj ir j kw”(long long short long)
后来你说:
对于白色空格符号,我选择了“xxxxxx”,6个字符。
这是空格的符号,还是在符号中使用的分隔符(例如上面的Q)?你的帖子没有说。
在这种情况下,一如既往,一个例子值得千言万语。您应该已经展示了一些可能的输入示例,并展示了您希望如何解析它们。
如果你的意思是“dj ir j kw jfkl abpzoq jfkl dj ir j kw”应解码为“QQ”,你只想知道如何按照长度匹配令牌,那么......问题简单。有一百万种方法可以做到这一点。
在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))