Comment inverser une chaîne de caractères dans le jeu de Go?
Comment pouvons-nous inverser une chaîne de caractères dans le jeu de Go?
- Comme je le comprends, les solutions données ci-dessous ne fonctionnent pas avec précomposé ou la combinaison de caractères, comme donner
a+´
au lieu deá
. Je me demande comment cela pourrait être pris en compte, sans les normaliser. - Si vous êtes confus avec un grand nombre de réponses semblables, vérifier ma référence.
Vous devez vous connecter pour publier un commentaire.
Dans Go1 rune est un builtin type.
Russ Cox, sur la golang-noix de liste de diffusion, suggère
rune:=[]rune(input)
?rune
être une part de lui-même dans cette ligne:rune = rune[0:n]
. Il semble que c'est redondant.rune
est initialisé àlen(input)
, qui est le nombre d'octets en entrée. Mais une rune peut être de 1, 2, 4 ou 8 octets en UTF-8. Donc, si toutes les runes sont de 1 octet (ASCII) les caractères UTF-8, le nombre de runes dansinput
sera égal au nombre d'octets. Mais si certains personnages sont plus les séquences d'octets, alors le nombre de runes seront de moins que le nombre d'octets.rune = rune[0:n]
garnitures de franchise 0 valeur runes à partir de la fin de la tranche, ce qui pourrait ensuite être inclus dans la boucle de retournement et le vent sur le devant de laoutput
chaîne.Cela fonctionne, sans le marinage sur les fonctions:
Cela fonctionne sur des chaînes unicode en considérant 2 choses:
Donc, ici, il va:
i:=len(o)-1
et repliez-la pour en une seule lignefor _, c:=range s { o[i--]=c; }
. L'homme que je DÉTESTE le pour sans parenthèses - est-ce possible:for(_, c:=range s) { o[i--]=c; }
De Aller exemples de projets: golang/exemple/stringutil/arrière.aller, par Andrew Gerrand
Allez aire de Jeux pour inverser une chaîne de caractères
Après l'inversion de la chaîne "bròwn", le bon résultat doit être "nwòrb", pas "nẁorb".
Remarque la tombe au-dessus de la lettre "o".
Pour la préservation de l'Unicode des caractères composés tels que "comme⃝df" avec revers résultat "fds⃝un",
veuillez vous référer à un autre code ci-dessous:
http://rosettacode.org/wiki/Reverse_a_string#Go
J'ai remarqué cette question lors de la Simon posté sa solution qui, depuis les chaînes sont immuables, est très inefficace. Les autres solutions proposées sont également défectueux; ils ne fonctionnent pas ou ils sont inefficaces.
Voici une solution efficace qui fonctionne, sauf lorsque la chaîne n'est pas valide UTF-8 ou la chaîne contient des caractères composés.
return string(runes)
ne fonctionne pas pour tous les cas.Il y a trop de réponses ici. Certains d'entre eux sont clairement des doublons. Mais même à partir de la gauche, il est difficile de choisir la meilleure solution.
Alors je suis allé à travers les réponses, jetés celui qui ne travaille pas pour unicode et également supprimé les doublons. J'ai comparé les survivants de trouver le plus rapide. Donc voici les résultats avec mention de la source (si vous remarquez que les réponses que j'ai raté, mais vaut la peine d'ajouter, n'hésitez pas à modifier l'indice de référence):
Voici donc la méthode la plus rapide par rmuller:
Pour une raison que je ne peux pas ajouter une référence, de sorte que vous pouvez copier à partir de Aire de jeux (vous ne pouvez pas exécuter des tests là-bas). Renommer et de l'exécuter
go test -bench=.
J'ai écrit la suite de
Reverse
fonction qui respecte l'encodage UTF8 et les caractères combinés:J'ai fait de mon mieux pour la rendre aussi efficace et lisible que possible. L'idée est simple, parcourir à travers les runes à la recherche pour les combinaisons de caractères, puis inverser les caractères combinés " runes en place. Une fois que nous avons couvert tous les, inverser les runes de l'ensemble de la chaîne également en place.
Dire que nous tenons à inverser cette chaîne
bròwn
. Leò
est représenté par deux runes, l'un pour leo
et un pour ce unicode\u0301a
que représente la "tombe".Pour des raisons de simplicité, nous allons représenter la chaîne comme ceci
bro'wn
. La première chose à faire est de regarder pour les caractères combinés et les inverser. Alors maintenant, nous avons la chaîne debr'own
. Enfin, nous avons inversé l'ensemble de la chaîne et à la fin avecnwo'rb
. C'est à nous retourner quenwòrb
Vous pouvez le trouver ici https://github.com/shomali11/util si vous souhaitez l'utiliser.
Ici sont quelques-uns des cas de test pour montrer un couple de différents scénarios:
Bâtiment sur Stephan202 d'origine de la suggestion, et semble fonctionner pour des chaînes unicode:
Remplaçant, à l'aide de cordes, mais pas 'unicode-safe":
C'est le plus rapide de la mise en œuvre
Ce code préserve les séquences de la combinaison de caractères intact, et
devrait fonctionner avec de l'UTF-8 non valide d'entrée trop.
Il pourrait être un peu plus efficace si les caractères unicode/norme primitives
permis itération dans les limites d'une chaîne sans
l'allocation. Voir aussi https://code.google.com/p/go/issues/detail?id=9055 .
[]byte
àstring
Aller remplace "UTF-8 non valide d'entrée" par une disposition valide et codepoint\uFFFD
.string
n'existe pas. Mais il peut exister dans un[]byte
.Si vous avez besoin pour gérer graphème clusters, l'utilisation de l'unicode ou regexp module.
str
est sortie cité il modifie le premier devis!Ici est tout à fait différent, je dirais plus que l'approche fonctionnelle, qui ne figurent pas parmi les autres réponses:
Crédits
ret
est conservé dans la fermeture pour un traitement ultérieur, par chaque reporter fonction.Vous pouvez également importer une implémentation existante:
Alors:
Ou à inverser une chaîne de caractères, y compris les combinaisons de caractères unicode:
Ces implémentations prend en charge correcte de la commande de l'unicode codés sur plusieurs octets et le peignage des caractères lorsqu'il est inversé.
Remarque: string inverser les fonctions dans de nombreux langages de programmation ne permettent pas de préserver la combinaison, et d'identifier les combinaisons de caractères nécessite beaucoup plus de temps d'exécution.
C'est assurément pas le plus efficace en terme de mémoire de la solution, mais pour une "simple" UTF-8 solution de sécurité suivantes, le travail sera fait et pour ne pas casser les runes.
C'est à mon avis le plus lisible et compréhensible sur la page.
Les deux méthodes suivantes permettent de courir plus vite que le plus rapide solution de préserver les combinaisons de caractères, si ce n'est pas à dire que je suis absent quelque chose dans ma référence en matière d'installation.
Deuxième méthode inspirée par cette
REMARQUE: Cette réponse est à partir de 2009, donc il y a probablement de meilleures solutions là-bas maintenant.
Semble un peu "rond-point", et probablement pas très efficace, mais illustre la façon dont l'interface du Lecteur peut être utilisé pour lire des chaînes de caractères. IntVectors semblent également très approprié comme tampons lorsque vous travaillez avec des chaînes de caractères utf8.
Il serait encore plus court au moment de quitter la 'taille' de la partie, et l'insertion dans le vecteur d'Insertion, mais je suppose que ce serait moins efficace, comme l'ensemble du vecteur doit alors être repoussé par un, à chaque fois une nouvelle rune est ajouté.
Cette solution fonctionne bien avec les caractères utf8.
Une version qui, je pense, travaille sur l'unicode. Il est construit sur l'utf8.Rune fonctions:
rune est un type, afin de l'utiliser. En outre, Aller à ne pas utiliser des points-virgules.
essayer de code ci-dessous:
pour plus d'informations, consultez http://golangcookbook.com/chapters/strings/reverse/
et http://www.dotnetperls.com/reverse-string-go
Pour de simples chaînes de caractères il est possible d'utiliser une telle construction:
Voici encore une autre solution:
Cependant, yazu la solution ci-dessus est plus élégant car il inverse le
[]rune
tranche en place.Encore une Autre Solution (tm) :
Test
Sortie
À l'aide de cordes.Builder est environ 3 fois plus rapide que l'utilisation de concaténation de chaîne