[Ruby on Rails系列]一、開發環境準備:Vmware和Linux的安裝html
[Ruby on Rails系列]二、開發環境準備:Ruby on Rails開發環境配置正則表達式
[Ruby on Rails系列]三、初試Rails:使用Rails開發第一個Web程序算法
[Ruby on Rails系列]四、專題:Rails應用的國際化[i18n]數組
[Ruby on Rails系列]五、專題:Talk About SaSS數據結構
本次主要是要實現一個簡單的暗語生成器,併發布到Web,完成後的實例以下:http://ronakey.herokuapp.com/併發
預計分爲上中下3篇完成:app
(1)[Ruby on Rails系列]六、一個簡單的暗語生成器與解釋器(上)框架
上篇主要是Ruby語言語法的介紹,以及暗語生成器的主要算法實現函數
(2)[Ruby on Rails系列]七、一個簡單的暗語生成器與解釋器(中)加密
中篇主要是基於Ruby on Rails的Web開發,將暗語生產器算法嵌入網頁程序中
(3)[Ruby on Rails系列]八、一個簡單的暗語生成器與解釋器(下)
下篇主要講述如何將開發好的RoR程序藉助Heroku平臺部署到Internet上
主要算法:利用手機九宮格鍵盤和QWER鍵盤的映射關係。映射表以下:
映射表:
九宮格鍵盤 字母 QWER字母 21 a q 22 b w 23 c e 31 d r 32 e t 33 f y 41 g u 42 h i ... ... ... 舉例:
輸入暗語:4274439123334341
經過上述密碼錶解密可得:iloveyou
首先,須要創建一個映射表進行加密和解密,上述映射表的數據結構就是key-value對,在Ruby中,採用Hash類實現上述數據結構:
@numtocodetable = Hash.[]( "21" => "q", "22" => "w", "23" => "e", "31" => "r", "32" => "t", "33" => "y", "41" => "u", "42" => "i", "43" => "o", "51" => "p", "52" => "a", "53" => "s", "61" => "d", "62" => "f", "63" => "g", "71" => "h", "72" => "j", "73" => "k", "74" => "l", "81" => "z", "82" => "x", "83" => "c", "91" => "v", "92" => "b", "93" => "n", "94" => "m" ) @codetonumtable = Hash.[]( "q" => "21", "w" => "22", "e" => "23", "r" => "31", "t" => "32", "y" => "33", "u" => "41", "i" => "42", "o" => "43", "p" => "51", "a" => "52", "s" => "53", "d" => "61", "f" => "62", "g" => "63", "h" => "71", "j" => "72", "k" => "73", "l" => "74", "z" => "81", "x" => "82", "c" => "83", "v" => "91", "b" => "92", "n" => "93", "m" => "94" )
聲明瞭2個hash類型變量,@numtocodetable實現數字到字母的映射表,@codetonumtable實現字母到數字的映射表。
>>
其次,實現暗語的生成:用戶輸入明文(字母),經過轉換成爲密文(數字):
def self.codetonum(code) num = "" codeinput = code codeinput.split(//).each do |item| num = num + @codetonumtable[item] end return num end
基本原理是:首先將字符串分割爲數組,對於字符串中每個字母,按照上述映射表進行映射,實現字母到數字的轉換,最終將字符串中的全部字母轉換爲數字,並返回。
在Ruby中,對字符串進行分割採用[string].split()方法,如上所示codeinput.split(//)實現了將字符串codeinput分割爲一個個的字符數組;其中(//)表示分割的模式,採用正則表達式語法;分割爲數組之後,[array].each迭代器支持數組的遍歷(相似於foreach循環,函數語言中的map),在each迭代器中利用hashtable實現字母轉爲數字。
>>
最後,是暗語的解釋器:用戶輸入密文(數字),經過轉換獲得明文(字母):
def self.numtocode(num) p = "" input = num str = input.scan(/[0-9]{2}/) str.each do |item| p = p + @numtocodetable[item] end return p end
基本原理和生成器相似,這裏就不具體解釋了。
主要注意的是,在這個算法中須要實現輸入數字的兩兩分割,此時採用的方法是[string].scan()方法而不是split方法,scan方法是按照參數中正則表達式的文法處理字符串,並保存爲數組;與split的不一樣在於:split方法依照正則表達式分割字符串,而scan根據正則表達式瀏覽字符串。正則表達式(/[0-9]{2}/)表明了[0-9]的數字{2}位,這時用scan方法恰好能將字符串兩兩分割。
(1)輸入明文iloveyou:
(2)輸入4274439123334341:
在下一部分,我會介紹將此算法用於Web框架Ruby on Rails,看如何將暗語生成器算法嵌入到網頁當中。