LINUX.ORG.RU

История изменений

Исправление LINUX-ORG-RU, (текущая версия) :

По поводу find

А так, бей входящую квестовую строку на токены и рули =)

--разбить текущее сообщение на токены
--проверить наличие в сообщении всех нужных
--слов согласно правилу
--вернуть инфу содержит ли сообщение все нужные слова
--и в любом случае вернуть всё что совпало с правилом
function check_items(message,items)
    local found    = {};
    local notfound = {};
    for item in string.gmatch(message, '([^,^%s^.]+)') do
        for i=1,#items do
            if(items[i] == item) then
              found[#found+1] = item;
            end
        end
    end

    for i=1,#items do
        local cmp = 0;
        for k=1,#found do
            if(items[i] == found[k]) then
               cmp = 1
            end
        end
        if cmp == 0 then
            notfound[#notfound+1]=items[i];
        end
    end

    if #found == #items then
        return true, found,notfound;
    else
        return false,found,notfound;
    end

end

function print_r(...)
    io.write('\x1B[31m')
    print(...)
    io.write('\x1B[39m')
end
function print_g(...)
    io.write('\x1B[32m')
    print(...)
    io.write('\x1B[39m')
end
function print_y(...)
    io.write('\x1B[33m')
    print(">>> ".. ...)
    io.write('\x1B[39m')
end

-- принять сообщение и правило квеста
function check_quest(message,rule)
    print_y(message);
    local state,found,notfound = check_items(message,rule)
    -- всё нашлось квест выполнен в полном объёме
    -- репортуем об успехе.
    if state then
        print("### Отлично, вот твоя награда. Спасибо что принёс:");
        for i=1,#found do
            print_g('-',found[i]);
        end
    else
        print("### Я просил у тебя:");
        for k,v in ipairs(rule) do
            print_g('-',v);
        end
        if #found > 0 then
        print("### А не только:");
            for k,v in ipairs(found) do
                print_r('-',v);
            end
        end
        print("### Приснеси:");
        for k,v in ipairs(notfound) do
            print_g('-',v);
        end
    end
    print("-----------------------------------");
end


local quest_rule = {"яблоки","орехи","Лепрогнома-работника"};
local message = "Я принёс орехи, яблоки, зерно и палку Лепрогнома-работника.";

check_quest(message,quest_rule);

local message = "Я принёс орехи, зерно и палку Лепрогнома-работника.";

check_quest(message,quest_rule);

local message = "Я принёс камушек Лепрогнома-трактирщика.";

check_quest(message,quest_rule);
dron@gnu:~$ lua lalala.lua 
>>> Я принёс орехи, яблоки, зерно и палку Лепрогнома-работника.
### Отлично, вот твоя награда. Спасибо что принёс:
-	орехи
-	яблоки
-	Лепрогнома-работника
-----------------------------------
>>> Я принёс орехи, зерно и палку Лепрогнома-работника.
### Я просил у тебя:
-	яблоки
-	орехи
-	Лепрогнома-работника
### А не только:
-	орехи
-	Лепрогнома-работника
### Приснеси:
-	яблоки
-----------------------------------
>>> Я принёс камушек Лепрогнома-трактирщика.
### Я просил у тебя:
-	яблоки
-	орехи
-	Лепрогнома-работника
### Приснеси:
-	яблоки
-	орехи
-	Лепрогнома-работника
-----------------------------------
dron@gnu:~$ 

Исправление LINUX-ORG-RU, :

Бей входящую квестовую строку на токены и рули =)

--разбить текущее сообщение на токены
--проверить наличие в сообщении всех нужных
--слов согласно правилу
--вернуть инфу содержит ли сообщение все нужные слова
--и в любом случае вернуть всё что совпало с правилом
function check_items(message,items)
    local found    = {};
    local notfound = {};
    for item in string.gmatch(message, '([^,^%s^.]+)') do
        for i=1,#items do
            if(items[i] == item) then
              found[#found+1] = item;
            end
        end
    end

    for i=1,#items do
        local cmp = 0;
        for k=1,#found do
            if(items[i] == found[k]) then
               cmp = 1
            end
        end
        if cmp == 0 then
            notfound[#notfound+1]=items[i];
        end
    end

    if #found == #items then
        return true, found,notfound;
    else
        return false,found,notfound;
    end

end

function print_r(...)
    io.write('\x1B[31m')
    print(...)
    io.write('\x1B[39m')
end
function print_g(...)
    io.write('\x1B[32m')
    print(...)
    io.write('\x1B[39m')
end
function print_y(...)
    io.write('\x1B[33m')
    print(">>> ".. ...)
    io.write('\x1B[39m')
end

-- принять сообщение и правило квеста
function check_quest(message,rule)
    print_y(message);
    local state,found,notfound = check_items(message,rule)
    -- всё нашлось квест выполнен в полном объёме
    -- репортуем об успехе.
    if state then
        print("### Отлично, вот твоя награда. Спасибо что принёс:");
        for i=1,#found do
            print_g('-',found[i]);
        end
    else
        print("### Я просил у тебя:");
        for k,v in ipairs(rule) do
            print_g('-',v);
        end
        if #found > 0 then
        print("### А не только:");
            for k,v in ipairs(found) do
                print_r('-',v);
            end
        end
        print("### Приснеси:");
        for k,v in ipairs(notfound) do
            print_g('-',v);
        end
    end
    print("-----------------------------------");
end


local quest_rule = {"яблоки","орехи","Лепрогнома-работника"};
local message = "Я принёс орехи, яблоки, зерно и палку Лепрогнома-работника.";

check_quest(message,quest_rule);

local message = "Я принёс орехи, зерно и палку Лепрогнома-работника.";

check_quest(message,quest_rule);

local message = "Я принёс камушек Лепрогнома-трактирщика.";

check_quest(message,quest_rule);
dron@gnu:~$ lua lalala.lua 
>>> Я принёс орехи, яблоки, зерно и палку Лепрогнома-работника.
### Отлично, вот твоя награда. Спасибо что принёс:
-	орехи
-	яблоки
-	Лепрогнома-работника
-----------------------------------
>>> Я принёс орехи, зерно и палку Лепрогнома-работника.
### Я просил у тебя:
-	яблоки
-	орехи
-	Лепрогнома-работника
### А не только:
-	орехи
-	Лепрогнома-работника
### Приснеси:
-	яблоки
-----------------------------------
>>> Я принёс камушек Лепрогнома-трактирщика.
### Я просил у тебя:
-	яблоки
-	орехи
-	Лепрогнома-работника
### Приснеси:
-	яблоки
-	орехи
-	Лепрогнома-работника
-----------------------------------
dron@gnu:~$ 

Исходная версия LINUX-ORG-RU, :

Бей входящую квестовую строку на токены и рули =)

--разбить текущее сообщение на токены
--проверить наличие в сообщении всех нужных
--слов согласно правилу
--вернуть инфу содержит ли сообщение все нужные слова
--и в любом случае вернуть всё что совпало с правилом
function check_items(message,items)
    local found    = {};
    local notfound = {};
    for item in string.gmatch(message, '([^,^%s^.]+)') do
        for i=1,#items do
            if(items[i] == item) then
              found[#found+1] = item;
            end
        end
    end

    for i=1,#items do
        local cmp = 0;
        for k=1,#found do
            if(items[i] == found[k]) then
               cmp = 1
            end
        end
        if cmp == 0 then
            notfound[#notfound+1]=items[i];
        end
    end

    if #found == #items then
        return true, found,notfound;
    else
        return false,found,notfound;
    end

end

function print_r(...)
    io.write('\x1B[31m')
    print(...)
    io.write('\x1B[39m')
end
function print_g(...)
    io.write('\x1B[32m')
    print(...)
    io.write('\x1B[39m')
end
function print_y(...)
    io.write('\x1B[33m')
    print(">>> ".. ...)
    io.write('\x1B[39m')
end

-- принять сообщение и правило квеста
function check_quest(message,rule)
    print_y(message);
    local state,found,notfound = check_items(message,rule)
    -- всё нашлось квест выполнен в полном объёме
    -- репортуем об успехе.
    if state then
        print("### Отлично, вот твоя награда. Спасибо что принёс:");
        for i=1,#found do
            print_g('-',found[i]);
        end
    else
        print("### Я просил у тебя:");
        for k,v in ipairs(rule) do
            print_g('-',v);
        end
        if #found > 0 then
        print("### А не только:");
            for k,v in ipairs(found) do
                print_r('-',v);
            end
        end
        print("### Приснеси:");
        for k,v in ipairs(notfound) do
            print_g('-',v);
        end
    end
    print("-----------------------------------");
end


local quest_rule = {"яблоки","орехи","Лепрогнома-работника"};
local message = "Я принёс орехи, яблоки, зерно и палку Лепрогнома-работника.";

check_quest(message,quest_rule);

local message = "Я принёс орехи, зерно и палку Лепрогнома-работника.";

check_quest(message,quest_rule);

local message = "Я принёс камушек Лепрогнома-трактирщика.";

check_quest(message,quest_rule);
>>> Я принёс орехи, яблоки, зерно и палку Лепрогнома-работника.
### Отлично, вот твоя награда. Спасибо что принёс:
-       орехи
-       яблоки
-       Лепрогнома-работника
>>> Я принёс орехи, яблоки, зерно и палку Лепрогнома-работника.
### Отлично, вот твоя награда. Спасибо что принёс:
-       орехи
-       яблоки
-       Лепрогнома-работника
-----------------------------------
>>> Я принёс орехи, зерно и палку Лепрогнома-работника.
### Я просил у тебя:
-       яблоки
-       орехи
-       Лепрогнома-работника
### А не только:
-       орехи
-       Лепрогнома-работника
### Приснеси:
-       яблоки
-----------------------------------
>>> Я принёс камушек Лепрогнома-трактирщика.
### Я просил у тебя:
-       яблоки
-       орехи
-       Лепрогнома-работника
### Приснеси:
-       яблоки
-       орехи
-       Лепрогнома-работника
-----------------------------------
dron@gnu:~$