[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】实现效果
(1)输入明文iloveyou:

(2)输入4274439123334341:

在下一部分,我会介绍将此算法用于Web框架Ruby on Rails,看如何将暗语生成器算法嵌入到网页当中。
[Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)的更多相关文章
- [Ruby on Rails系列]3、初试Rails:使用Rails开发第一个Web程序
本系列前两部分已经介绍了如何配置Ruby on Rails开发环境,现在终于进入正题啦! Part1.开发前的准备 本次的主要任务是开发第一个Rails程序.需要特别指出的是,本次我选用了一个(Paa ...
- [Ruby on Rails系列]2、开发环境准备:Ruby on Rails开发环境配置
前情回顾 上次讲到Vmware虚拟机的安装配置以及Scientific Linux 6.X系统的安装.这回我们的主要任务是在Linux操作系统上完成Ruby on Rails开发环境的配置. 在配置环 ...
- [Ruby on Rails系列]4、专题:Rails应用的国际化[i18n]
1. 什么是internationalization(i18n)? 国际化,英文简称i18n,按照维基百科的定义:国际化是指在设计软件,将软件与特定语言及地区脱钩的过程.当软件被移植到不同的语言及地区 ...
- win8平台下Ruby on Rails的第一个web应用
最近在做一个网站web前端的前期开发,老板要求用Ruby on Rails搭建部署开发环境,上网搜之,发现整个搭建流程比较坑爹,于是用了一款集成软件Bitnami Ruby Stack一键安装到我的w ...
- ROS与Matlab系列:一个简单的运动控制
ROS与Matlab系列:一个简单的运动控制 转自:http://blog.exbot.net/archives/2594 Matlab拥有强大的数据处理.可视化绘图能力以及众多成熟的算法函数,非常适 ...
- [Ruby on Rails系列]1、开发环境准备:Vmware和Linux的安装
Ruby on Rails是一个采用Ruby语言的遵循MVC模式的Web开发框架.使用RoR会得到更加快速爽快的Web开发体验.相比于Java EE,该框架使Web开发的速度和效率变得更加轻快和敏捷. ...
- Ruby学习笔记2 : 一个简单的Ruby网站,搭建ruby环境
Ruby on Rails website 的基础是 请求-返回 循环. 首先是浏览器请求服务器, 第二步,Second, in our Rails application, the route ta ...
- 自己动手系列——实现一个简单的ArrayList
ArrayList是Java集合框架中一个经典的实现类.他比起常用的数组而言,明显的优点在于,可以随意的添加和删除元素而不需考虑数组的大小.处于练手的目的,实现一个简单的ArrayList,并且把实现 ...
- 扩展Python模块系列(二)----一个简单的例子
本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...
随机推荐
- 使用Hint来优化执行计划
最近看主管优化了一个HINT相关的查询 借此机会学习下HINT 参考Notes: Note 129385 - Database hints in Open SQL http://www.stechno ...
- 对 Sea.js 进行配置(一) seajs.config
可以对 Sea.js 进行配置,让模块编写.开发调试更方便. seajs.config seajs.config(options) 用来进行配置的方法. seajs.config({ // 别名配置 ...
- MySQL中,把varchar类型转为date类型
如下表: 先使用str_to_date函数,将其varchar类型转为日期类型,然后从小到大排序 语法:select str_to_date(class_time,'%Y%m%d %H:%i:%s') ...
- 《mysql数据库备份小脚本》
vim mysql.sh #!/bin/bashDAY=`date +%Y-%m-%d` //日期以年月日显示并赋予DAY变量SIZE=`du -sh /var/lib/mysql //查看mysql ...
- JPA SQL 的复杂查询createNamedQuery
@NamedNativeQueries({ @NamedNativeQuery( name = "getNativeNutShellInfo", //需要调用的name query ...
- Silverlight C#动态设置样式
1.从页面资源中获取样式并应用 btnTest.Style = (Style)this.Resources["BigButtonStyle"] 2.从项目中单独分开的资源字典文件( ...
- Maven入门指南⑤:使用Nexus搭建Maven私服
1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部 ...
- CentOS如何分区
安装Linux CentOS时,需要在硬盘建立CentOS使用的分区,在大多情况下,至少需要为CentOS建立以下3个分区. (1)/boot分区(不是必须的):/boot分区用于引导系统,它包含了操 ...
- Delphi XE5教程2:程序组织
内容源自Delphi XE5 UPDATE 2官方帮助<Delphi Reference>,本人水平有限,欢迎各位高人修正相关错误! 也欢迎各位加入到Delphi学习资料汉化中来,有兴趣者 ...
- 单例模式(Singleton)的6种实现
1.1.1 摘要 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就 ...