Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Помогите разобраться с поиском в массиве.
KotMC
сообщение 30.1.2021, 13:36
Сообщение #1


**

Neophyte
Сообщений: 34
Регистрация: 10.1.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 19.851
Возраст: 36



Есть массив (таблица) из множества строк. Двух и более столбцов.
В первом столбце находятся данные для переменной, во втором "ключ" который говорит нужно ли использовать данные из первого столбца.
Как мне выполнить поиск по массиву во втором столбце и присвоить данные из первого столбца той строки в которой нашлось совпадения "ключа"?
Помогите примером.

Использовать хочу в этом скрипте:
скрипт

--lua

local hw = require'arduino'
hw.com = hw.get_port (2341, 8036) -- указать vid и pid ардуино
if hw.com < 1 then -- если номер порта меньше 1
log ('error = ' .. tostring(hw.com)) -- код ошибки, если 0 значит устройство с указанными vip и pid не найдено
end_script ()
end

hw.set_delay_mouse (200) -- установить паузу между нажатиями клавиш мыши
hw.set_random_delay_mouse(50) -- установить рандом между нажатиями клавиш мыши от 200 до 249 мсек
-- т. е. между нажатием и отпусканием кнопки мыши будет пауза от 20 до 29 мсек.
hw.set_offset_mousemove(1) -- шаг перемещения курсора, чем больше тем быстрее перемещается
hw.set_delay_mousemove(2) -- установить паузу между каждый шагом перемещения мыши,
-- чем меньше, тем быстрее перемещается
::poisk_logina::
while true do
local read_logins_from_file=[[C:\not\list_login.txt]] -- путь к файлу
local arrLogin={} -- массив

log "clear"
log "mode compact"
function loadarray(array, read)
local file= io.open(read, "r")
if file then
for v in file:lines() do
array[#array+1]={}
for k, v1 in string.gmatch(v,"[^\t]+") do
table.insert(array[#array], k)
end
end
file:close()
return 1
end
return nil
end

if loadarray(arrLogin, read_logins_from_file) then -- если функция выполнена успешно


log (arrLogin[1][1])
log (arrLogin[1][1])
else
log ("Файл не найден")
end



local startX, startY, endX, endY = 530, 180, 757, 254 -- координаты поиска
local path = arrLogin[1][1] -- путь к картинке, bmp 24 бита берется из массива
findoffsetx (10 + math.random (50)) -- смещение вправо на 50 пикселей
findoffsety (5 + math.random (20)) -- смещение вниз на 30 пикселей
local login, a = findimage (startX, startY, endX, endY, {path}, 2) -- поиск картинки
hint (a) -- результат поиска, подсказка в правом --нижнем углу
if login then -- если найдена
--log ("Изображение найдено в координатах X= " .. login[1][1] .. " Y= " .. login[1][2])
hw.mouse.move (login[1][1], login[1][2]) -- переместить мышь с учетом уставки findoffsetx + findoffsetу
wait (500 + math.random (1000))
hw.mouse.left ()

else
while true do --цикл поиска пикселя + смещение логинов
findoffsetx (1 + math.random (5)) -- смещение вправо на 1+-5 пикселей
findoffsety (2 + math.random (20)) -- смещение вниз на 2+-20 пикселей
local b = findcolor([[800 170 828 400 (13421772) %arr]]) -- параметры передаются в виде строки
-- [[800 170 828 400-это координаты поиска цвета
-- (00000000)-это искомый цвет
-- %arr название массива поиска функции ]]
hint ("Найдено пикселей " .. (IMG:style_emoticons/default/cool.gif)
if b > 0 then -- если найдены
hw.mouse.move (arr[1][1], arr[1][2]) -- переместить мышь в наденные координаты
-- с учетом findoffsetx (1 + math.random (5))
-- findoffsety (2 + math.random (20))
wait (500 + math.random (500))
hw.mouse.left_down () -- зажать (не отжимая) левую кнопку мыши
wait (500 + math.random (100))
hw.mouse.move (arr[1][1], arr[1][2] - 1) -- переместить мышь на -1 пиксель по оси у координаты
wait (500 + math.random (100))
hw.mouse.left_up () -- отжать левую кнопку мыши
break
end
end
end
end




фаил list_login.txt имеет следующий вид:

[["C:\not\img00001.bmp"]] y
[["C:\not\img00002.bmp"]] n
[["C:\not\img00003.bmp"]] n

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.1.2021, 14:05
Сообщение #2


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



Цитата
фаил list_login.txt имеет следующий вид:

Нужно найти все строки, к конце которых y?
код
Код
--lua
function loadarray(array, read)
    local file= io.open(read, "r")
    if file then
        for v in file:lines() do
            for k in v:gmatch("(.-) +y$") do
                array[#array+1] = k
            end
        end
        file:close()
        return 1
    end
    return nil
end

local read_logins_from_file=[[C:\not\list_login.txt]] -- путь к файлу
local arrLogin={} -- массив

log "clear" log "mode compact"

if loadarray(arrLogin, read_logins_from_file) then -- если функция выполнена успешно
    log('Найдено строк: ' .. tostring(#arrLogin))
    for i = 1, #arrLogin do
        log (arrLogin[i])
    end
else
    log ("Файл не найден")
    end_script()
end

Квадратные скобки и кавычки в файле нужны ли?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
KotMC
сообщение 30.1.2021, 15:22
Сообщение #3


**

Neophyte
Сообщений: 34
Регистрация: 10.1.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 19.851
Возраст: 36



Да нужно найти поочередно строчки в которых есть "у", а то что перед ним использовать в этой переменной:

local path = arrLogin[][] -- путь к картинке, bmp 24 бита берется из массива

переменную path использую как путь к файлу .bmp для findimage, у меня заработал поиск только когда путь в файле записал в кавычках и квадратных скобках.

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
KotMC
сообщение 30.1.2021, 15:49
Сообщение #4


**

Neophyte
Сообщений: 34
Регистрация: 10.1.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 19.851
Возраст: 36



От скрипта хочу добиться примерно того же, как в теме:

https://forum.uokit.com/index.php?showtopic=70421

За одним исключение что хочу управлять скриптом (в плане выбора аккаунта, аккаунтов) из текстового файла.
Заход и прохождение построено будет на findimage.
При завершении прохождения одного аккаунта из списка аккаунтов хотел менять "y" на "n", в массиве.
Запись в массив в нужное место вроде понял как делать, а вот поиск по массиву не удается понять. (
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.1.2021, 17:08
Сообщение #5


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



Цитата
менять "y" на "n", в массиве.

Зачем? Прочитать файл, найти нужные строки, записать их в массив. Дальше уже выполнить нужные действия.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
KotMC
сообщение 30.1.2021, 17:43
Сообщение #6


**

Neophyte
Сообщений: 34
Регистрация: 10.1.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 19.851
Возраст: 36



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

Как я вижу работу ищем во втором столбце "ключ" если находим, проверяем третий столбец если находим "p", пропускаем, и делаем только те строки в которых нет "ключа" "p", после прохождения всех строк без "p", проходим строки где есть оба "ключа" "y+p".

Просил пример или объяснение поиска в массиве - на примере множества строк и двух столбцов, чтоб можно было понять принцип и синтаксис (на малом) написания такого кода, и в последствии при необходимости расширить на другое количество столбцов.

Для меня все это в новинку учусь на примерах.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.1.2021, 17:59
Сообщение #7


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



Цитата
пример или объяснение поиска в массиве

Код
--lua
log 'clear' log 'mode compact'

local array = {
                {'image1.bmp', 'n', 'p'},
                {'image2.bmp', 'y', 'p'},
                {'image3.bmp', 'n', ''},
                {'image4.bmp', 'y', 'p'},
                {'image5.bmp', 'n', 'p'},
                {'image6.bmp', 'y', ''}
                }

for i=1, #array do
    if array [i][2] == 'y' and array [i][3] == 'p' then
        log (array [i][1])
    end
end

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
KotMC
сообщение 30.1.2021, 18:16
Сообщение #8


**

Neophyte
Сообщений: 34
Регистрация: 10.1.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 19.851
Возраст: 36



А какой командой могу остановить For на первом найденном совпадении.
Чтоб в лог вывелась всего одна строка?
или как понять в каком из множества найдены "i" есть совпадение чтоб использовать только одно.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 30.1.2021, 18:30
Сообщение #9


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2419
Пользователь №: 18.746



Цитата(KotMC @ 30.1.2021, 18:16) *

А какой командой могу остановить For на первом найденном совпадении.

Использовать break:
--lua
log 'clear' log 'mode compact'

local array ={
                {'image1.bmp''n''p'},
                {'image2.bmp''y''p'},
                {'image3.bmp''n'''},
                {'image4.bmp''y''p'},
                {'image5.bmp''n''p'},
                {'image6.bmp''y'''}
              }

for i=1, #array do
if array [i][2] == 'y' and array [i][3] == 'p' then
        log (array [i][1])
        break
end
end


Сообщение отредактировал Fors1k - 30.1.2021, 18:31


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.1.2021, 18:36
Сообщение #10


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



Цитата
или как понять в каком из множества найдены "i" есть совпадение чтоб использовать только одно.

код
Код
--lua
log 'clear' log 'mode compact'

local array = {
                {'image1.bmp', 'n', 'p'},
                {'image2.bmp', 'y', 'p'},
                {'image3.bmp', 'n', ''},
                {'image4.bmp', 'y', 'p'},
                {'image5.bmp', 'n', 'p'},
                {'image6.bmp', 'y', ''}
                }

function find()
    for i=1, #array do
        if array [i][2] == 'y' and array [i][3] == 'p' then
            return i
        end
    end
    return nil
end

local index = find()
if index then
    log (index)
    log(array[index][1])
end
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
KotMC
сообщение 30.1.2021, 23:13
Сообщение #11


**

Neophyte
Сообщений: 34
Регистрация: 10.1.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 19.851
Возраст: 36



Первый способ, от Fors1k понятен и отлично подходит под задачу, а способ от Cirus нужно осмыслить и переварить )
Огромное Спасибо, Вам за разъяснения.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
KotMC
сообщение 6.2.2021, 20:27
Сообщение #12


**

Neophyte
Сообщений: 34
Регистрация: 10.1.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 19.851
Возраст: 36



Опять, я в тупике
Начал разбираться с примером от Сirus:
код

--lua
log 'clear' log 'mode compact'

local array = {
{'image1.bmp', 'n', 'p'},
{'image2.bmp', 'y', 'p'},
{'image3.bmp', 'n', ''},
{'image4.bmp', 'y', 'p'},
{'image5.bmp', 'n', 'p'},
{'image6.bmp', 'y', ''}
}

function find()
for i=1, #array do
if array [i][2] == 'y' and array [i][3] == 'p' then
return i
end
end
return nil
end

local index = find()
if index then
log (index)
log(array[index][1])
end

Объясните правильно ли понимаю, Вы объявили переменную index и сказали, что она ровна функции find(). С помощью return i вернули присвоили первое совпадение function find() ? Для чего нужна "return nil" и как она работает(в какой момент)?

Не могу понять как переписать код чтоб искало другие совпадения в этом же массиве, если по первому условию совпадений не нашло.
Прошу, Вашей помощи.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 6.2.2021, 20:40
Сообщение #13


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26576
Пользователь №: 16.971
Возраст: 29



Цитата
объявили переменную index и сказали, что она ровна функции find().

Не функции равна, а тому что вернёт функция, то что после return, в данном случае вернёт значение переменной i или nil.
Цитата
Для чего нужна "return nil" и как она работает(в какой момент)?

Нужна чтобы вернуть результат что функция ничего не нашла. До этой строки дойдёт если в цикле не будет выполнено условие.
Цитата
как переписать код чтоб искало другие совпадения

Код
function find()
    for i=1, #array do
        if array [i][2] == 'y' and array [i][3] == 'p' then
            return i
        end
    end

    for i=1, #array do
        if array [i][2] == 'что-то' and array [i][3] == 'что-то' then
            return i
        end
    end

    return nil
end


Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Fors1k
сообщение 6.2.2021, 21:08
Сообщение #14


*****

Journeyman
Сообщений: 497
Регистрация: 19.12.2017
Группа: Пользователи
Наличность: 2419
Пользователь №: 18.746



Цитата(KotMC @ 6.2.2021, 20:27) *

как переписать код чтоб искало другие совпадения в этом же массиве, если по первому условию совпадений не нашло

script
--lua
log 'clear';log 'mode compact'

array = {
    {'image1.bmp''n''p'},
    {'image2.bmp''y''p'},
    {'image3.bmp''n''' },
    {'image4.bmp''y''p'},
    {'image5.bmp''n''p'},
    {'image6.bmp''y''' }
}

function find(con)
for i = 1, #array do
        if array [i][2] == con[1] and array [i][3] == con[2then
            return array [i][1]
        end
end
return nil
end

search = {
    {'y''x'},
    {'n''p'},
    {'n''z'}
}

for i, v in ipairs(searchdo
result = find(v)
if result then break end
end
if not result then result = 'Ничего не нашлось' end
log (result)
В массиве search перечислите условия поиска.

В данном примере:
'y', 'x' - не найдено, ищет дальше
'n', 'p' - найдено, поиск остановлен, имя первой найденной картинки в переменной result.
'n', 'z' - не использовалось для поиска, так как был успех ранее.

Сообщение отредактировал Fors1k - 6.2.2021, 21:16


--------------------
Для связиИзображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
KotMC
сообщение 6.2.2021, 22:37
Сообщение #15


**

Neophyte
Сообщений: 34
Регистрация: 10.1.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 19.851
Возраст: 36



Спасибо буду осмысливать.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 29.3.2024, 4:48
Designed by Nickostyle