0

Luaには、辞書テーブルを作成し、単語が存在するかどうかを確認できる2つの関数があります。

local dictTable = {}
local dictTableSize = 0

function buildDictionary()
    local path = system.pathForFile("wordlist.txt")
    local file = io.open( path, "r")
    if file then
        for line in file:lines() do
            dictTable[line] = true
            dictTableSize = dictTableSize + 1
        end      
        io.close(file)
    end
end

function checkWord(word)
    if dictTable[word] then
        return(true)
    else
        return(false)
    end
end

ここで、ランダムな単語をいくつか生成できるようにしたいと思います。しかし、単語がキーなので、dictTableSizeを指定して、どのようにいくつかを選択できますか。

ありがとう

4

3 に答える 3

1

おそらく2つの方法があります。配列を単語で保持しwords[math.random(#words)]、ランダムな単語を選択する必要があるときに行うことができます(2番目の単語が最初の単語と異なることを確認してください)。

もう 1 つの方法は、next必要な回数を使用することです。

function findNth(t, n)
  local val = next(t)
  for i = 2, n do val = next(t, val) end
  return val
end

bこれはforを返しますfindNth({a = true, b = true, c = true}, 3)(順序は未定義です)。

結果をメモ化することで、スキャンの繰り返しを避けることができます (この時点では、最初の方法を使用したほうがよいでしょう)。

于 2013-02-01T17:31:43.570 に答える
1

ロード中に各単語の数値インデックスを辞書に追加するだけです。

function buildDictionary()
    local path = system.pathForFile("wordlist.txt")
    local file = io.open( path, "r")
    if file then
        local index = 1
        for line in file:lines() do
            dictTable[line] = true
            dictTable[index] = line
            index = index + 1
        end      
        io.close(file)
    end
end

これで、次のようなランダムな単語を取得できます。

function randomWord()
    return dictTable[math.random(1,#dictTable)]
end

補足: nilLua 条件では false と評価されるため、次のように記述できcheckWordます。

function checkWord(word)
    return dictTable[word]
end

別の補足として、辞書機能をオブジェクトにラップすると、グローバル名前空間の汚染が少なくなります。

local dictionary = { words = {} }

function dictionary:load()
    local path = system.pathForFile('wordlist.txt')
    local file = io.open( path, 'r')
    if file then
        local index = 1
        for line in file:lines() do
            self.words[line] = true
            self.words[index] = line
            index = index + 1
        end      
        io.close(file)
    end
end

function dictionary:checkWord(word)
    return self.words[word]
end

function dictionary:randomWord()
    return self.words[math.random(1,#self.words)]
end

次に、次のように言うことができます。

dictionary:load()
dictionary:checkWord('foobar')
dictionary:randomWord()
于 2013-02-01T18:26:07.693 に答える
0

これは、word table をそのまま使用する場合のトレードオフです。必要に応じてインデックスで単語への参照を取得できるように、ロードしたら単語テーブルを反転します。このようなもの:

-- mimic your dictionary structure
local t = {
    ["asdf"] = true, ["wer"] = true, ["iweir"] = true, ["erer"] = true
}

-- function to invert your word table
function invert(tbl)
    local t = {}
    for k,_ in pairs(tbl) do
        table.insert(t, k)
    end
    return t
end

-- now the code to grab random words
local idx1, idx2 = math.random(dictTableSize), math.random(dictTableSize)
local new_t = invert(t)
local word1, word2 = new_t[idx1], new_t[idx2]
-- word1 and word2 now have random words from your 'dictTable'
于 2013-02-01T17:34:39.097 に答える