2014-02-09 6 views
3

Я пытаюсь назначить целое число для нескольких символов в строке.Назначить целое число нескольким символам в строке

def userinput(input) 
    @user = input.upcase.delete('^A-Z').chars.each_slice(5).map(&:join) 
end 

=> userinput("This is test to convert multiple characters in a string") 
=> ["THISI","STEST","TOCON", "VERTM", "ULTIP", "LECHA", "RACTE", "RSINA", "STRIN", "G"] 

После того, как этот массив я хочу присвоить целое число для каждого символа в строке, так что я пытался что-то вроде этого ...

=> @user.map {|ch| ch.ord - 'A'.ord + 1} 

К сожалению, я только получить соответствующее число алфавита для первой буквы.

=> [20, 19, 20, 22, 21, 12, 18, 18, 19, 7] 

Я был бы весьма признателен, если кто-то может дать мне подсказку о том, как назначить другие 4 оставшиеся буквы каждой строки, а так, что выход будет что-то вроде:

=> ["ABCDE", "ABCDE"] 
=> [12345, 12345] 
+0

почему этот 'ch.ord - 'A'.ord + 1' расчет? Почему 'ABCDE' составляет 12345? Исходя из того, какую логику вы выполняете для символьного целочисленного отображения? –

+0

sry, что это может быть немного вне контекста. Идея заключалась в том, чтобы присвоить соответствующее число в алфавите букве. Вот почему ABCDE составляет 12345. – Robertinho

+0

'12345' можно перевести как' ABCDE', 'LCDE',' AWDE'. Какой из них прав? Ответ на этот вопрос: мы не знаем. У вашей кодировки есть недостаток: это не [префикс-бесплатно] (http://en.wikipedia.org/wiki/Prefix_code). –

ответ

1

Преобразовать каждый строки в вашем новом массиве на массив символов затем преобразовать каждый из символа обратно в их позиции в алфавите, как вы делаете то CONCAT их в строку

@user = ["THISI","STEST","TOCON", "VERTM", "ULTIP", "LECHA", "RACTE", "RSINA", "STRIN", "G"] 
@user.map(&:chars).map do |arr| 
    arr.inject("") do |str,ch| 
    str << (ch.ord - 'A'.ord + 1).to_s 
    end 
end 
=> ["2089199", "192051920", "201531514", "225182013", "211220916", "125381", "1813205", "18199141", "192018914", "7"] 
+0

большое спасибо - это потрясающе, и он отлично работает. Гонне внимательно изучает это, чтобы понять это. Best, Rob – Robertinho

+0

@ user3215611, пожалуйста, согласитесь с моим ответом и повышением, если он сработает для вас – bjhaid

+0

сайт не позволяет мне, так как у меня нет «репутации 15» – Robertinho

0

Здесь трюк делать более Rubyish образом:

@user = ["THISI","STEST","TOCON"] 
@user.map { |s| s.gsub(/[a-z]/i) { |m| m.ord - 'A'.ord + 1 } } 
# => ["2089199", "192051920", "201531514"] 

Сначала нужно посмотреть в магию #gsub от gsub(pattern) {|match| block } → new_str.

В виде блока, текущая строка матча передается в качестве параметра, а переменные, такие, как $1, $2, & , and $ $, $ '' будет установлена ​​соответствующим образом. Значение, возвращаемое блоком, будет заменено на совпадение для каждого вызова.

+0

также довольно круто - thx много для и я определенно беру ваш совет, изучая магию #gsub. – Robertinho

Смежные вопросы