[Ruby on Rails系列]6、一個簡單的暗語產生器與解譯器(上)

來源:互聯網
上載者:User

標籤:

【0】Ruby on Rails 系列回顧

[Ruby on Rails系列]1、開發環境準備:Vmware和Linux的安裝

[Ruby on Rails系列]2、開發環境準備:Ruby on Rails開發環境配置

[Ruby on Rails系列]3、初試Rails:使用Rails開發第一個Web程式

[Ruby on Rails系列]4、專題:Rails應用的國際化[i18n]

[Ruby on Rails系列]5、專題:Talk About SaSS

【1】任務目標

本次主要是要實現一個簡單的暗語產生器,並發布到Web,完成後的執行個體如下:http://ronakey.herokuapp.com/

預計分為上中下3篇完成:

(1)[Ruby on Rails系列]6、一個簡單的暗語產生器與解譯器(上)

上篇主要是Ruby語言文法的介紹,以及暗語產生器的主要演算法實現

(2)[Ruby on Rails系列]7、一個簡單的暗語產生器與解譯器(中)

中篇主要是基於Ruby on Rails的Web開發,將暗語生產器演算法嵌入網頁程式中

(3)[Ruby on Rails系列]8、一個簡單的暗語產生器與解譯器(下)

下篇主要講述如何將開發好的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 numend

基本原理是:首先將字串分割為數組,對於字串中每一個字母,按照上述映射表進行映射,實現字母到數位轉換,最終將字串中的所有字母轉換為數字,並返回。

在Ruby中,對字串進行分割採用[string].split()方法,如上所示codeinput.split(//)實現了將字串codeinput分割為一個個的字元數組;其中(//)表示分割的模式,採用Regex文法;分割為數組以後,[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 pend

基本原理和產生器類似,這裡就不具體解釋了。

主要注意的是,在這個演算法中需要實現輸入數位兩兩分割,此時採用的方法是[string].scan()方法而不是split方法,scan方法是按照參數中Regex的文法處理字串,並儲存為數組;與split的不同在於:split方法依照Regex分割字串,而scan根據Regex瀏覽字串。Regex(/[0-9]{2}/)代表了[0-9]的數字{2}位,這時用scan方法剛好能將字串兩兩分割。

【4】實現效果

http://ronakey.herokuapp.com/

(1)輸入明文iloveyou:

(2)輸入4274439123334341:

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

[Ruby on Rails系列]6、一個簡單的暗語產生器與解譯器(上)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.