[Ruby on Rails系列]六、一個簡單的暗語生成器與解釋器(上)

【0】Ruby on Rails 系列回顧

[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數據結構

【1】任務目標

本次主要是要實現一個簡單的暗語生成器,併發布到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上

【2】暗語生成器

主要算法:利用手機九宮格鍵盤和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

【3】算法實現

首先,須要創建一個映射表進行加密和解密,上述映射表的數據結構就是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方法恰好能將字符串兩兩分割。

【4】實現效果

http://ronakey.herokuapp.com/

(1)輸入明文iloveyou:

image

(2)輸入4274439123334341:

image

在下一部分,我會介紹將此算法用於Web框架Ruby on Rails,看如何將暗語生成器算法嵌入到網頁當中。

相關文章
相關標籤/搜索