0

我有一个生成随机字符串的方法:

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。有什么建议吗?

4

2 回答 2

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如果你在 Rails 中这样做:

s.chars.sum { |c| c.ord - 'A'.ord + 10 } # => 33
于 2011-12-27T16:24:11.533 回答
1

您将如何处理大于 10 (J) 的字母的歧义?例如,您将如何区分BKC=2113BAAC=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

此函数将通过连接每个字母值 (A=1,B=2,...) 生成正确的 int 请注意,此函数不会清理输入,因为我假设您将它与其他函数的输出一起使用。

于 2011-12-27T16:43:52.420 回答