• Lua генерирует и исполняет код

    Перенесена Вопросы, обсуждения и предложения loadstring генерация кода
    1
    0 Голоса
    1 Сообщения
    822 Просмотры
    MasterGHM
    Функция loadstring позволяет исполнять текст как код. Попробуем генерировать числа, сравнения чисел и логику И, ИЛИ. Цель: просто пример. Создать пары случайных чисел А и Б. Случайно сравнить попарно. Создать случайно логику "И, ИЛИ" и сравнить результаты сравнения до тех пор, пока не будут истинны function CheckTrue(parameter, strue, sfalse) if parameter then print(strue) else print(sfalse) end end ProgrammCompare_AxB = {} function ProgrammCompare_AxB:New(_name, _tableStringCondition) local obj = {} obj.programmName = _name obj.tableStringCondition = _tableStringCondition obj.stringCondition = '' obj.randomProgramm = '' function obj:MakeProgramm() obj.stringCondition = obj.tableStringCondition[math.random(1, #obj.tableStringCondition)] print(obj.stringCondition) obj.randomProgramm = 'function ' ..obj.programmName..'(a, b) return a '..obj.stringCondition..' b end' end function obj:RunProgramm(a, b) loadstring (obj.randomProgramm)() result = nil loadstring (string.format('result = %s(%s,%s)', obj.programmName, a, b))() CheckTrue ( result, string.format('a = %s, b = %s, result = true', a, b), string.format('a = %s, b = %s, result = false', a,b) ) return result end setmetatable(obj, self) obj.__index = ProgrammCompare_AxB return obj end compareProgramm1 = ProgrammCompare_AxB:New('ProgrammCompare_AxB_1', { '>', '<', '>=', '<=', '==', '~=' }) compareProgramm2 = ProgrammCompare_AxB:New('ProgrammCompare_AxB_2', { 'and', 'or' }) repeat compareProgramm1:MakeProgramm() compareProgramm2:MakeProgramm() -- Подбирать значения local a = compareProgramm1:RunProgramm(math.random(1, 100), math.random(1, 100)) local b = compareProgramm1:RunProgramm(math.random(1, 100), math.random(1, 100)) local c = compareProgramm2:RunProgramm(a, b) until c Пример вывода в Cheat Engine: >= or a = 83, b = 75, result = true a = 18, b = 86, result = false a = true, b = false, result = true Т.е. (83 >= 75 or 18 >= 86) == true, т.к. первое условие верное 83 >= 75 83 >= 75 = true 18 >= 86 = false
  • Выполить текст, как код

    Перенесена Статьи и видео фишки ce lua loadstring
    1
    0 Голоса
    1 Сообщения
    66 Просмотры
    MasterGHM
    Функция loadstring исполняет строку кода как функцию. f = loadstring ("print 'hello, world'") f () --> hello, world Есть еще и такая функция как string.dump. Она создает строку из функции function f () print "hello, world" end s = string.dump (f) \-- Можно строку тут же запустить как код loadstring (s) () --> hello, world Если по обратной связи строить и исполнять строку кода, то предположительно можно генерировать код другим кодом и учитывать гораздо больше условий, чем это может сделать человек. Пригодится для ИИ отладки и для ИИ бота. Код пишет другой код по обратной связи. Реальность?