сопоставить целочисленные значения с символами в массиве - PullRequest
0 голосов
/ 27 декабря 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Как бы вы справились с двусмысленностью букв выше 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, ...) Помните, что эта функция не очищает ввод, так как я предполагаю, что вы используете его с выводом из другой функции.

1 голос
/ 27 декабря 2011

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

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, если вы делаете это внутри Rails:

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