Перейти к контенту

Язык Lua. Общие вопросы программирования


Рекомендуемые сообщения

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu

@Solomon753

В Lua нет стандартных способов работы с дисплеем. Разве что через os.execute, но это для тех, кто хорошо знаком с CMD.
А так - необходимо подключать сторонние библиотеки.
 
Lua однопоточен. Поэтому ни о каком "параллельном вычислении" в coroutine нее может быть и речи.
Принцип сoroutine заключается в возможности выполнения определённого блока программы (перевод основного потока программы на этот участок кода), которая при некоторых условиях может приостанавливаться, передавая управление обратно основному потоку, с дальнейшей возможностью  возобновить выполнение потока с момента его предыдущей остановки. Кроме того - основной поток может обрабатывать возвращаемые из сoroutine данные, и в любой момент возобновлять выполнение сoroutine, передавая в него новые данные, которые могут влиять(изменять) порядок работы функции, являющейся телом сoroutine. Это очень мощный инструмент, но увы, как я уже говорил, однопоточный.
Изменено пользователем Nazgool

Жаль что нет параллельных потоков, при работе с мышью есть проблемы, если слишком часто опрашивать состояние кнопки, а именно каждые 100мс, то на 7-8 опросе состояние не всегда определяется правильно, а дальше так вообще перестаёт, тоже самое и с операцией MoveMouseRelative, чем дальше, тем чаще несрабатывание и полный отказ. Думал с помощью опроса состояния в параллельном потоке это попробовать решить, если это не проблемы контроллера мыши конечно. Видимо тут ничего не поделаешь, не продумал грамотно производитель мыши реализацию Lua в их устройствах.

 

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

 

Я вот третье издание Роберто Иерузалимского на русском языке с трудом нашел, кто-то отсканировал страницы, качество конечно так себе, но читать можно. Там pdf файл был запаролен для редактирования, программкой снял пароль, может у кого будет желание улучшить качество, там бы контрастность увеличить, текст бледный, можно через фотошоп групповой обработкой файлов, только через акробат сперва страницы в jpeg файлы сконвертировать нужно, потом обратно в pdf запихнуть. Конечно перевести всё это в текстовый формат вряд ли у кого найдётся время и желание.  Хорошая книжка, хотелось бы чтобы в хорошем качестве на русском была.

На хостинг залил, думаю многим пригодится http://myfolder.ru/files/42637218

Изменено пользователем Solomon753
  • Полезно 1

@Solomon753

Да, это стоящая книга. Тем более что Lua 5.2. описан. Пригодится.

186 Мб !!! Это не дело.

Я его через ABBYY в html перегнал. Будет где-то 1 Мб.

Правда "благодаря качеству" ошибок не мало. Придётся ручками.

Так что, если духа хватит, скоро приведу в нормальный вид.

  • Спасибо 1
  • Полезно 2

Здесь английская версия книги, можно скрипты копировать, проще будет.

Programming in Lua, 3rd Edition Roberto Ierusalimschy http://myfolder.ru/files/42658339

  • Полезно 1

Это хорошо. Спасибо.

Но я уже половину сделал.

И на данный момент с копированием примеров проблема.

Нет, их HTML всё копируется замечательно. Но при сканировании через ABBYY, я поставил основной язык русский (перевод-то русский), поэтому не факт, что, например, символ 'a' в коде может быть английский. Наверняка он был расценен как русская 'a'.

Да подобных казусов не мало. Английская буква 'l' (L) вполне часто становится цифрой '1', буква 'О' - цифрой 0 и т.д.

Вручную правлю потихоньку

 

Позже, может быть, скопирую скрипты из последней ссылки.

А книга всё-таки бесценная. Вроде я в Lua как и не новичок, но... короче чайник всё равно.

 

Kirgudu, Murarius

Спасибо за поддержку. Дело утомительное, но вижу, что хоть кому-то пригодиться.

Это придаёт некоторых сил.

Изменено пользователем Nazgool
Добавлено Kirgudu,

Пригодится сто пудов, причём, уверен, многим.

Так что спасибо и тебе за работу и @Solomon753, как раскопавшему сие творение в переводе.

Так, друзья, во-первых всех с наступающим Новым Годом.

А во-вторых - я не уверен, что Новогодние праздники будут благотворно собствовать мыслительной деятельности.

Да и проблемы с попаданием по клавишам обеспечены.

Поэтому, приурочивая к Новому Году, выложу черновик.

C API пока не осилил (нет ни малейшего желания за личной ненадобностью).

Всё остальное пока руками не трогать! :)

Как я уже сказал - черновик.

Оформлением, ошибками, перекрестными ссылками и всем прочим займусь ... как только так сразу.

Читать по любому гораздо удобнее чем из pdf. Да и нормальный поиск всегда в помощь.

Хотя и оформление пока никакое, но ничто не мешает каждому под личные нужды изменить шрифт или что-то другое в PiL3.css.


Изменено пользователем Nazgool
  • Спасибо 2
  • Нравится 1

Подскажите более органичное решение следующей задачи: у меня есть 10 чисел (от 1 до 10 например), мне нужно рандомно получить 5 из них, причем так, что-бы ни одно не повторилось. Мне ничего изящнее в голову не пришло:

local t,i,r = {},1,math.random
while i<6 do
local r = r(10)
if not t[r] then t[r] = true; i=i+1 end
end
@Dennis_Chikin, лишние телодвижения с созданием индексированного массива чисел для выбора мне не нужны. Конкретно есть диапазон, и конкретно-же мне нужно выбрать из него n-ое количество неповторяющихся чисел. И у тебя код неверно будет работать:

 

local t = { ... } --// допустим тут 1 ... 10
local n = #t --// тут 10
local tt = {]
local r
for i = 1,5 do
if n < 1 then break end
r = math.random( n ) --// вот тут и есть ошибка, можем выбрать повторяющееся значение, ты удаляешь значение, а рандом идет по индексу, можешь сам проверить 
tt[i] = t[r]
table.remove( t, r )
n = n - 1
end
Так что твой вариант точно не катит. Изменено пользователем Struck

local t = { ... }

local n = #t

local tt = {}

local r

for i = 1,5 do

if n < 1 then break end

r = math.random( n )

tt = t[r]

table.remove( t, r )

n = n - 1

end

Изменено пользователем Dennis_Chikin

Кхм, ну и в общем виде моя функция будет выглядеть как-то вот так. Если есть варианты лучше - предлагайте, только проверяйте на всякий случай их перед отправкой  ;)

 

get_numbers = function(...)
local t,i,r,c,m,n,list = {},0,math.random,...
while i<c do
local r = tonumber(n) and r(m,n) or r(m)
if not t[r] then t[r] = true; i=i+1 end
end
if list then local tt = {} for k,_ in next,t do table.insert(tt,k) end return tt 
else  return t
end
end
Изменено пользователем Kirgudu

После table.remove( t, r ) ни каких "дырок" быть не должно. Это не t[r] = nil.

 

В общем, и во втором случае - это из серии "ну так не запрещено же, вот мы и впендюрили, чтоб вы все затрахались !"

Но в первом - такое поведение - явная ошибка разработчиков конкретного компилятора. Должно быть переиндексирование.

@Dennis_Chikin, переиндексирование и так есть, очевидно же. table.remove удаляет значение со сдвигом, значение может удалится по середине, а индекс по-любому с конца.

"ну так не запрещено же, вот мы и впендюрили, чтоб вы все затрахались !"

Порой я твой сарказм не понимаю.

 

"Дырок" там конечно же нет, это тоже очевидно. Вот тебе нагляднейший пример:

 

 

t={}
for i=1,10 do
table.insert(t,i)
end
print("ONE:")
for k,v in pairs(t) do
print(k.."="..v)
end
table.remove(t,t[6])
print("TWO:")
for k,v in pairs(t) do
print(k.."="..v)
end
На выходе:

 

 

ONE:
1=1
2=2
3=3
4=4
5=5
6=6
7=7
8=8
9=9
10=10
TWO:
1=1
2=2
3=3
4=4
5=5
6=7
7=8
8=9
9=10

 

 

Переиндексация идет, а значит твой код косячит именно там где я и указал выше, сейчас лишь только доказал это эмпирически ;)

Изменено пользователем Struck

На чужой код не смотрел, сначала написал свой велосипед. 

local data = {1,2,3,4,5,6,7,8,9,10}
math.randomseed(os.time())

function get_numbers(tbl, cnt)
    local result = {}
    for i = 1, #tbl do
        result[i] = tbl[i]
    end
    local to_remove = #tbl - cnt
    while to_remove > 0 do
        to_remove = to_remove - 1
        table.remove(result, math.random(#result))
    end
    return result
end

print(table.concat(get_numbers(data, 4), ", "))
print(table.concat(data, ", "))

У @Dennis_Chikin изменение входных данных есть, это не очень хорошо, по моему мнению. Если и это не критично, то мой код вообще можно упростить до безобразия.

@Struck, код с сокращениями нереально читать, если нету комментариев. Более того, ты через неделю уже не узнаешь сам, что тут написано. Всегда лучше называть переменные своими именами, это очень полезно, а прилюдной обфускацией не стОит заниматься.

PS: рандомной выборки из диапазона у меня нет, но без труда можно прикрутить.

  • Согласен 1

а значит твой код косячит именно там где я и указал выше

Тебе шашечки, или ехать ?

Берем значение по индексу, и перекладываем. Всю запись удаляем. Если еще раз выпадает тот же индекс, там будет уже другое значение, которое опять же перекладывается. Что еще надо ?

 

Не меняя качество рэндома, можно сделать только так, и ни как иначе. (Варианты только - делать непосредственно в теле кода, или отдельной функцией, как у Desertir.)

 

Если надо, чтобы исходная таблица сохранялась тоже - либо копируем всю таблицу, либо - заводим еще одну, в формате slected[v] = true, и повторный рандом, если попали на помеченное.

 

Больше, собственно, ни как, при имеющейся постановке задачи.

 

 

P.S. А "сарказм" на самом деле относится к тому, что t = nil в сталкеровской реализации LUA таблицу просто гарантированно разрушает.

Изменено пользователем Dennis_Chikin
Ого, сколько тут всего произошло.
Читать все коды тоже не буду. Предложу свой вариант.
Все условия задачи не читал, но ...
Каждый поиск случайного числа можно производить в любой момент, т.е. не обязательно все пять вызовов в одном каком-то потоке. Сделал по принципу перестроения таблицы.
math.randomseed(os.time())
local t = {1,2,3,4,5,6,7,8,9,10}
t_used = 0

function get_my_rnd(tab)
    if t_used == 5 then return end
    t_used = t_used + 1
    local a = math.random(t_used, #tab)
    table.insert(t,1,table.remove(tab,a))
end

get_my_rnd(t)
get_my_rnd(t)
get_my_rnd(t)
get_my_rnd(t)
get_my_rnd(t)

Для повторного использования просто сбросить t_used  в ноль.

В общем тут количество вариантов напрямую зависит от способа использования.

Изменено пользователем Nazgool
  • Спасибо 1

@Nazgool, именно то, что я хотел сделать, но не сообразил как, спасибо. Только в функции t на tab надобно поменять.

@Dennis_Chikin, извини, тупанул.

Только в функции t на tab надобно поменять

Таки да. На лету делал. Исправил.

Начал приводить в порядок черновик.

Оформляю, исправляю. Это ещё более утомительно, но дело идёт.

Изменено пользователем Nazgool

Давеча написал вариант с перестроением таблицы.

Использование функций библиотеки table вроде как и наглядно показывает принцип работы,

но с другой стороны само использование функций несёт накладные расходы.

От них можно отказаться в пользу увеличения производительности кода.

Как то так :

math.randomseed(os.time())
local t = {1,2,3,4,5,6,7,8,9,10}
t_used = 0

function get_my_rnd(tab)
    t_used = (t_used == 5 and 0 or t_used) + 1
    local index = math.random(t_used, #tab)
    local value = tab[index]
    tab[t_used], tab[index] = value, tab[t_used]
    return value
end

get_my_rnd(t)
...
  • Полезно 2

Немного оффтопика.

Появился 5.3 с UTF8 и целыми числами. Когда уже continue запилят...

  • Полезно 1

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...