2014-01-29 29 views
0

位卡在這裏。將字符串轉換爲數組,然後用模26的數字表示每個字母

我只是找不到辦法來解決這個問題。

欲字符串轉換成字母的陣列其爲具有足夠快的簡單:

"X marks the spot".chars #=> ["X", " ", "m", "a", "r", "k", "s", " ", "t", "h", "e", " ", "s", "p", "o", "t"] 

然後,我想通過多個模來代表陣列中的每個字母26.(例如A = 0,B = 1,...,Z = 25,空間= 26)。

會喜歡一些幫助!

+2

向我們展示了什麼你試圖解決這個問題。 –

+1

請編輯以說明映射是否區分大小寫,如果是(我懷疑),如何映射小寫字母。無需回覆 - 我將刪除此評論。 –

+0

26模26不是26而是0 –

回答

2

像這個?:

"X marks the spot".upcase.chars.map {|c|c.ord < 65 && 26 || c.ord - 65 } 
# => [23, 26, 12, 0, 17, 10, 18, 26, 19, 7, 4, 26, 18, 15, 14, 19] 

注:請在未來展現給社區解決方案第一。

0

這裏的另一種方式

"X marks the spot".each_byte do |byte| 
    puts byte %26 
end 

當然,你婉存儲在一個數組,而不是打印出來;)

+1

'「X標記點」.each_byte.inject([])do | acc,byte |; acc << byte%26;end' –

+1

@Darek,我認爲需要''X標記位置「.upcase.each_byte.inject([]){| acc,byte | acc <<(byte == 32?26:(byte - 65)%26)}'。 –

+0

@ cary-swoveland假設OP想要'upcase'd,你是對的。 –

2

做如下:

hsh = Hash[('a'..'z').zip (0..25).to_a].merge({" " => 26}) 
s = "X marks the spot" 
s.downcase.chars.map { |i| hsh[i] } 
# => [23, 26, 12, 0, 17, 10, 18, 26, 19, 7, 4, 26, 18, 15, 14, 19] 
+0

下面是你計算'hsh'的兩個變種,儘管我更喜歡你所擁有的:'hsh = Hash [(Array('a'..'z')<<'').zip(0..26) (['''''',{''=> 26}]){| i,(f,h)| .to_a]'和'25.times.with_object h [f.succ!] = i} .last'。在第二種情況下,第一個塊參數是引號中的單個反引號('('a'.ord-1).chr => backtick')。 –

1
orig = "X marks the spot" 
res = orig.upcase.unpack('C*').map {|c| c==32 ? 26 : c-65} 

puts res.inspect 
# ⇒ "[23, 26, 12, 0, 17, 10, 18, 26, 19, 7, 4, 26, 18, 15, 14, 19]" 
+0

+1解包,這是一種我需要更好理解的方法。 –

相關問題