Invertendo strings usando vetores

Publicado por maxshu (última atualização em 17/11/2014)

[ Hits: 5.848 ]

Homepage: programacaocomputador.blogspot.com.br

Download man2_test.sh




Hoje trago um simples inversor de strings, mas que possui alguns comandos avançados.
Um colega deste site (truster0) perguntou o seguinte:

    Fala pessoal, então não tenho muito conhecimento em shell e preciso fazer este exercicio abaixo:

    Faça um script que verifique se um nome é um palíndromo. Uma palavra é um palíndromo se a sua leitura é a mesma da esquerda para a direita e vice versa. Dica: use um array para armazenar a palavra. Exemplo: ARARA, ANA, etc.

    Me arrisquei e deu isso mas está dando erro:

    #!/bin/bash

    echo "Digite a palavra a ser testada"
    read palavra

    for ((i=o ; i<=tamanho ; i++))do
    if ((palavra=palavra[((tamanho-1)-i))]
    verifica=1

    if(verifica -eq 0)then
    echo "Igual de tras pra frente"
    else
    echo "Diferente de tras pra frente"
    fi

No tópico: http://www.vivaolinux.com.br/topico/Shell-Script/Ajuda-com-Shell-Script-7

Então, mandei uma resposta pro problema:

#!/bin/bash

read -p "Digite a palavra a ser testada: " palavra

reverse="$(echo $palavra | rev)"

if [ "$reverse" = "$palavra" ]
then {
echo "Igual de tras pra frente"
}
else {
echo "Diferente de tras pra frente"
}
fi

Este é um script simples, pois usa comandos conhecidos do shell Linux. Mas o colega, não conformado com a solução, pediu que o script fosse iterado caractere por caractere. Então, resolvi elaborar um script mais avançado.

Pessoal, este script é muito simples, mas poderoso quando queremos compara caracteres individuais.

  



Esconder código-fonte

#!/bin/bash

read -p "Digite a palavra a ser testada: " palavra

cont0=1
cont1=$(echo  $palavra | wc -m)
contchar=$(echo "$cont1-$cont0" | bc)


for(( i=1; i <= $contchar; i++ ))
  do
  c1[$i]=$(echo "$palavra" | cut -b $i)
done

h=$(echo "$contchar+$cont0" | bc)
for(( k=1; k<=$contchar; k++ ))
  do
  j=$(echo "$h-$k" | bc)
  c2[$j]=$(echo ${c1[$k]})
done

if [ "$(echo ${c2[@]})" == "$(echo ${c1[@]})" ]
then {
echo "Igual de tras pra frente"
}
else {
echo "Diferente de tras pra frente"
}
fi

Scripts recomendados

Instalador .tar.bz2 com menu gráfico Zenity

Script que envia email para um Relay sem autenticação.

Configuraçao da rede wireless no slackware

VNC Server Debian

Iniciar nova instância do Firefox quando o mesmo não está respondendo


  

Comentários
[1] Comentário enviado por elgio em 17/11/2014 - 16:43h

Não resisti...

#!/bin/bash

read -p "Digite a palavra a ser testada (sem acentos): " palavra

palavraMAI=$palavra

# Converte tudo para maiusculas
palavraMAI=${palavra^^}

# Eliminando pontuacoes e espacos em branco
palavraMAI=${palavraMAI//[^A-Z]}


echo "DEBUG: usando a string \"$palavraMAI\""

# quantas letras tem a frase/palavra?
t="${#palavraMAI}"

# Só preciso comparar até a metade das letras
meio="$(( t / 2 ))"

# Um laco até a metade das letras
for (( i=0,j=1; i<=meio;i++,j++))
do
# C1 terá um caracter a partir de $i. Forma de pegar caracter por caracter
C1=${palavraMAI:$i:1}

# C2 terá um caracter a partir de -$j no fim. Se j for 1, pegará
# o último caracter. -2, o penúltimo e assim por diante
C2=${palavraMAI: -$j:1}

# Uma impressão de depuracao
printf "%3d [%1s] [%1s]\n" $i "$C1" "$C2"

# basta que um caracter não seja igual ao seu reverso para dizer que
# não é palíndromo. Então, se um não for, encerra.
if [ "$C1" != "$C2" ]
then
echo "Não é palíndromo"
exit 0
fi
done

# Chegou até aqui sem sair no exit? Então é palíndromo
echo "Eh um palíndromo"

[2] Comentário enviado por iagolira em 12/12/2014 - 08:31h

Legal...


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts