• Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
  • Зарегистрироваться
  • Войти
CELua[RU]
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
  • Зарегистрироваться
  • Войти

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

Запланировано Прикреплена Закрыта Перенесена MasterGH
loadstringгенерация кода
1 Сообщения 1 Posters 765 Просмотры 1 Watching
Загружаем больше сообщений
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • M Не в сети
    УченикMasterGH Администраторы
    отредактировано MasterGH 14 мая 2023 г., 13:03

    Функция 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
    1 ответ Последний ответ Ответить Цитировать 0

    • 1 / 1
    1 / 1
    • Первое сообщение
      1/1
      Последнее сообщение
    Powered by NodeBB | Contributors
    СeLua[RU] 2025©