84 votes

inverser l'ordre des caractères dans une chaîne de caractères

Chaîne d'entrée "12345", chaîne de sortie "54321". De préférence sans outils tiers et sans regex.

6voto

Dennis Williamson Points 105818

Cela inverse la chaîne "en place" :

a=12345
len=${#a}
for ((i=1;i<len;i++)); do a=$a${a: -i*2:1}; done; a=${a:len-1}
echo $a

ou la troisième ligne pourrait être :

for ((i=0;i<len;i++)); do a=${a:i*2:1}$a; done; a=${a:0:len}

ou

for ((i=1;i<len;i++)); do a=${a:0:len-i-1}${a: -i:i+1}${a:len-i-1:1}; done

6voto

Michael Back Points 26

Pour les personnes sans réviser (recommandé), il y a le simple suivant awk qui divise les champs sur la chaîne nulle (chaque caractère est un champ séparé) et imprime en sens inverse :

awk -F '' '{ for(i=NF; i; i--) printf("%c", $i); print "" }'

Ce qui précède awk est conforme à la norme POSIX. En tant que code conforme awk est garantie sur tous les systèmes d'exploitation compatibles POSIX, la solution ne doit donc pas être considérée comme "tierce partie". Ce code sera probablement plus concis et plus compréhensible qu'un code POSIX pur. sh (ou bash ).

( ; Je ne sais pas si vous considérez la chaîne nulle pour -F une regex... ;)

6voto

David Heffernan Points 61

Quelques méthodes simples pour inverser une chaîne de caractères

echo '!!!esreveR si sihT' | grep -o . | tac | tr -d '\n' ; echo

echo '!!!esreveR si sihT' | fold -w 1 | tac | tr -d '\n' ; echo

Convertir en valeurs hexagonales puis inverser

echo '!!!esreveR si sihT' | xxd -p | grep -o .. | tac | xxd -r -p ; echo

echo '!!!esreveR si sihT' | xxd -p | fold -w 2 | tac | xxd -r -p ; echo

4voto

Isaac Points 5631

Si var=12345 :

bash for((i=0;i<${#var};i++)); do rev="$rev${var:~i:1}"; done

sh c=$var; while [ "$c" ]; do rev=$rev${c#"${c%?}"}; c=${c%?}; done

echo "var: $var, rev: $rev"

Exécutez-le :

$ rev
var: 12345, rev: 54321

3voto

Nono Points 31

On peut bien sûr raccourcir ce texte, mais il doit être simple à comprendre : le final print ajoute la nouvelle ligne.

echo 12345 | awk '{for (i = length($0); i > 0; i--) {printf("%s", substr($0, i, 1));} print "";}'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X