Dennis_Chikin 3 658 Опубликовано 4 Января 2015 Поделиться Опубликовано 4 Января 2015 (изменено) С чего начинать и где взять. Установка 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 Изменено 2 Марта 2015 пользователем Kirgudu Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Nazgool 250 Опубликовано 26 Декабря 2014 Поделиться Опубликовано 26 Декабря 2014 (изменено) @Solomon753, В Lua нет стандартных способов работы с дисплеем. Разве что через os.execute, но это для тех, кто хорошо знаком с CMD. А так - необходимо подключать сторонние библиотеки. Lua однопоточен. Поэтому ни о каком "параллельном вычислении" в coroutine нее может быть и речи. Принцип сoroutine заключается в возможности выполнения определённого блока программы (перевод основного потока программы на этот участок кода), которая при некоторых условиях может приостанавливаться, передавая управление обратно основному потоку, с дальнейшей возможностью возобновить выполнение потока с момента его предыдущей остановки. Кроме того - основной поток может обрабатывать возвращаемые из сoroutine данные, и в любой момент возобновлять выполнение сoroutine, передавая в него новые данные, которые могут влиять(изменять) порядок работы функции, являющейся телом сoroutine. Это очень мощный инструмент, но увы, как я уже говорил, однопоточный. Изменено 26 Декабря 2014 пользователем Nazgool Ссылка на комментарий
Solomon753 2 Опубликовано 27 Декабря 2014 Поделиться Опубликовано 27 Декабря 2014 (изменено) Жаль что нет параллельных потоков, при работе с мышью есть проблемы, если слишком часто опрашивать состояние кнопки, а именно каждые 100мс, то на 7-8 опросе состояние не всегда определяется правильно, а дальше так вообще перестаёт, тоже самое и с операцией MoveMouseRelative, чем дальше, тем чаще несрабатывание и полный отказ. Думал с помощью опроса состояния в параллельном потоке это попробовать решить, если это не проблемы контроллера мыши конечно. Видимо тут ничего не поделаешь, не продумал грамотно производитель мыши реализацию Lua в их устройствах. Про os.execute почитал, интересный оператор, но если через него использовать стороннюю программу для определения цвета, то слишком большие задержки наверняка получатся, да и умеет ли он возвращать данные от программы в код Lua пока что не понял. Библиотек умеющих работать с пикселями тоже пока что не заметил, даже близких упомянаний про подобное нигде нет. Вообще добавление в язык подобного штатного оператора существенно усилило бы возможности взаимодействия со сторонними приложениями, особенно с полноэкранными играми. В любом случае спасибо за помощь. Я вот третье издание Роберто Иерузалимского на русском языке с трудом нашел, кто-то отсканировал страницы, качество конечно так себе, но читать можно. Там pdf файл был запаролен для редактирования, программкой снял пароль, может у кого будет желание улучшить качество, там бы контрастность увеличить, текст бледный, можно через фотошоп групповой обработкой файлов, только через акробат сперва страницы в jpeg файлы сконвертировать нужно, потом обратно в pdf запихнуть. Конечно перевести всё это в текстовый формат вряд ли у кого найдётся время и желание. Хорошая книжка, хотелось бы чтобы в хорошем качестве на русском была. На хостинг залил, думаю многим пригодится http://myfolder.ru/files/42637218 Изменено 27 Декабря 2014 пользователем Solomon753 1 Ссылка на комментарий
Nazgool 250 Опубликовано 29 Декабря 2014 Поделиться Опубликовано 29 Декабря 2014 @Solomon753, Да, это стоящая книга. Тем более что Lua 5.2. описан. Пригодится. 186 Мб !!! Это не дело. Я его через ABBYY в html перегнал. Будет где-то 1 Мб. Правда "благодаря качеству" ошибок не мало. Придётся ручками. Так что, если духа хватит, скоро приведу в нормальный вид. 1 2 Ссылка на комментарий
Solomon753 2 Опубликовано 30 Декабря 2014 Поделиться Опубликовано 30 Декабря 2014 Здесь английская версия книги, можно скрипты копировать, проще будет. Programming in Lua, 3rd Edition Roberto Ierusalimschy http://myfolder.ru/files/42658339 1 Ссылка на комментарий
Nazgool 250 Опубликовано 30 Декабря 2014 Поделиться Опубликовано 30 Декабря 2014 (изменено) Это хорошо. Спасибо. Но я уже половину сделал. И на данный момент с копированием примеров проблема. Нет, их HTML всё копируется замечательно. Но при сканировании через ABBYY, я поставил основной язык русский (перевод-то русский), поэтому не факт, что, например, символ 'a' в коде может быть английский. Наверняка он был расценен как русская 'a'. Да подобных казусов не мало. Английская буква 'l' (L) вполне часто становится цифрой '1', буква 'О' - цифрой 0 и т.д. Вручную правлю потихоньку Позже, может быть, скопирую скрипты из последней ссылки. А книга всё-таки бесценная. Вроде я в Lua как и не новичок, но... короче чайник всё равно. Kirgudu, Murarius Спасибо за поддержку. Дело утомительное, но вижу, что хоть кому-то пригодиться. Это придаёт некоторых сил. Изменено 30 Декабря 2014 пользователем Nazgool Добавлено Kirgudu, 31 Декабря 2014 Пригодится сто пудов, причём, уверен, многим. Так что спасибо и тебе за работу и @Solomon753, как раскопавшему сие творение в переводе. Ссылка на комментарий
Nazgool 250 Опубликовано 31 Декабря 2014 Поделиться Опубликовано 31 Декабря 2014 (изменено) Так, друзья, во-первых всех с наступающим Новым Годом. А во-вторых - я не уверен, что Новогодние праздники будут благотворно собствовать мыслительной деятельности. Да и проблемы с попаданием по клавишам обеспечены. Поэтому, приурочивая к Новому Году, выложу черновик. C API пока не осилил (нет ни малейшего желания за личной ненадобностью). Всё остальное пока руками не трогать! Как я уже сказал - черновик. Оформлением, ошибками, перекрестными ссылками и всем прочим займусь ... как только так сразу. Читать по любому гораздо удобнее чем из pdf. Да и нормальный поиск всегда в помощь. Хотя и оформление пока никакое, но ничто не мешает каждому под личные нужды изменить шрифт или что-то другое в PiL3.css. https://yadi.sk/d/hWk932zBdjHnz Изменено 31 Декабря 2014 пользователем Nazgool 2 1 Ссылка на комментарий
Struck 61 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 (изменено) Подскажите более органичное решение следующей задачи: у меня есть 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Так что твой вариант точно не катит. Изменено 2 Января 2015 пользователем Struck Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 (изменено) 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 Изменено 2 Января 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Struck 61 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 (изменено) Кхм, ну и в общем виде моя функция будет выглядеть как-то вот так. Если есть варианты лучше - предлагайте, только проверяйте на всякий случай их перед отправкой 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 Изменено 2 Января 2015 пользователем Kirgudu Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 После table.remove( t, r ) ни каких "дырок" быть не должно. Это не t[r] = nil. В общем, и во втором случае - это из серии "ну так не запрещено же, вот мы и впендюрили, чтоб вы все затрахались !" Но в первом - такое поведение - явная ошибка разработчиков конкретного компилятора. Должно быть переиндексирование. Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Struck 61 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 (изменено) @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 Переиндексация идет, а значит твой код косячит именно там где я и указал выше, сейчас лишь только доказал это эмпирически Изменено 2 Января 2015 пользователем Struck Ссылка на комментарий
Desertir 202 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 На чужой код не смотрел, сначала написал свой велосипед. 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 ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 (изменено) а значит твой код косячит именно там где я и указал вышеТебе шашечки, или ехать ? Берем значение по индексу, и перекладываем. Всю запись удаляем. Если еще раз выпадает тот же индекс, там будет уже другое значение, которое опять же перекладывается. Что еще надо ? Не меняя качество рэндома, можно сделать только так, и ни как иначе. (Варианты только - делать непосредственно в теле кода, или отдельной функцией, как у Desertir.) Если надо, чтобы исходная таблица сохранялась тоже - либо копируем всю таблицу, либо - заводим еще одну, в формате slected[v] = true, и повторный рандом, если попали на помеченное. Больше, собственно, ни как, при имеющейся постановке задачи. P.S. А "сарказм" на самом деле относится к тому, что t = nil в сталкеровской реализации LUA таблицу просто гарантированно разрушает. Изменено 2 Января 2015 пользователем Dennis_Chikin Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
Nazgool 250 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 (изменено) Ого, сколько тут всего произошло. Читать все коды тоже не буду. Предложу свой вариант. Все условия задачи не читал, но ... Каждый поиск случайного числа можно производить в любой момент, т.е. не обязательно все пять вызовов в одном каком-то потоке. Сделал по принципу перестроения таблицы. 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 в ноль. В общем тут количество вариантов напрямую зависит от способа использования. Изменено 2 Января 2015 пользователем Nazgool 1 Ссылка на комментарий
Struck 61 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 @Nazgool, именно то, что я хотел сделать, но не сообразил как, спасибо. Только в функции t на tab надобно поменять. @Dennis_Chikin, извини, тупанул. Ссылка на комментарий
Nazgool 250 Опубликовано 2 Января 2015 Поделиться Опубликовано 2 Января 2015 (изменено) Только в функции t на tab надобно поменять Таки да. На лету делал. Исправил. Начал приводить в порядок черновик. Оформляю, исправляю. Это ещё более утомительно, но дело идёт. Изменено 2 Января 2015 пользователем Nazgool Ссылка на комментарий
Это популярное сообщение. Nazgool 250 Опубликовано 4 Января 2015 Это популярное сообщение. Поделиться Опубликовано 4 Января 2015 Всё. Надоело мне писать PiL. Примеры исправил. Можно копировать. Оформил...всем всё равно не угодишь. Кто хочет - тот под себя переделает. C API редактировать не хочу. Может сделает тот, кому это действительно нужно. https://yadi.sk/d/4EUvTWhzdnAve 10 1 3 Ссылка на комментарий
Nazgool 250 Опубликовано 7 Января 2015 Поделиться Опубликовано 7 Января 2015 Давеча написал вариант с перестроением таблицы. Использование функций библиотеки 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 Ссылка на комментарий
Desertir 202 Опубликовано 15 Января 2015 Поделиться Опубликовано 15 Января 2015 Немного оффтопика. Появился 5.3 с UTF8 и целыми числами. Когда уже continue запилят... 1 ТЧ 1.0004. SAP и Trans mod github Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти