Entrée: str = "stackoverflow"
Sortie: [19 20 1 3 11 15 22 5 18 6 12 15 23]
Avons-nous une méthode pour obtenir la position des lettres en rubis?
Pour que je puisse utiliser quelque chose comme str.chars.map {| al | al.some_method} .
str.chars = ["s", "t", "a", "c", "k", "o", "v", "e", "r", "f" , "l", "o", "w"]
5 Réponses :
Vous pouvez le faire:
chars = ["s", "t", "a", "c", "k", "o", "v", "e", "r", "f", "l", "o", "w"] chars.map do |char| position(char) end => [19, 20, 1, 3, 11, 15, 22, 5, 18, 6, 12, 15, 23]
Et ensuite:
def position(letter) letter.upcase.ord - 'A'.ord + 1 end
Vous pouvez le faire. J'utiliserais String # chars qui renvoie les nombres ASCII de chaque caractère de la chaîne.
def alphabet_positions(string)
string.downcase.bytes.map{|b| b - 96}
end
Comme vous pouvez le voir, l'alphabet est séquentiel, chaque lettre est un plus haut que le précédent. Vous pouvez obtenir sa position dans l'alphabet en prenant 96 du nombre.
Notez que la lettre majuscule est dans une position différente, mais nous pouvons résoudre ce problème en utilisant String # downcase code >.
Pour obtenir toutes les positions alphabétiques dans une chaîne (si elle ne contient que des lettres), nous pouvons écrire cette méthode.
'abcdggg'.bytes # => [97, 98, 99, 100, 103, 103, 103]
Cela fonctionnera de manière inattendue si des caractères ne sont pas des lettres, alors.
C'est ce que OP a demandé (en ignorant chaque cas de bord)
Mon prénom n'est pas d'accord avec cette solution.
@ JörgWMittag Certes, c'est une solution limitée.
Vous pouvez créer un hachage avec la position d'une lettre dans un alphabet, puis interroger ce hachage:
indexes = ('a'..'z').each_with_index.map{|l,i| [l, i+1]}.to_h
"stackoverflow".chars.map{|l| indexes[l]}
# => [19, 20, 1, 3, 11, 15, 22, 5, 18, 6, 12, 15, 23]
J'aime que cela gère les cas extrêmes en renvoyant un nil prévisible.
Alternativement: indexes = ('a' .. 'z'). Each.with_index (1) .to_h et 'stackoverflow'.each_char.map (& indexes)
Vous trouverez ci-dessous le résultat souhaité.
str = "stackoverflow"
def conversion(str)
arr = []
str.upcase.gsub(/[A-Z]/){|m| arr << m.ord-64}
return arr
end
Il est préférable d'utiliser each_char que chars car ce dernier crée un tableau qui est immédiatement jeté.
str.each_char.map{|al| al.ord - ?a.ord + 1}
# => [19, 20, 1, 3, 11, 15, 22, 5, 18, 6, 12, 15, 23]
Avez-vous essayé quelque chose?
Oui. Je l'ai essayé avec les méthodes indexOf et les jointures, mais cela me renvoie la position à l'intérieur du tableau. En fait, c'est ce que fait indexOf. J'ai cherché sur Google la liste des méthodes pour obtenir la position de l'alphabet mais je n'en ai trouvé aucune.
J'ai une ficelle
Copie possible de Rechercher le score alphabétique d'une lettre
@Xero Je cherchais une méthode intégrée en ruby.
@ vikas95prasad vous pouvez utiliser monkey patching pour ce faire. quand vous pouviez l'appeler de manière inbluide justinweiss.com/articles/...
@ vikas95prasad "Je l'ai essayé avec indexOf" - ce n'est plus Ruby ;-)
@ vikas95prasad S'il y avait une méthode intégrée, cela aurait été la première réponse. Bref, il n'y en a pas. Ruby fait beaucoup de choses utiles pour vous, mais ce n'est pas l'une d'entre elles. Voici ce que vous pouvez faire avec de la ficelle en rubis. ruby-doc.org/core-2.2.0/String.html