2011-12-27 3 views
0

У меня есть метод, который генерирует случайные строки:карта целочисленных значений в массиве символов в

def generate_letters(length) 
    chars = 'ABCDEFGHJKLMNOPQRSTUVWXYZ' 
    letters = '' 
    length.times { |i| letters << chars[rand(chars.length)] } 
    letters 
    end 

Я хочу отобразить значения генерируемых строк, например, (1): А = 1, B = 2 , C = 3, например (2): , если я создаю ACB, он равен 132. Любые предложения?

+0

Извините, что вы имеете в виду: 'map'? Вы хотите получить базу чисел '132' на сгенерированной строке' 'ACB'', или вам нужно что-то еще? –

+0

yes - основываясь на этом примере, если мой метод сгенерирует строку '' BAC'', я хочу распознать ее как '213' – mrmnmly

ответ

1

Вы можете использовать это для конкатенации этих значений:

s = 'ACB' 
puts s.chars.map{ |c| c.ord - 'A'.ord + 10 }.join.to_i 
# => 101211 

и суммировать их вместо того, чтобы использовать Enumerable#inject метод (см документации, есть некоторые хорошие примеры):

s.chars.inject(0) { |r, c| r + (c.ord - 'A'.ord + 10) } # => 33 

или Enumerable#sum, если вы 're doing it in Rails:

s.chars.sum { |c| c.ord - 'A'.ord + 10 } # => 33 
+0

, она работает! спасибо, но могли бы вы описать, что означает каждая вещь в вашем коде? Я хочу это понять :) – mrmnmly

+0

ок, дайте мне несколько минут –

+0

ок, но подождите! он не работает для всех букв - например, K - 11-я буква, но она равна 1:/btw. если вы можете написать, что он начнет отсчет с 10 (A = 10, B = 11, ..., Z = 35), это будет потрясающе! – mrmnmly

1

Как вы де al с двусмысленностью для leters выше 10 (J)? Например, если вы отличете в BKC=2113 и BAAC=2113?

Игнорируя эту проблему вы можете сделать это:

def string_to_funny_number(str) 
    number='' 
    str.each_byte{|char_value| number << (1 + char_value - 'A'.ord).to_s} 
    return number.to_i 
end 

Эта функция будет генерировать правильный Int конкатенацией каждое значение письмо (A = 1, B = 2, ...) Имейте ввиду, что эта функция Безразлично 't санировать ввод, так как я предполагаю, что вы используете его с выходом из другой функции.

+0

в моем случае не требуется дифференцировать :) Я хочу добавить эти числа - например, ABC = 1 + 2 + 3, AABA = 1 + 1 + 2 + 1 и т. Д. Во время этого преобразования – mrmnmly

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