начинающий lua: проверить массив на значение - PullRequest
0 голосов
/ 06 ноября 2018

Мне нужно сгенерировать случайное число, а затем проверить, в каких таблицах (массивах) это число указано в качестве значения. После завершения проверки мне нужно вывести таблицы, в которых отображаются цифры.

Например, будет сгенерировано случайное число от 1 до 21, а затем будет выполнен поиск в других таблицах чисел.

evens = {2,4,6,8,10,12,14,16,18,20}
odds = {1,3,5,7,9,11,13,15,17,19,21}
low = {1,2,3,4,5,6,7}
med = {8,9,10,11,12,13,14}
high = {15,16,17,18,19,20,21}

Если бы 17 было случайным числом, мне нужно было бы вывести «odds» и «high».

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Самое общее решение, которое я могу предложить, - это создать что-то вроде инвертированный индекс . Вам просто нужно создать запись в таблице для каждого возможного термина (число, в вашем случае). Значения в такой таблице представляют собой массивы, в которых вы можете найти свой термин. Код может выглядеть так:

local evens = { 2, 4, 6, 8, name = 'evens'}
local odds = {1, 3, 5, 7, name = 'odds'}
local low = { 1, 2, 3, 4, name = 'low'}
local high = {15, 16, 17, 18, 19, name = 'high'}

local inv_index = {}

function add_to_index(index, numbers)
    for i, number in ipairs(numbers) do
            local indexed = index[number]
            if not indexed then
                    index[number] = { numbers }
            else
                    table.insert(indexed, numbers)
            end
    end
end

add_to_index(inv_index, evens)
add_to_index(inv_index, odds)
add_to_index(inv_index, low)
add_to_index(inv_index, high)

-- which arrays contains the number "4"?
for k, indexed in pairs(inv_index[4]) do
    print(indexed.name) -- prints "evens" and "low"
end

Недостатком этого решения является потребление памяти, особенно если число возможных чисел велико. Альтернативой является сортировка каждого массива и выполнение бинарного поиска . Существует реализация для lua.

Если вы можете изменить свои массивы, вы можете просто хранить числа в некотором наборе:

local evens = { [2] = true, [4] = true, [6] = true, [8] = true }
local low = { [1] = true, [2] = true, [3] = true, [4] = true }
local odds = { [1] = true, [3] = true , [5] = true, [7] = true }

local x = 4

print(evens[x] ~= nil) -- true
print(low[x] ~= nil) -- true
print(odds[x] ~= nil) -- false
0 голосов
/ 06 ноября 2018

Для проверки нечетных таблиц не нужны, а попадание в диапазон легче проверить по пределам:

local low = {1,2,3,4,5,6,7}
local med = {8,9,10,11,12,13,14}
local high = {15,16,17,18,19,20,21}

local n = 33
local function CheckNum(n)
    local tab_type = 'unknown'
    if n  >= 1 and n <=7 then tab_type = "low"
    elseif n  >= 8 and n <=14  then tab_type = "med"
    elseif n  >= 15 and n <=21 then tab_type = "high"   
    end
    local odd = (n%2==0) and "even" or "odd" 
    return odd,  tab_type
end

local odd,  tab_type = CheckNum(n)
print ( odd, " ", tab_type )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...