Quantcast

ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
12 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Jorge Eduardo
Fala aí, galera!
Estou por aqui solicitando vossa luz mais uma vez!
 
Bem, eu estou fazendo um programinha proposto pelo site Rosalind (http://rosalind.info)...
É simples, mas estou encrencado...
 
O programa recebe uma string que representa uma cadeia de DNA e imprime a sua cadeia complementar.
Ex:
 
ele recebe a  string "ATCGGCTA"
ele vai substituir os A's pelos T's
                        os C's pelos G's
                        os G's pelos C's
                        os T's pelos A's
 
Portanto, imprimindo a saída:
"TAGCCGAT"
 
Eu implementei meu código da seguinte maneira:
 
cadeia1=io.read() --entrada
cadeia2="" --saída
for letra in string.gmatch(cadeia1) do --iterando a string
if letra=="A" then cadeia2=cadeia2+"T" --substitui os A's pelos T's
elseif letra=="T" then cadeia2=cadeia2+"A" --substitui os T's pelos A's
elseif letra=="C" then cadeia2=cadeia2+"G" --substitui os C's pelos G's
elseif letra=="G" then cadeia2=cadeia2+"C" --substitui os G's pelos C's
end
end
io.write(cadeia2)
 
Está dando o seguinte erro:
 
lua: DNAComplementar.lua:3: bad argument #2 to 'gmatch' (string expected, got no value)
 
Muito obrigado a quem puder me ajudar a colocar isto pra funcionar!
 
P.S.:
Eu tentei fazer com string.gsub, mas ele dá a contagem de substituições ao final da substituição, o que fica indesejável pra mim...

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Eric Chiesse
Você não passou o segundo argumento para gmatch.

Outra coisa, vai dar erro nas concatenações de string pois vc está usando '+' e não '..'

Depois de tentar se quiser olhar como resolvi está aqui: https://gist.github.com/echiesse/b46edc9763bbd3ce4fec1bbc4f78cd9c

---
Eric

2017-05-19 21:59 GMT-03:00 Jorge Eduardo <[hidden email]>:
Fala aí, galera!
Estou por aqui solicitando vossa luz mais uma vez!
 
Bem, eu estou fazendo um programinha proposto pelo site Rosalind (http://rosalind.info)...
É simples, mas estou encrencado...
 
O programa recebe uma string que representa uma cadeia de DNA e imprime a sua cadeia complementar.
Ex:
 
ele recebe a  string "ATCGGCTA"
ele vai substituir os A's pelos T's
                        os C's pelos G's
                        os G's pelos C's
                        os T's pelos A's
 
Portanto, imprimindo a saída:
"TAGCCGAT"
 
Eu implementei meu código da seguinte maneira:
 
cadeia1=io.read() --entrada
cadeia2="" --saída
for letra in string.gmatch(cadeia1) do --iterando a string
if letra=="A" then cadeia2=cadeia2+"T" --substitui os A's pelos T's
elseif letra=="T" then cadeia2=cadeia2+"A" --substitui os T's pelos A's
elseif letra=="C" then cadeia2=cadeia2+"G" --substitui os C's pelos G's
elseif letra=="G" then cadeia2=cadeia2+"C" --substitui os G's pelos C's
end
end
io.write(cadeia2)
 
Está dando o seguinte erro:
 
lua: DNAComplementar.lua:3: bad argument #2 to 'gmatch' (string expected, got no value)
 
Muito obrigado a quem puder me ajudar a colocar isto pra funcionar!
 
P.S.:
Eu tentei fazer com string.gsub, mas ele dá a contagem de substituições ao final da substituição, o que fica indesejável pra mim...

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Jorge Eduardo
Quais são os argumentos válidos para o string.gmatch?
Ainda estou boiando um pouco com esta função...

Grato.

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

wederson cabral
Quais quer duvidas de como utilizar uma função podem ser sanadas ao se guiar pelo Manuel de referência da linguagem.

veja: https://www.lua.org/manual/5.2/pt/manual.html#pdf-string.gmatch

Em sábado, 20 de maio de 2017 08:31:47 UTC-3, Jorge Eduardo escreveu:
Quais são os argumentos válidos para o string.gmatch?
Ainda estou boiando um pouco com esta função...

Grato.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Denis Dos Santos Silva
In reply to this post by Jorge Eduardo
Jorge, dê uma olhada hein: https://gist.github.com/denisdemaisbr/92a170a6cf120c85490d1c81467d25b2

NOTA:
1. gostei a ideia do Eric (de publica no git)
2. achei esse programinha exemplo bem interessante
3. evitei usar regex (lua/lpeg), devido a ser um assunto espinhoso pra quem ta começando


Em sexta-feira, 19 de maio de 2017 21:59:04 UTC-3, Jorge Eduardo escreveu:
Fala aí, galera!
Estou por aqui solicitando vossa luz mais uma vez!
 
Bem, eu estou fazendo um programinha proposto pelo site Rosalind (<a href="http://rosalind.info" target="_blank" rel="nofollow" onmousedown="this.href=&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Frosalind.info\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHuI-vC4b4Jg6TPNAG5wViemhB3Lw&#39;;return true;" onclick="this.href=&#39;http://www.google.com/url?q\x3dhttp%3A%2F%2Frosalind.info\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHuI-vC4b4Jg6TPNAG5wViemhB3Lw&#39;;return true;">http://rosalind.info)...
É simples, mas estou encrencado...
 
O programa recebe uma string que representa uma cadeia de DNA e imprime a sua cadeia complementar.
Ex:
 
ele recebe a  string "ATCGGCTA"
ele vai substituir os A's pelos T's
                        os C's pelos G's
                        os G's pelos C's
                        os T's pelos A's
 
Portanto, imprimindo a saída:
"TAGCCGAT"
 
Eu implementei meu código da seguinte maneira:
 
cadeia1=io.read() --entrada
cadeia2="" --saída
for letra in string.gmatch(cadeia1) do --iterando a string
if letra=="A" then cadeia2=cadeia2+"T" --substitui os A's pelos T's
elseif letra=="T" then cadeia2=cadeia2+"A" --substitui os T's pelos A's
elseif letra=="C" then cadeia2=cadeia2+"G" --substitui os C's pelos G's
elseif letra=="G" then cadeia2=cadeia2+"C" --substitui os G's pelos C's
end
end
io.write(cadeia2)
 
Está dando o seguinte erro:
 
lua: DNAComplementar.lua:3: bad argument #2 to 'gmatch' (string expected, got no value)
 
Muito obrigado a quem puder me ajudar a colocar isto pra funcionar!
 
P.S.:
Eu tentei fazer com string.gsub, mas ele dá a contagem de substituições ao final da substituição, o que fica indesejável pra mim...

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Luiz Henrique de Figueiredo
In reply to this post by Eric Chiesse
> Depois de tentar se quiser olhar como resolvi está aqui:
> https://gist.github.com/echiesse/b46edc9763bbd3ce4fec1bbc4f78cd9c

Nem precisa usar concatenação pois gsub aceita uma tabela de substituições:

    function strandComplRev(s)
        local complements =
        {
            A = "T",
            T = "A",
            C = "G",
            G = "C",
        }
        return s:gsub(".", complements)
    end

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Eric Chiesse
Boa !!

---
Eric

2017-05-21 17:48 GMT-03:00 Luiz Henrique de Figueiredo <[hidden email]>:
> Depois de tentar se quiser olhar como resolvi está aqui:
> https://gist.github.com/echiesse/b46edc9763bbd3ce4fec1bbc4f78cd9c

Nem precisa usar concatenação pois gsub aceita uma tabela de substituições:

    function strandComplRev(s)
        local complements =
        {
            A = "T",
            T = "A",
            C = "G",
            G = "C",
        }
        return s:gsub(".", complements)
    end

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Deivy Petrescu
In reply to this post by Jorge Eduardo

> On May 19, 2017, at 20:59 , Jorge Eduardo <[hidden email]> wrote:
>
> Fala aí, galera!
> Estou por aqui solicitando vossa luz mais uma vez!
>
> <corte>
>
> lua: DNAComplementar.lua:3: bad argument #2 to 'gmatch' (string expected, got no value)
>
> Muito obrigado a quem puder me ajudar a colocar isto pra funcionar!
>
> P.S.:
> Eu tentei fazer com string.gsub, mas ele dá a contagem de substituições ao final da substituição, o que fica indesejável pra mim…
>

Opa Jorge,
A solução mais elegante já foi dada pelo Luiz Henrique, mas como eu to começando aprender Lua, jamais pensaria na solução dele.
Assim,  eu quis saber como *eu* resolveria o problema.
Pensei em duas maneiras, minha primeira idéia é muito semelhante à sua.
Solução 1:
——<script>
cadeia1=io.read()
cadeia2=""  
for i=1,string.len(cadeia1) do
 if string.sub(cadeia1,i,i)=="A" then cadeia2=cadeia2.."T"
 elseif string.sub(cadeia1,i,i)=="T" then cadeia2=cadeia2.."A"
 elseif string.sub(cadeia1,i,i)=="C" then cadeia2=cadeia2.."G"
 else cadeia2=cadeia2.."C"  end
end
print(cadeia2)
—— </script>

A segunda maneira foi fazendo substituições, mas usa um truque(zinho):

——<script>
cadeia1=io.read() --entrada
c2=string.gsub(cadeia1,"A","B");
c3=string.gsub(c2,"C","D");
c4=string.gsub(c3,"T","A");
c5=string.gsub(c4,"G","C");
c6=string.gsub(c5,"D","G");
cadeia2=string.gsub(c6,"B","T");
io.write(cadeia2.."\n”)
—— </script>
Neste caso as variáveis “D” e “B” funcionam como variáveis temporárias.

Mandei as soluções acima pois achei o problem interessante.
Além do mais, para resolvê-lo eu decidi procurar um IDE específico para Lua e achei o ZeroBraneStudio.
ZeroBraneStudio tem versões para Mac, Windows e Linux.
Gostei bastante do programa, ele é shareware e eu vou pagar pois achei que vale a pena.

Full disclosure: Não tenho nenhum interesse na ZeroBraneStudio nem conheço o seu criador, mas é um programa interessante e o usuário paga quanto quiser.

Abraços

Deivy Petrescu







--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Eric Chiesse
Eu estava curioso para saber sobre a performance da implementação com o operador de concatenação. Eu esperava que fosse bem lento devido a maneira como lua trata as strings internamente (imutabilidade).

Fiz um programa de teste para um benchmark.

Coloquei a minha implementação de exemplo e a que o Luiz sugeriu.

A diferença de tempo para uma string com 1.000.000 de caracteres é gigantesca. (com 200.000 já dá pra ver)

A implementação está aqui: https://gist.github.com/echiesse/d5ea3e8e160a51a09242c01e218ee83c



---
Eric

2017-05-22 16:34 GMT-03:00 Deivy Petrescu <[hidden email]>:

> On May 19, 2017, at 20:59 , Jorge Eduardo <[hidden email]> wrote:
>
> Fala aí, galera!
> Estou por aqui solicitando vossa luz mais uma vez!
>
> <corte>
>
> lua: DNAComplementar.lua:3: bad argument #2 to 'gmatch' (string expected, got no value)
>
> Muito obrigado a quem puder me ajudar a colocar isto pra funcionar!
>
> P.S.:
> Eu tentei fazer com string.gsub, mas ele dá a contagem de substituições ao final da substituição, o que fica indesejável pra mim…
>

Opa Jorge,
A solução mais elegante já foi dada pelo Luiz Henrique, mas como eu to começando aprender Lua, jamais pensaria na solução dele.
Assim,  eu quis saber como *eu* resolveria o problema.
Pensei em duas maneiras, minha primeira idéia é muito semelhante à sua.
Solução 1:
——<script>
cadeia1=io.read()
cadeia2=""
for i=1,string.len(cadeia1) do
 if string.sub(cadeia1,i,i)=="A" then cadeia2=cadeia2.."T"
 elseif string.sub(cadeia1,i,i)=="T" then cadeia2=cadeia2.."A"
 elseif string.sub(cadeia1,i,i)=="C" then cadeia2=cadeia2.."G"
 else cadeia2=cadeia2.."C"  end
end
print(cadeia2)
—— </script>

A segunda maneira foi fazendo substituições, mas usa um truque(zinho):

——<script>
cadeia1=io.read() --entrada
c2=string.gsub(cadeia1,"A","B");
c3=string.gsub(c2,"C","D");
c4=string.gsub(c3,"T","A");
c5=string.gsub(c4,"G","C");
c6=string.gsub(c5,"D","G");
cadeia2=string.gsub(c6,"B","T");
io.write(cadeia2.."\n”)
—— </script>
Neste caso as variáveis “D” e “B” funcionam como variáveis temporárias.

Mandei as soluções acima pois achei o problem interessante.
Além do mais, para resolvê-lo eu decidi procurar um IDE específico para Lua e achei o ZeroBraneStudio.
ZeroBraneStudio tem versões para Mac, Windows e Linux.
Gostei bastante do programa, ele é shareware e eu vou pagar pois achei que vale a pena.

Full disclosure: Não tenho nenhum interesse na ZeroBraneStudio nem conheço o seu criador, mas é um programa interessante e o usuário paga quanto quiser.

Abraços

Deivy Petrescu







--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.

--
Você recebeu essa mensagem porque está inscrito no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Acesse esse grupo em https://groups.google.com/group/lua-br.
Para mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Tomas Guisasola Gorham
In reply to this post by Deivy Petrescu
Oi Deivy

Se me permite umas sugestões...

> Pensei em duas maneiras, minha primeira idéia é muito semelhante à sua.
> Solução 1:
> ——<script>
> cadeia1=io.read()
> cadeia2=""
> for i=1,string.len(cadeia1) do
>  if string.sub(cadeia1,i,i)=="A" then cadeia2=cadeia2.."T"
>  elseif string.sub(cadeia1,i,i)=="T" then cadeia2=cadeia2.."A"
>  elseif string.sub(cadeia1,i,i)=="C" then cadeia2=cadeia2.."G"
>  else cadeia2=cadeia2.."C"  end
> end
> print(cadeia2)
> —— </script>
Seguindo a linha de raciocínio, você pode tentar economizar nas
operações repetidas, fazendo apenas uma vez:

...
for i = 1, string.len(cadeia1) do
   local si = string.sub(cadeia1, i, i)
   local ci
   if si == 'A' then ci = 'T'
   elseif si == 'T' then ci = 'A'
   elseif si == 'C' then ci = 'G'
   elseif si == 'G' then ci = 'C'
   else error (si) end
   cadeia2 = cadeia2..ci
end

Ainda seguindo essa ideia, você pode transformar a sequencia de
if-elseif-else-end em uma consulta a uma tabela Lua:

local mapa = {
   A = 'T',
   T = 'A',
   C = 'G',
   G = 'C',
}
for i = 1, string.len(cadeia1) do
   local si = string.sub(cadeia1, i, i)
   local ci = assert (mapa[si], si)
   cadeia2 = cadeia2..ci
end

> A segunda maneira foi fazendo substituições, mas usa um truque(zinho):
>
> ——<script>
> cadeia1=io.read() --entrada
> c2=string.gsub(cadeia1,"A","B");
> c3=string.gsub(c2,"C","D");
> c4=string.gsub(c3,"T","A");
> c5=string.gsub(c4,"G","C");
> c6=string.gsub(c5,"D","G");
> cadeia2=string.gsub(c6,"B","T");
> io.write(cadeia2.."\n”)
> —— </script>
> Neste caso as variáveis “D” e “B” funcionam como variáveis temporárias.
Se você juntar tudo em uma única substituição, como o Luiz sugeriu, não
vai precisar do truque :-)  E também não precisa criar esse monte de
variáveis (c2, c3 etc.)

Última sugestão: separe a parte de entrada & saída da parte que calcula
o resultado ;-)

Abraços,
Tomás

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Deivy Petrescu

> On May 23, 2017, at 07:18 , tomas <[hidden email]> wrote:
>
> Oi Deivy
>
> Se me permite umas sugestões…

Opa Tomas,
permito não, agradeço!
Como disse estou começando a aprender Lua.
Assim, tenho algumas perguntas

>
> Seguindo a linha de raciocínio, você pode tentar economizar nas operações repetidas, fazendo apenas uma vez:
>
> ...
> for i = 1, string.len(cadeia1) do
> local si = string.sub(cadeia1, i, i)
> local ci
> if si == 'A' then ci = 'T'
> elseif si == 'T' then ci = 'A'
> elseif si == 'C' then ci = 'G'
> elseif si == 'G' then ci = 'C'
> else error (si) end
> cadeia2 = cadeia2..ci
> end

Fiquei surpreso com o script acima, pelo que eu entendi, a declaração “local” funciona dentro do loop como se este fosse uma função.
Ou seja “si” e “ci” são “redeclarados a cada turno do loop.
É isto mesmo?
Se for, aprendi algo muito valioso.

>
> Ainda seguindo essa ideia, você pode transformar a sequencia de if-elseif-else-end em uma consulta a uma tabela Lua:
>
> local mapa = {
> A = 'T',
> T = 'A',
> C = 'G',
> G = 'C',
> }
> for i = 1, string.len(cadeia1) do
> local si = string.sub(cadeia1, i, i)
> local ci = assert (mapa[si], si)
> cadeia2 = cadeia2..ci
> end

Este segundo, esta alguns degraus acima do meu conhecimento. Ainda não estou firme o suficiente pra saber disto.
Como disse acho a solução acima extremamente elegante.

>
>> A segunda maneira foi fazendo substituições, mas usa um truque(zinho):
>> ——<script>
>> cadeia1=io.read() --entrada
>> c2=string.gsub(cadeia1,"A","B");
>> c3=string.gsub(c2,"C","D");
>> c4=string.gsub(c3,"T","A");
>> c5=string.gsub(c4,"G","C");
>> c6=string.gsub(c5,"D","G");
>> cadeia2=string.gsub(c6,"B","T");
>> io.write(cadeia2.."\n”)
>> —— </script>
>> Neste caso as variáveis “D” e “B” funcionam como variáveis temporárias.
> Se você juntar tudo em uma única substituição, como o Luiz sugeriu, não vai precisar do truque :-)  E também não precisa criar esse monte de variáveis (c2, c3 etc.)
>
> Última sugestão: separe a parte de entrada & saída da parte que calcula o resultado ;-)
>
> Abraços,
> Tomás

Muito agradecido,


Deivy Petrescu







--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: ITERAR E SUBSTITUIR CARACTERES EM UMA STRING

Tomas Guisasola Gorham
Oi Deivy

>> ...
>> for i = 1, string.len(cadeia1) do
>> local si = string.sub(cadeia1, i, i)
>> local ci
>> if si == 'A' then ci = 'T'
>> elseif si == 'T' then ci = 'A'
>> elseif si == 'C' then ci = 'G'
>> elseif si == 'G' then ci = 'C'
>> else error (si) end
>> cadeia2 = cadeia2..ci
>> end
>
> Fiquei surpreso com o script acima, pelo que eu entendi, a declaração
> “local” funciona dentro do loop como se este fosse uma função.
> Ou seja “si” e “ci” são “redeclarados a cada turno do loop.
> É isto mesmo?
> Se for, aprendi algo muito valioso.
A declaração da variável serve para o compilador saber o que fazer com
ela.  Então, na hora da execução, não existe isso de declarar variável;
simplesmente isso não se aplica.

A variável local fica na pilha de execução; é um nome que o programador
usa para se referir a uma posição da pilha.  Então, quando o trecho de
código acabar de executar, aquela parte da pilha "some" e as locais vão
junto :-)  De um ponto de vista mais conceitual, pense que é uma
variável que deve ser usada localmente, que não deverá ser acessada
(pelo menos diretamente) de outros trechos do código.

>> local mapa = {
>> A = 'T',
>> T = 'A',
>> C = 'G',
>> G = 'C',
>> }
>> for i = 1, string.len(cadeia1) do
>> local si = string.sub(cadeia1, i, i)
>> local ci = assert (mapa[si], si)
>> cadeia2 = cadeia2..ci
>> end
>
> Este segundo, esta alguns degraus acima do meu conhecimento. Ainda não
> estou firme o suficiente pra saber disto.
> Como disse acho a solução acima extremamente elegante.
O que importa é se você entendeu :-)

O que eu quis chamar a atenção é para o uso da associatividade das
tabelas Lua, afinal, são exatamente isso: tabelas associativas.  Ou
seja, elas guardam associações entre pares de valores.  A gente costuma
chamar de chave e valor, porque encontrar o valor depende da chave (ou
de uma busca completa na tabela, se você não souber a chave).  No seu
caso, a tabela serve para associar as substituições.

Abraço,
Tomás

--
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para [hidden email].
Visite este grupo em https://groups.google.com/group/lua-br.
Para obter mais opções, acesse https://groups.google.com/d/optout.
Loading...