2011-12-27 76 views
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.有什麼建議?

+0

對不起,您怎麼解決'地圖'?你想在生成的字符串「ACB''上得到數字'132'還是需要其他? – 2011-12-27 16:19:28

+0

是的 - 基於這個例子,如果我的方法生成「BAC」字符串我想識別它爲'213' – mrmnmly 2011-12-27 16:22:58

回答

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 
+0

它的工作原理!謝謝,但是你能描述一下,你的代碼中的每一件事是什麼意思?我想了解它:) – mrmnmly 2011-12-27 16:25:26

+0

好的,給我幾分鐘 – 2011-12-27 16:27:59

+0

好的,但是等一下!它不適用於所有的字母 - 例如K是第11個字母,但它等於1:/ btw。如果你可以寫出它將從10開始計數(A = 10,B = 11,...,Z = 35),那將是非常棒的! – mrmnmly 2011-12-27 16:30:46

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不清理輸入,因爲我假設你正在使用它與其他函數的輸出。

+0

在我的情況下不需要區分:)我想在這個轉換過程中添加這些數字 - 例如ABC = 1 + 2 + 3,AABA = 1 + 1 + 2 + 1等 – mrmnmly 2011-12-27 16:58:37