Если x количество этих фактов истинно, верните y в Lua - PullRequest
1 голос
/ 03 июля 2019

У меня была функция, которая возвращала "Match", если все факты верны (хотя теперь я, кажется, сломал ее, поигравшись с моим текущим затруднением, но это не мой главный вопрос).

function dobMatch(x)
local result = "YearOfBirth" .. x .. "MonthOfBirth"
    if (result:find("DayOfBirth")~= nil and result:find("MonthOfBirth")~= nil and result:find("YearOfBirth")~= nil) then
        return "Match"
    else
        return nil
    end
end

dobList = {dobMatch("DayOfBirth"), dobMatch("Day")}

print(#dobList)

Мой актуальный вопрос, заключается в том, что если я пытаюсь сказать, что любые 2 из фактов result:find("DayOfBirth")~= nil and result:find("MonthOfBirth")~= nil and result:find("YearOfBirth"), а не все 3.

Пожалуйста, помните, что в моем актуальном вопросе есть 12 фактов, из которых 10 нужночтобы быть правдой, так что было бы очень долго перебирать все комбинации.

Заранее спасибо за помощь!


Бонус-раунд!(Я неверно истолковал свою цель)

Если бы я хотел по-разному оценить эти факты, то есть DayOfBirth гораздо важнее, чем Month, я бы просто изменил 1 (в ответе Nifim) на значение, которое я хочу, чтобы он был взвешен?

1 Ответ

2 голосов
/ 03 июля 2019

Вы можете изменить характер своей задачи, чтобы сделать ее математической задачей.

Вы можете сделать это, используя тройной стиль lua :

matches = (condition == check) and 1 or 0

Здесь происходит то, что когда условие истинно, выражение возвращает 1, если оно ложно, 0. Это означает, что вы можете добавить этот результат в переменную для отслеживания совпадений.Это позволяет вам просто оценить количество совпадений.

Как показано В этом примере я предлагаю переместить чеки вне условия оператора if, чтобы код был немного аккуратнее:

function dobMatch(x)
    local result = "YearOfBirth" .. x .. "MonthOfBirth"

    local matches = (result:find("DayOfBirth")~= nil) and 1 or 0
    matches = matches + ((result:find("MonthOfBirth")~= nil) and 1 or 0)
    matches = matches + ((result:find("YearOfBirth")~= nil) and 1 or 0)

    if ( matches >= 2) then
        return "Match"
    else
        return nil
    end
end

dobList = {dobMatch("DayOfBirth"), dobMatch("Day")}

print(#dobList)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...