Pourquoi utilisez-vous l'inversion de chaîne? [fermé]

15

En PHP c'est strrev(), dans Rails c'est .reverse, mais la plupart des langages n'ont pas de fonction inverse de chaîne. Certains ont des fonctions inverses de tableau qui peuvent être utilisées sur des caractères. Je pensais que cela devait être un oubli majeur mais il m'est alors venu à l'esprit, à quoi utiliseriez-vous réellement la chaîne inversée pour ???

La seule fois où je peux penser que je l'ai vu, c'est dans les démos et les leçons pour tourner "Hello World!" dans "! dlroW olleH".

Ma question est; Y a-t-il une utilité pour inverser une chaîne ou est-ce complètement inutile?

.

Addenda

Il y a eu bien plus de réponses que j'attendais et toutes n'étaient pas entièrement académiques. J'aurais mis de l'argent que personne ne pourrait trouver d'exemple légitime. Je ne pensais pas non plus que j'allais apprendre quoi que ce soit de nouveau, mais la suggestion de regex de Mark Canlas est tout simplement géniale et j'ai hâte d'avoir l'opportunité de faire ses preuves. Merci à tous.

Clockworkgeek
la source
@clockworkgeek - si vous demandez à un candidat de faire une inversion de chaîne dans sa langue préférée, vous seriez surpris de voir combien ne proposent pas la fonction de base que vous avez mentionnée. Ensuite, combien ne peuvent pas créer une boucle pour l'implémenter eux-mêmes.
justkt
@justkt - C'est une toute autre question qui attend de se poser mais qui pourrait plutôt être un sujet pour TopCoder.
clockworkgeek
6
Pour envoyer un message texte qui pourrait être lu dans le rétroviseur pendant la conduite, afin que les flics ne le remarquent pas.
JeffO
@justkt - Si je devais écrire une boucle itérative pour le faire, je commencerais aux extrémités opposées à permuter les caractères jusqu'à ce que le milieu soit atteint. Mais alors comment échanger deux valeurs? Voici tout simplement la meilleure réponse que j'aie jamais donnée:a ^= b; b ^= a; a ^= b;
clockworkgeek
1
j'utilise l'inversion des cordes pour inverser les cordes;)
Muad'Dib

Réponses:

19

Sexegers

Parfois, les problèmes qui impliquent des expressions régulières peuvent être plus facilement écrits en inversant la chaîne d'entrée et en abordant le problème d'une manière différente.

Technique gracieuseté de l'homme qui m'a appris Perl.

Sexeger sur PerlMonks

Mark Canlas
la source
Je vous remercie. Une astuce très pratique pour trouver le dernier de quelque chose. Dûment noté.
clockworkgeek
Je fais ça depuis des années. Aide à l'analyse des adresses e-mail.
sal
23

Eh bien, c'est une réponse ironique.

"Back in the day" Je possédais une boîte Unix, et elle avait un fichier de dictionnaire ordonné de mots anglais, utilisé pour la vérification orthographique.

J'ai créé un nouveau fichier en inversant tous les mots du dictionnaire, en les triant, puis en les inversant à nouveau. Le résultat a été une liste de mots triés de droite à gauche.

Donc, si vous le cherchiez pour un mot, à côté de ce mot se trouveraient des mots avec des terminaisons similaires. Il était donc facile de faire de petits poèmes!

Vous pouvez vraiment vous amuser quand vous voyez ce qui rime avec quoi.

Mike Dunlavey
la source
13

Je suis codeur / développeur / administrateur système depuis environ 10 ans et je ne me souviens pas avoir jamais eu besoin d'une inversion de chaîne dans des situations réelles.

Le seul cas d'utilisation immédiat auquel je peux penser est la conversion de la base numérique: effectuée naïvement, la procédure renvoie une chaîne inversée. Cependant, avec un peu de calcul, vous pouvez calculer à l'avance la quantité d'espace nécessaire, vous pouvez donc commencer à remplir le tampon depuis la fin.

zvrba
la source
1
Il est possible que le calcul soit plus coûteux que d'inverser la chaîne, donc après l'analyse comparative sur votre plate-forme (ARM, MIPS, x86), vous pouvez utiliser une chaîne inverse. Peut être.
Zan Lynx
Vous pouvez remplir le tampon de la fin et utiliser un memmoveau début lorsque vous avez terminé. C'est probablement moins cher que de calculer log (n) / log (base) pour calculer le nombre de chiffres nécessaires.
Patrick Schlüter
12
public bool IsPalindrome(string toCheck)
{
    return toCheck == toCheck.Reverse();
}
Scott Whitlock
la source
1
Oui - nous avons en fait un entretien de sélection où les candidats écrivent un vérificateur de palindrome et la plupart le font. Cependant, je l' aime mieux quand les candidats de itérer 0à n/2et comparer le caractère à la fin opposée.
Nicole
@Renesis: Vous pouvez également: définir p début de la chaîne, q fin de la chaîne, while ( (*p == *q) && (p <= q) {p++; q--} return p > q;en C et dans d'autres langages de pointeurs.
Michael K
4
Je suppose qu'un «vérificateur de palindrome» n'est pas particulièrement utile, «écrire un vérificateur de palindrome» a au moins un but.
clockworkgeek
2
Lors d' une entrevue, on m'a demandé d'inverser une chaîne et ils ont dit « rappelez - vous , ce ne string.Rverse () Je viens donc converti la chaîne à un tableau de caractères et fait Array.Reverse.
Jack Marchetti
C'est une utilisation assez niche et pas celle que vous diriez généralement vaut la peine d'inclure dans la langue / bibliothèque!
Dan Diplo
8

Entrevues!

Inverser une chaîne (en place ou non) est une question d'entretien très courante pour les connaissances de base en programmation. Une langue dépourvue de ces fonctions intégrées serait difficile à interviewer. Le candidat devrait en fait savoir quelque chose. 1


1: Ceci est une réponse ironique.

Josh K
la source
6

J'ai vu des situations où une application de bureau parlait avec des périphériques intégrés et changeait constamment l'endianité de l'ordre des octets, et les données étaient déplacées sous forme de chaînes. C'est à peu près tout pour moi.

Je n'aurais pas utilisé de chaînes pour cette application mais c'est comme ça .....

comment s'appelle-t-il
la source
+1 pour cette réponse. C'est au moins un exemple pratique bien que moi aussi je l'aurais fait autrement, peut-être en choisissant des types primitifs qui sont différemment enddian.
clockworkgeek
5
<span style="unicode-bidi: bidi-override; direction:rtl;">
    <?php echo strrev($emailaddress); ?>
</span>

Ce n'est pas la meilleure solution pour masquer une adresse e-mail, car lorsque vous l'ajoutez au presse-papiers, elle est toujours inversée. Et, s'il devenait populaire, il serait bientôt détecté par des robots de grattage d'e-mails.

Pourtant, cela a été suggéré .

Nicole
la source
1
Et l'obscurcissement le plus populaire utilisé n'a reçu qu'une seule phrase dans tout cet article ... Encodage en tant qu'image.
clockworkgeek
1
@clockworkgeek, il peut être populaire, mais à mon humble avis, c'est la pire des solutions efficaces - pas très facile à générer, pas incorporé dans HTML (vitesse, stockage d'images, charge du serveur), semble hors de propos, ne peut pas être stylisé avec CSS, et même mauvaise expérience utilisateur que l'inversion de chaîne, d'avoir à s'en souvenir et à la retaper. Et probablement plus de problèmes auxquels je ne pense pas.
Nicole
Curieusement, l'utilisation de AT et DOT, les plus faciles à décoder pour une récolteuse, s'avère avoir une efficacité presque parfaite pour empêcher la récolte. Parfois, rester simple n'est pas une si mauvaise idée.
Joeri Sebrechts
5

ASCII n'est pas le meilleur encodage pour l'information génétique (vous pouvez emballer les types de base ACGT en 2 bits). Emballez-les dans un éventail de longs et vous obtenez 32 "lettre" génétique par mot. L'ADN peut se retourner, vous devez donc vérifier qu'un morceau d'ADN contre les deux vers l'avant sont des copies inversées d'une séquence de test. Ainsi, être capable d'inverser une chaîne de quantités de 2 bits peut être très utile pour divers types d'analyses génétiques.

J'avais comme élément sur une référence pour les agences d'espionnage, à quelle vitesse pouvez-vous inverser les bits sur une longue période (en fait, un très long tableau de longs-longs). La méthode évidente d'échange de 2 bits à la fois est beaucoup plus lente que les méthodes moins évidentes. Ceux-ci sont liés à certains des algorithmes soignés pour la transposition de tableaux en place.

Tangurena: L'opération à laquelle vous faites référence s'appelle un dénombrement de la population. Des souhaits similaires pour les données compressées sont en tête et en fin de compte zéro. Il y a beaucoup de choses vraiment intéressantes que l'on peut faire avec des données compactées. Une seule opération sur une longue période consiste en une connexion parallèle à 64 voies, donc si vous savez ce que vous faites, vous pouvez obtenir des performances incroyables pour certains types de calculs.

Omega Centauri
la source
Sujet intéressant, comment inverseriez-vous un champ de bits?
clockworkgeek
"Comment inverseriez-vous un champ de bits?"
Omega Centauri
2
Une approche consiste à rechercher une table. Vous pouvez inverser un octet en utilisant une table. Vous pouvez donc le faire sur les octets individuels. Il y a aussi des façons de déplacer plusieurs bits et une fois ... Un peu d'astuce, et des compromis (taille de la table par rapport au nombre d'opérations, etc.) et vous pouvez essayer de le régler.
Omega Centauri
5

Il est plus facile de travailler avec la chaîne inversée.

Travailler avec des entiers en tant que chaînes est beaucoup plus facile si les chaînes sont inversées. J'ai construit quelques fonctions de bibliothèque pour faire des mathématiques avec de grands entiers et utilisé l'inversion de chaîne pour rendre les fonctions arithmétiques plus simples.

Certes, je ne l'ai utilisé que pour lancer des réponses sur Project Euler, mais la prémisse d'origine tient toujours.

Hache
la source
+1. lors de l'utilisation de représentations de chaînes de nombres, la représentation inversée est très utile. et généralement la bibliothèque standard représentera les nombres dans l'ordre normal.
back2dos
3

Peut-être un support multilingue à faible coût, pour les langues qui utilisent des lettres de droite à gauche (comme l'arabe), au lieu de gauche à droite. Bien sûr, vous devez faire attention aux caractères d'accent modifiant le bon caractère ...

cyclope
la source
2

Je ne sais pas peut-être que quelqu'un a un besoin brûlant de vérifier le palindrome ...

Je ne pense pas que ce soit complètement inutile, car il peut bien y avoir des situations où l'on doit pouvoir inverser une chaîne.

Nuit noire
la source
La question de suivi serait, quand avez-vous déjà eu besoin de vérifier un palindrome dans le monde réel? Encore une fois, je n'ai vu personne se soucier des cours d'algorithme.
clockworkgeek
comme celui-ci par exemple: jimsabo.com/palindrome.html
Darknight
Je pense qu'il y a probablement d'autres utilisations, mais c'est spécifique au domaine. Par exemple, si les recherches de chaînes ont été optimisées pour la recherche directe et que vous souhaitez effectuer plusieurs recherches pour la dernière occurrence, vous pouvez d'abord l'inverser. Ce serait une optimisation cependant, et ne devrait pas être fait à moins qu'il y ait un cas prouvable pour cela. Je pourrais imaginer un algorithme pour générer un hachage d'une valeur de chaîne qui voulait utiliser l'extrémité arrière, éventuellement inversée, s'il s'avérait fournir de meilleures caractéristiques de hachage.
Scott Whitlock
2

Dans le traitement et l'analyse du langage naturel, il est parfois plus facile de rechercher une chaîne de la fin au début. Une chaîne inverse serait utile pour le débogage, ou comme une autre façon d'écrire la boucle (inverser la chaîne puis boucle de l'index 0 à n-1).

De plus, certaines langues sont écrites de droite à gauche, donc un inverseur de chaîne pourrait être utilisé pour cela si vous étiez dans un environnement qui ne reconnaissait pas nativement les langues LTR / RTL.

Une chaîne (dans certaines langues) est un tableau de caractères, mais cela pourrait tout aussi bien être des chèques de paie ou des modifications d'inventaire. Dans une boucle traversant ces derniers, vous pourriez faire des calculs qui devraient être les mêmes quel que soit l'ordre dans lequel vous les traitez. Un test unitaire parfaitement cromulent consisterait à vérifier si les calculs s'appliquent de la même manière en avant ou en arrière. Cela peut être trivialement évident pour l'ajout, peut-être pas pour d'autres opérations plus opaques.

MatthewMartin
la source
1

Pour les compilateurs?

C'est amusant, mais la plupart des symboles dans une langue commencent par un motif commun. Je ne parle pas de la notation hongroise ici, mais si vous pensez aux espaces de noms / classes, alors beaucoup de symboles partageront en fait un préfixe commun .

myproject::SomeClass::GetFoo
myproject::SomeClass::GetBar

Le problème est que lorsque vous effectuez une recherche binaire, les préfixes communs sont la pire chose avec laquelle vous pouvez vous retrouver, car vous finirez par comparer ces préfixes encore et encore.

En revanche, si vous regardez les cordes à l'envers, vous verrez beaucoup plus d'entropie! Et soudain, une recherche binaire (sur un Trie) devient beaucoup plus puissante!

C'est toujours un bug que les noms C ++ modifiés (par gcc) n'aient pas été inversés pour mettre l'espace de noms EN DERNIER :)

Matthieu M.
la source
0

Je retourne de temps en temps des numéros de téléphone et certaines chaînes de recherche

Don
la source
0

La seule fois où je me souviens avoir vu l'inversion de chaîne utilisée était une fonction que j'ai vue en arrière qui l'a utilisée lors de l'analyse des noms de fichiers, pour s'assurer que le '.' il a trouvé dans le nom de fichier était en fait le dernier point qui séparait le nom de fichier de l'extension. c'est-à-dire, en analysant un nom de fichier comme data.2010.12.08.dat, vous inverseriez la chaîne, trouver le premier point, soustraire cette position de la fin de la chaîne d'origine et prendre la sous-chaîne. Je ne dis pas que c'est la façon optimale de le faire, mais c'est ce qu'il a fait. Il se peut que ce soit dans powerbuilder, où de telles utilisations bizarres des fonctions étaient courantes pour contourner divers problèmes non évidents.

GrandmasterB
la source
0

La seule vraie appli mondiale que j'ai vue utiliser le strrev était de stocker les mots de passe des utilisateurs `` illisibles '' dans la base de données ...

Mais je me souviens qu'il y a un modèle en C pour utiliser le strrev, peut-être que j'y reviendrai plus tard.


la source