caotic 393 Postado Fevereiro 5, 2013 Share Postado Fevereiro 5, 2013 Ola galera venho trazer a função string.explode ela ja existe mais resolvi fazer com os encantos do pog. A função separa uma string por um carácter e depois ele e insertado numa table podendo assim manipular cada parte. function string.explode(str, char) k = 1 x = {} i = 1 str = ""..str..""..char.."" while #str > k do local t = string.sub(str, k, k) if t == char then table.insert(x, string.sub(str, i, k-1)) k = k+1 i = k end k = k+1 end return x end str = "Ola,Oi,Sua,Vida,Taste, oi" for i=1, #string.explode(str, ",") do print(string.explode(str, ",")[i]) end Link para o comentário Compartilhar em outros sites More sharing options...
Skyen 64 Postado Fevereiro 6, 2013 Share Postado Fevereiro 6, 2013 (editado) encantos do pog Nope. str = ""..str..""..char.."" str = str .. char E isso não é gambiarra. Em linguagens de baixo/médio nível (C, C++, et cetera) o algoritmo é praticamente igual o seu. Essa solução também é mais eficiente do que a usada no open tibia. Você poderia deixar ela um pouco mais rápida gravando o caractere em uma string temporária e depois inserir essa string na tabela quando o separador ou o fim da string original fosse encontrado. Editado Fevereiro 6, 2013 por Skyen Link para o comentário Compartilhar em outros sites More sharing options...
MaXwEllDeN 89 Postado Fevereiro 6, 2013 Share Postado Fevereiro 6, 2013 encantos do pog Nope. str = ""..str..""..char.."" str = str .. char Não entendo por que insiste em pogar '-'. Eu até fazia funções como essa ai quando eu tava começando a aprender Lua, só pra praticar string.sub, minha lógica e coisas como tipo. Mas não vejo por que tornar do POG um estilo de vida. Link para o comentário Compartilhar em outros sites More sharing options...
20cm 70 Postado Fevereiro 10, 2013 Share Postado Fevereiro 10, 2013 str = ""..str..""..char.."" MANO, SÓ DIGO UMA COISA PRA VC: string.rep("HUE",math.huge) e eu acho q devia parar de tentar pogar, querendo ou nao isso ainda deixa o script 1 bosta e desnecessariamente complicado flw Link para o comentário Compartilhar em outros sites More sharing options...
caotic 393 Postado Fevereiro 10, 2013 Autor Share Postado Fevereiro 10, 2013 str = ""..str..""..char.."" MANO, SÓ DIGO UMA COISA PRA VC: string.rep("HUE",math.huge) e eu acho q devia parar de tentar pogar, querendo ou nao isso ainda deixa o script 1 bosta e desnecessariamente complicado flw Po cara e meu jeito de programar e isto ai. Ninguém muda isto não. Mais .... Link para o comentário Compartilhar em outros sites More sharing options...
20cm 70 Postado Fevereiro 10, 2013 Share Postado Fevereiro 10, 2013 (editado) Admito que nao consegui diminuir muito nao, mas fiz algumas versões: function explode(str,div) local x = {} local m = string.explode(str,div) for d = 1,#m do table.insert(x,m[d]) end return x end function explode(str,div) return string.explode(str,div) end essa aqui é a mais gambiarrada ela adiciona todos os caracteres num array e dps checa se o array é o char ai reseta a var mama e assim vai function explode(str, char) local tals = {} local words = {} for x = 1,string.len(str) do table.insert(tals,string.sub(str,x,x)) end local mama = "" local bool = false for x = 1,#tals do if tals[x] ~= char then mama = mama .. tals[x] bool = true else table.insert(words,mama) mama = "" bool = false end end if bool then table.insert(words,mama) end return words end E a unica q fiz seriozinho: function explode(str, char) local found = {} local bool = false while(string.find(str,char) ~= nil) do table.insert(found,string.sub(str,0,string.find(str,char)-1)) str = string.sub(str,string.find(str,char)+1,string.len(str)) bool = true end if bool and str ~= "" then table.insert(found,str) end return found end nossa cara to vendo q string.sub é vida alias, sirvo pra pogger? kkk Editado Fevereiro 10, 2013 por 20cm Link para o comentário Compartilhar em outros sites More sharing options...
caotic 393 Postado Fevereiro 10, 2013 Autor Share Postado Fevereiro 10, 2013 Admito que nao consegui diminuir muito nao, mas fiz algumas versões: function explode(str,div) local x = {} local m = string.explode(str,div) for d = 1,#m do table.insert(x,m[d]) end return x end function explode(str,div) return string.explode(str,div) end essa aqui é a mais gambiarrada ela adiciona todos os caracteres num array e dps checa se o array é o char ai reseta a var mama e assim vai function explode(str, char) local tals = {} local words = {} for x = 1,string.len(str) do table.insert(tals,string.sub(str,x,x)) end local mama = "" local bool = false for x = 1,#tals do if tals[x] ~= char then mama = mama .. tals[x] bool = true else table.insert(words,mama) mama = "" bool = false end end if bool then table.insert(words,mama) end return words end E a unica q fiz seriozinho: function explode(str, char) local found = {} local bool = false while(string.find(str,char) ~= nil) do table.insert(found,string.sub(str,0,string.find(str,char)-1)) str = string.sub(str,string.find(str,char)+1,string.len(str)) bool = true end if bool then table.insert(found,str) end return found end nossa cara to vendo q string.sub é vida alias, sirvo pra pogger? kkk Esta terceira fiko epica. Insertar todas as caracteres para depois comparar todas. Gostei ehauehauehaueh' Link para o comentário Compartilhar em outros sites More sharing options...
dalvorsn 268 Postado Fevereiro 11, 2013 Share Postado Fevereiro 11, 2013 (editado) Minha versão com inclusão de retirada de espaços do inicio e depois dos separadores. string.explode = function (str, sep) local ret = {} local str = str:gsub("^%s+", ""):gsub(sep.."%s+", sep) for result in string.gmatch(str, "(.-)".. sep) do str = str:gsub(result .. sep, "") table.insert(ret, result) end table.insert(ret, str) return ret end Em tempo de execução a minha e a sua estão praticamente iguais, já quanto ao gasto de memória a minha apresenta uma pequena diferença mas é devido a retirada dos espaços, ela está gastando mais memória que a sua. str = ""..str..""..char.."" não faça isso em publico vei kk anyway, boa função xD Editado Fevereiro 11, 2013 por dalvorsn Link para o comentário Compartilhar em outros sites More sharing options...
caotic 393 Postado Fevereiro 11, 2013 Autor Share Postado Fevereiro 11, 2013 (editado) Minha versão com inclusão de retirada de espaços do inicio e depois dos separadores. string.explode = function (str, sep) local ret = {} local str = str:gsub("^%s+", ""):gsub(sep.."%s+", sep) for result in string.gmatch(str, "(.-)".. sep) do str = str:gsub(result .. sep, "") table.insert(ret, result) end table.insert(ret, str) return ret end Em tempo de execução a minha e a sua estão praticamente iguais, já quanto ao gasto de memória a minha apresenta uma pequena diferença mas é devido a retirada dos espaços, ela está gastando mais memória que a sua. str = ""..str..""..char.."" não faça isso em publico vei kk anyway, boa função xD Usar gmatch e gusb e uma boa. Além de que fico mais bonito sua função. Entendi o sentindo e a execução da função parabéns. O interessante que o procedimento e um pouco mais complicado porque você procura o separador e depois vai reformulando a string. Fica mais bonito usar: ""..str..""..char.."" Editado Fevereiro 11, 2013 por caotic Link para o comentário Compartilhar em outros sites More sharing options...
dalvorsn 268 Postado Fevereiro 11, 2013 Share Postado Fevereiro 11, 2013 (editado) Usar gmatch e gusb e uma boa. Além de que fico mais bonito sua função. Entendi o sentindo e a execução da função parabéns. O interessante que o procedimento e um pouco mais complicado porque você procura o separador e depois vai reformulando a string. Fica mais bonito usar: ""..str..""..char.."" Eu fui reduzindo a string, pode ser que tenha sido um dos motivos do gasto a mais de memoria, farei depois com gfind e usando apenas a posição, e verei como fica o gasto de memoria, porque provavelmente sub gasta menos memoria que gsub e como o loop executa varias vezes dependendo da string, uma diferença pequena dentro dele pode se tornar uma grande diferença xD -- #edit com gfind fico bem mais rápida, segue o código: string.explode = function (str, sep) local ret = {} local str = str:gsub("^%s+", ""):gsub(sep.."%s+", sep):gsub("%s+$","") local last = str:match(sep.."(.-)$") collectgarbage() for result in string.gfind(str, "(.-)".. sep) do table.insert(ret, result) end table.insert(ret, last) return ret end Editado Fevereiro 12, 2013 por dalvorsn Link para o comentário Compartilhar em outros sites More sharing options...
meubk 257 Postado Fevereiro 18, 2013 Share Postado Fevereiro 18, 2013 (editado) minha versão : string.explode = function (string, char) local tab, pos = {}, 1 for str in string:gmatch(".") do pos = str == char and pos + 1 tab[pos] = tab[pos] or "" tab[pos] = str == char or tab[pos] .. str end return tab end Editado Fevereiro 18, 2013 por xotservx Link para o comentário Compartilhar em outros sites More sharing options...
Vinc 101 Postado Fevereiro 18, 2013 Share Postado Fevereiro 18, 2013 todo mundo fasendo verção de string.explode,vo fase uma tbm fis rapidão,então nem me procupei com nome pra variveis a função function s(a,b) local tab = {} for x in a:gmatch("[^"..b.."]+") do table.insert(tab,x) end return tab end @dalvorsn só esqueceu de que tem a possibilidade de alguem usar "." como sep(tem sempre alguem a tentar fazer coisas do tipo) onde(que programa) vcs testan o desempenho do script? Link para o comentário Compartilhar em outros sites More sharing options...
caotic 393 Postado Fevereiro 18, 2013 Autor Share Postado Fevereiro 18, 2013 todo mundo fasendo verção de string.explode,vo fase uma tbm fis rapidão,então nem me procupei com nome pra variveis a função function s(a,b) local tab = {} for x in a:gmatch("[^"..b.."]+") do table.insert(tab,x) end return tab end @dalvorsn só esqueceu de que tem a possibilidade de alguem usar "." como sep(tem sempre alguem a tentar fazer coisas do tipo) onde(que programa) vcs testan o desempenho do script? Todo mundo ta fazendo usando gmatch. Em questão de praticidade ele e o melhor mesmo. Link para o comentário Compartilhar em outros sites More sharing options...
dalvorsn 268 Postado Fevereiro 19, 2013 Share Postado Fevereiro 19, 2013 todo mundo fasendo verção de string.explode,vo fase uma tbm fis rapidão,então nem me procupei com nome pra variveis a função function s(a,b) local tab = {} for x in a:gmatch("[^"..b.."]+") do table.insert(tab,x) end return tab end @dalvorsn só esqueceu de que tem a possibilidade de alguem usar "." como sep(tem sempre alguem a tentar fazer coisas do tipo) onde(que programa) vcs testan o desempenho do script? print no fim do script isso: print(string.format("Memory: %f, Clock: %f", collectgarbage("count"), os.clock())) Realmente passou despercebido que pode entrar no separador caracteres mágicos, muito bem lembrado ;D Link para o comentário Compartilhar em outros sites More sharing options...
Vinc 101 Postado Fevereiro 19, 2013 Share Postado Fevereiro 19, 2013 @dalvorsn gfind n é gmatch?(procurei no no site,diz que numa atulização gfind passou a ser gmatch) ou tem alguma diferença nunca tinha visto achei que era alguma função nova das libs de ot. Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados