0

私はやや難解な問題を抱えています。私のプログラムは、モールス信号をデコードしたいと考えています。

ポイントは、どのキャラクターも処理する必要があるということです。私のシステムに準拠し、文字に対応できる任意の文字を受け入れる必要があります。つまり、文字「Q」は「- - . -」で表されますが、私のプログラムは、任意の文字列 (適切な newchar 信号で区切られたもの) を Q として受け入れます。たとえば、「dj ir j kw」(long long)ロングショート)。

同期がずれてしまう危険性があるので、「新しいキャラクター」シグナルを実装する必要があります。これを4文字の「xxxx」にしました。白い空白記号には、「xxxxxx」の 6 文字を選択しました。

簡単に言えば、どの文字が newchar 区切り記号を構成するかを決定論的に知ることができないため、区切り記号 (4 つの連続する記号)の長さに基づいて、デコードされる文字列を読み取り可能な文字に分割するにはどうすればよいですか?

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 では、2 つのパスで行います。最初に、メッセージを連続文字の各チャンクの長さのみを含む文字列に変換します。

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%14 回繰り返される任意の文字に一致します。

残りは単なるボグ標準の文字列スプリッターです。ここでの唯一の本当の 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 に答える