2015-09-19 87 views
1

有人能簡單介紹一下我在這條線會發生什麼:凱撒暗號索引

new_word += alphabet[alphabet.index(i.downcase) - num] 

new_word =當前new_word變量+什麼狀態呢?

這是整個方案:

def cipher(word, num) 
alphabet = ('a'..'z').to_a.concat(('A'..'Z').to_a) 
new_word = "" 

word.each_char do |i| 
    if !alphabet.include?(i) 
    new_word +=i 
    else 
    new_word += alphabet[alphabet.index(i.downcase) - num] 
    end 
end 

return new_word.downcase.capitalize 
end 

puts cipher("Apples? and Oranges!", 2) 
+0

這裏有基本上爲此構建的String#tr方法。無需轉換爲unicode或其他。我使用#tr構建了一個密碼。讓我知道你是否想看看我做了什麼。你會發現它更高效和可靠。 – Charles

回答

1

new_wordString,所以右側的值將被附加到它。表達式alphabet[alphabet.index(i.downcase) - num]只是確定在字母表中移位num的字符的低效方式。

alphabet是一個Array,其中包含與字母表相對應的字符值,以小寫字母開頭,後面跟着大寫字母。

這種情況下的index方法找到alphabet中第一次出現字符值i的索引。該指數然後下降num。對應於這個新位置的字符最終在alphabet中查找,結果附加到new_word

還要注意的是,如果新索引是負數,結果將「環繞」,數組將從後面索引,如果num不是太大,將導致大寫字母。這些潛在的大寫字母將在new_word.downcase.capitalize中下調。


downcase部分是奇怪的,因爲它意味着「密碼」不可逆的。還要注意,如果num的絕對值太大以至於查找超出範圍,那麼這將不會如您所期望的那樣工作。

0

它增加了新詞的字母在其中所代表的字母(alphabet.index(i.dow​​ncase) - NUM)。

i.dow​​ncase只是將字母轉換爲小寫,如果它還沒有。

alphabet.index找到我所在的字母表中的位置。

num減法是密碼。它通過修改找到字母的字母索引來更改要添加的字母。數字1會將'b'變成'a',因爲'a'在給定的字母表中'b'之前。

因此,它需要將字母轉換爲小寫,然後是數組索引,通過num修改索引,並將新索引代表的字母添加回單詞中。