Рубин встроенный метод, чтобы получить позицию буквы в алфавите серии? - PullRequest
0 голосов
/ 23 января 2019

Ввод: str = "stackoverflow"

Выход: [19 20 1 3 11 15 22 5 18 6 12 15 23]

Есть ли у нас какой-либо способ получить положение букв в рубине?

Так что я могу использовать что-то вроде str.chars.map { |al| al.some_method }.

str.chars = ["s", "t", "a", "c", "k", "o", "v", "e", "r", "f", "l", "o", "w"]

Ответы [ 5 ]

0 голосов
/ 24 января 2019

Лучше использовать each_char, чем chars, поскольку последний создает массив, который немедленно выбрасывается.

str.each_char.map{|al| al.ord - ?a.ord + 1}
# => [19, 20, 1, 3, 11, 15, 22, 5, 18, 6, 12, 15, 23]
0 голосов
/ 23 января 2019

Ниже вы получите желаемый результат.

str = "stackoverflow"

def conversion(str)
  arr = []
  str.upcase.gsub(/[A-Z]/){|m| arr << m.ord-64}
  return arr
end
0 голосов
/ 23 января 2019

Вы можете сделать это. Я бы использовал String#chars, который возвращает номера ASCII каждого символа в строке.

'abcdggg'.bytes
# => [97, 98, 99, 100, 103, 103, 103] 

Как видите, алфавит последовательный, каждая буква на одну букву выше предыдущей. Вы можете получить его позицию в алфавите, взяв 96 из числа.

Обратите внимание, что заглавная буква находится в другой позиции, но мы можем исправить это, используя String#downcase.

Чтобы получить все алфавитные позиции в строке (если она содержит только буквы), мы можем написать этот метод.

def alphabet_positions(string)
  string.downcase.bytes.map{|b| b - 96}
end

Это будет работать неожиданно, если какие-либо символы не являются буквами, хотя.

0 голосов
/ 23 января 2019

Вы можете создать хеш с положением буквы в алфавите и затем запросить этот хеш:

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]
0 голосов
/ 23 января 2019

Вы можете сделать это:

def position(letter)
  letter.upcase.ord - 'A'.ord + 1
end

А затем:

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] 

См. ord метод для получения дополнительной информации или этот вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...