zoukankan      html  css  js  c++  java
  • [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)

    【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 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,看如何将暗语生成器算法嵌入到网页当中。

  • 相关阅读:
    SQL数据去重复 Distinct 和 row_number() over()
    Excel闪退问题解决
    SQL Server 修改服务器登录名称以及密码
    从底层角度看ASP.NET-A low-level Look at the ASP.NET Architecture
    MD5加密
    MD5实例化异常 未能执行FIPS验证加密算法
    JDBC(上)
    自学MySQL第二天
    自学MySQL第一天
    自学JavaWeb第五天jQuery进阶
  • 原文地址:https://www.cnblogs.com/Kassadin/p/4596067.html
Copyright © 2011-2022 走看看