Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы Разработчикам Скриптов, вопросы по скриптам (мелкие вопросы) |
26.10.2008, 23:07
Сообщение
#101
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Вот а ещё тут ломаю голову вот над каким вопросом:
есть две таблицы которые сводятся в одну временную после чего сортируется и выводится в чат(скрипт топпоисков) так вот получается что во временной таблице некоторые поля дублируются!!! Например в одной ["фильмы"] = 5 а в другой ["фильмы"] = 10. Как перетрехнуть временную таблицу чтобы при нахождении дублирующие поля удалялись а их значения складывались? |
|
|
27.10.2008, 0:05
Сообщение
#102
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
У тебя вот такая конструкция:
Код if num == "1" then Думаю можно сделать так:for j,q in pairs(v) do table.insert(tTemp,{j,q}) end else Код if num == "1" then local tTemp2 = {} for j,q in pairs(v) do tTemp2[j] = q + (tTemp2[j] or 0) end for k, l in pairs(tTemp2) do table.insert(tTemp,{k,l}) end else Думаю суть ясна, если код "1", тогда мы создаем доп. временнную талицу, в которой суммируются данные при проходе по всей таблице tSeachTop, затем они добавляются в исходную таблицу tTemp |
|
|
30.10.2008, 19:53
Сообщение
#103
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Проверил... этот код не работает...
|
|
|
30.10.2008, 22:27
Сообщение
#104
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
тогда уж наверное так:
Код local tTemp,tTemp2={},{}
for i,v in pairs(tTable) do if num=="1" then for j,q in pairs(v) do tTemp2[j]=q+(tTemp2[j] or 0) end else table.insert(tTemp,{i,v}) end end if num=="1" then for i,v in pairs(tTemp2) do table.insert(tTemp,{i,v}) end end table.sort(tTemp,function(a,b) return (a[2] > b[2]) end) ... |
|
|
8.11.2008, 16:07
Сообщение
#105
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Переименовал тему в Вопросы разработчикам скриптов. Так название лучше отражает суть темы
Спасибо сказали: |
|
|
8.11.2008, 17:09
Сообщение
#106
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Переименовал тему в Вопросы разработчикам скриптов. Так название лучше отражает суть темы +1 Есть такое дело пишу функцию бана, чтоб можно было вводить время. Я отталкивался от "сегодняшней" даты, т.е. если какманда бана на 1h то из сегодняшней даты выделяются часы к ним плюсуется единица и впихивается обратно. Плюс идёт проверка на то что если оказывается больше 24 часов то идёт плюс к дням и т.д а вот с месяцами возникли проблемы... там же не стандартное число дней(30 31 или вообще 29) Как решить эту проблему?! |
|
|
8.11.2008, 17:26
Сообщение
#107
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
привязку следует делать не к сегодняшнему дню, а к "началу эры юникс" 1.1.1970
для этого существует функция os.time(), которая выдаёт текущее время в секундах начиная с начала эры юникса. Например функция установки временного бана по ip выглядит так: Код tTempBan={} iMinutes=5 function TempBan(sIP) tTempBan[sIP]=os.time()+60*iMinutes end Функция проверки бана при входе выглядит так: Код function UserConnected(tUser) if os.time()<tTempBan[tUser.sIP] then Core.SendToUser(tUser,"*** Вы временно забанены. Вам осталось ждать "..(tTempBan[tUser.sIP]-os.time()).." сек.") Core.Disconnect(tUser) end end Если временный бан в несколько минут или даже часов, то для того, чтобы не было такого сообщения: "*** Вы временно забанены. Вам осталось ждать 16759 сек.", нужно предусмотреть перевод секунд в нормальный вид. Если надо, то могу предоставить такую функцию. |
|
|
8.11.2008, 19:27
Сообщение
#108
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Ок, спасибо, по поводу перевода из секунд в другие величины думаю разберусь))))
что то опять ступор... 60*5 - минуты 60*60*5 -часы 24*60*60*5 - дни а как будут месяцы?! я в упор этого не понимаю. Надо писать блок который будет определять какой месяц или как то проще можно сделать? |
|
|
8.11.2008, 19:35
Сообщение
#109
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
просто положи, что в месяце 30 дней и всё))))))
|
|
|
8.11.2008, 21:24
Сообщение
#110
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Код function GetNormalTime(s) s=tonumber(s) if s>=31104000 then Y = math.floor(s/31104000) M = math.floor((s-31104000*Y)/2592000) d = math.floor((s-31104000*Y-2592000*M)/86400) h = math.floor((s-31104000*Y-2592000*M-86400*d)/3600) m = math.floor((s-31104000*Y-2592000*M-86400*d-3600*h)/60) s = math.floor(s-31104000*Y-2592000*M-86400*d-3600*h-60*m) return Y.." г. "..M.." мес. "..d.." д. "..h.." ч. "..m.." мин. "..s.." сек." elseif s>=2592000 then M = math.floor(s/2592000) d = math.floor((s-2592000*M)/86400) h = math.floor((s-2592000*M-86400*d)/3600) m = math.floor((s-2592000*M-86400*d-3600*h)/60) s = math.floor(s-2592000*M-86400*d-3600*h-60*m) return M.." мес. "..d.." д. "..h.." ч. "..m.." мин. "..s.." сек." elseif s>=86400 then d = math.floor(s/86400) h = math.floor((s-86400*d)/3600) m = math.floor((s-86400*d-3600*h)/60) s = math.floor(s-86400*d-3600*h-60*m) return d.." д. "..h.." ч. "..m.." мин. "..s.." сек." elseif s>=3600 then h = math.floor(s/3600) m = math.floor((s-3600*h)/60) s = math.floor(s-3600*h-60*m) return h.." ч. "..m.." мин. "..s.." сек." elseif s>=60 then m = math.floor(s/60) s = (s-60*m) return m.." мин. "..s.." сек. " else return s.." сек." end end вот такая функция получилась. как вам? |
|
|
8.11.2008, 21:52
Сообщение
#111
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
я бы немного упростил и оптимизировал)))
Код function GetNormalTime(s) s=tonumber(s) or 0 local r="" if s>=31104000 then r=math.floor(s/31104000).." г. " s=math.fmod(s,31104000) end if s>=2592000 then r=r..math.floor(s/2592000).." мес. " s=math.fmod(s,2592000) end if s>=86400 then r=r..math.floor(s/86400).." д. " s=math.fmod(s,86400) end if s>=3600 then r=r..math.floor(s/3600).." ч. " s=math.fmod(s,3600) end if s>=60 then r=r..math.floor(s/60).." мин. " s=math.fmod(s,60) end return r..s.." сек." end или ещё более оптимизированный вариант (используя стандартные средства lua): Код function GetNormalTime(s)
s=tonumber(s) or 0 local r,t="",os.date("!*t",s) t.year,t.month,t.day=t.year-1970,t.month-1,t.day-1 if t.year~=0 then r=t.year.." г. " end if t.month~=0 then r=r..t.month.." мес. " end if t.day~=0 then r=r..t.day.." д. " end if t.hour~=0 then r=r..t.hour.." ч. " end if t.min~=0 then r=r..t.min.." мин. " end if t.sec~=0 then r=r..t.sec.." сек. " end return r end |
|
|
9.11.2008, 19:53
Сообщение
#112
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Написал я тут скриптик статистики поисковых запросов... никогда не интересовался сколько памяти жрёт скрипт, а тут вдруг промахнулся и попал в эту статистику, так оказалось хубба при 110 пользователях жрёт 5000 кб, но это не столь важно... Больше всего поразило что мой скрипт этих поисковых запросов жрёт 2000 кб. Можно ли как то это исправить? Может добавить или что то убрать из скрипта?
PS кажется это всё из за уже довольно большой базы... |
|
|
11.11.2008, 23:09
Сообщение
#113
|
|
Самый главный активист :-D Группа: Модераторы Сообщений: 2 790 Регистрация: 29.6.2008 Из: г. Тула Пользователь №: 97 Спасибо сказали: 440 раз |
Вопрос почему не работает код?
Код if (sType ~= "main") or (sType ~= "pm") or (sType ~= "full") then Core.SendToUser(tUser,"<"..sBot.."> Вы неправильно ввели тип гага! (main, pm или full)") return true end если оставить одно условие то всё пашет если нет то глухо... всегда пишет вы не правильно ввели! |
|
|
12.11.2008, 0:04
Сообщение
#114
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
По поводу памяти ничего не могу сказать, может просто слишком большая захламленность лишними переменными, но если данных много, то естественно это займет много памяти...
А про код могу вполне уверенно объяснить что он не логичен нихрена Допустим, i = 10, а условие такое: если i не равно 1 то код такой-то, тут всё работает прекрасно, но при твоём усложнении ты допустил ошибку в духе юнной гениальности: если i не равно 1 ИЛИ i не равно 2 ИЛИ i не равно 3, то... этот код выполнится при любом i: даже если i равно 1, то оно не равно 2 и 3, и так далее, это как бы взаимоисключение группой условий друг друга Используй И (and) и будет тебе счастье, так как тебе надо одновременное выполнение всех условий! Надеюсь доступно объяснил, спрашивай, если что-то непонятно. |
|
|
21.11.2008, 1:04
Сообщение
#115
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Дабы не плодить новых топиков, решил коротенький вопрос изложить ТУТ.
(Собственно сабж ждет своего часа для освоения, пока не готов морально, набираюсь знаний и опыта ) Вот какая из этих функций оптимальнее? И чем они по сути различаются? (Задача - запретить определенные сочетания символов в никах на стадии валидации) Есть допустим таблица: (Таблица может быть большой и развесистой, поэтому, думаю, вариант с проверкой ников самой Птокой тут непригоден) Код tFbdNick = { -- символы и сочетания, запрещенные в НИКАХ ")))", "(((", "-=", "=-", "!", "=", } И есть две функции. Обе вроде работают, но хотелось бы понимать разницу. Код function NickCheck(user) local tmp = string.lower(user.sName) for i = 1,table.maxn(tFbdNick) do if string.find( tmp , tFbdNick[i] , 1 , true ) then ... и Код function NickCheck(user)
for i,v in pairs(tFbdNick) do if (string.find(user.sName, v, 1, true)) then ... |
|
|
21.11.2008, 1:30
Сообщение
#116
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
именно для такой таблице оптимальнее использовать следующий код:
Код function NickCheck(user) for i,v in ipairs(tFbdNick) do if (string.find(user.sName:lower(),v,1,true)) then ... Функция lower приводит латинские буквы ника к нижнему регистру. Обрати внимание вместо pairs написано ipairs - это связано со структурой таблицы tFbdNick, так как индексы таблицы целочисленные (если индексы не указаны, то по умолчанию они целочисленны), то оптимальнее использовать функцию для целочисленных индексов ipairs. Любые конструкции ipairs или pairs работают в цикле быстрее, из-за того, что перебор индексов происходит в порядке их хранения в памяти, а не в порядке возрастания целых чисел, как в случае цикла for i = 1,#tFbdNick do По поводу порядка следования индексов в цикле можешь сам провести тест и сравнить порядки в обоих случаях Код local sMsg=""
for i,v in ipairs(tFbdNick) do sMsg=i..", " end SendToAll("Порядок индексов данных в памяти: "..sMsg) sMsg="" for i=1,#tFbdNick do sMsg=i..", " end SendToAll("Заданный, возрастающий порядок индексов: "..sMsg) |
|
|
21.11.2008, 3:23
Сообщение
#117
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Охохо... осмыслим на свежую голову.
Последний вопрос на сегодня. Допустим, хочу я сделать ряд функций, подчиненных NewUserConnected'у Код function NewUserConnected(user) Check(user) RepeatCheck(user) Fuck(user) end Например, проверка на то, проверка на это... Удобно: если функция не нужна, ее можно просто закомментировать и т. обр. отключить двумя дефисами... А вопрос такой. Сильно ли это ужасно с точки зрения производительности? |
|
|
21.11.2008, 7:32
Сообщение
#118
|
|
RusHub team lead Группа: Модераторы Сообщений: 4 030 Регистрация: 20.6.2008 Из: г. Королёв (Моск. обл.) Пользователь №: 46 Спасибо сказали: 1708 раз |
Комментарии? Они никак не влияют на производительность. Интерпретатор просто игнорирует их при чтении кода.
|
|
|
21.11.2008, 9:45
Сообщение
#119
|
|
Главный ра******й тут... Группа: Главные администраторы Сообщений: 1 727 Регистрация: 18.5.2008 Из: RF, 2la Пользователь №: 1 Спасибо сказали: 776 раз |
Скорее вопрос в передаче одного локального параметра в функцию. На сколько я понимаю (везде лишь мои предположения и наблюдения, если не прав - поправьте), при получении параметра функцией, он будет локальным, .т.е. создается еще нное количество локальных переменных. Потом, луа работает быстрее с локальными данными. Отсюда появляется 2 варианта: тот что выше и вариант с глобальной переменной конфигурации, что чуть удобнее в плане использования:
Код tCfg = {} tCfg.bCheck = true tCfg.bRepCheck = true tCfg.bFuck = true function NewUserConnected(user) if tCfg.bCheck then Check(user) end if tCfg.bRepCheck then RepeatCheck(user) end if tCfg.bFuck then Fuck(user) end end Этот вариант, конечно, чуть медленне, чем просто закомментировать функцию, но более понятней в настройке. Потом, у меня давно была такая идея: что если исходя из настройки скрипта, он сам будет писать функцию в файл и загружать ее без всех лишних вещей, создавая как бы самого себя?! Это довольно сложно, хотя еще не полное извращение, видал я и хуже... |
|
|
21.11.2008, 10:25
Сообщение
#120
|
|
Постоялец Группа: Пользователи Сообщений: 454 Регистрация: 17.10.2008 Из: Новосибирск Пользователь №: 825 Спасибо сказали: 90 раз |
Пардон, вопрос был неверно сформулирован
Вопрос заключался, конечно же, не в том, "будет ли интерпретатор пребывать в тягостных раздумьях, увидев закомментированное имя функции", и даже не в том, какой вариант удобнее для подключения/отключения функции. А вопрос заключался в следующем. Допустим, есть NewUserConnected в том виде, в котором привел ее я выше (с тремя подфункциями) и есть функция-монстр NewUserConnected, в которой все эти три уже встроены и априори последовательно исполняется. Вынося за скобки вопрос об удобстве подключения/отключения, насколько будет первый вариант тормознее второго, если вообще будет? (Имея в виду, что Цитата луа работает быстрее с локальными данными ?)И еще один вопрос. Возможно ли создать ряд типичных наборов условий (по русски напишу, и от балды, только для примера) например: "если юзер не оператор если юзер был хабтопером если юзер был хабтопером но никогда не был VIPом" , что бы каждый такой набор условий был "вещью в себе"? Если не ошибаюсь, такая конструкция называется "макрос"? тогда мы бы имели оговоренные в самом начале скрипта макрос 1 = тыдыдыдыды -- комментарии макрос2 = тыдыдыды --комментарии и возможность подключать их в нужном месте, не загромождая скрипт однотипным перечислением одних и тех же наборов условий. |
|
|
Похожие темы
|
Сейчас: 26.11.2024, 23:14 |