随机产生单词然后判别其是否是真正的(可拼写的)单词:)-阿里云开发者社区

开发者社区> 大熊猫侯佩> 正文

随机产生单词然后判别其是否是真正的(可拼写的)单词:)

简介:
+关注继续查看

    linux下带的好玩小巧的东东就是多啊!本猫又找到一个spell程序,如果单词是可拼写的则神马也不输出,否则输出疑似拼错的单词.可以把若干单词放在文件中,也可以用管道输入spell.为了简便本猫采用了后一种方法,可能会慢一点啊!稍后会实现前一种方法,看看效率提高了多少.

    首先是随机生成单词的方法:

def rand_words(n=10000,min_len=2,max_len=12)
	chars = (("a".."z").to_a * max_len).freeze
	words = []
	srand
	n.times do |x|
		len = min_len + (rand*1000).to_i % max_len
		idxes = []
		len.times {idxes<<(rand*100)%26}
		chars.shuffle
		words << chars.values_at(*idxes).join
		idxes.clear
	end 
	words
end

考虑到同一个字母在单词中可以出现多次,符合实际点的做法是将字母表重复max_len次,极端情况下max_len个字母都可以是相同的.然后再写下判断单词是否可拼写的方法:

#ret word that can spell or ret nil
def spell_word(word)
	cmd = `echo #{word}|spell`.chomp
	if cmd == word
		return nil
	else
		return word
	end
end

最后用参数的方式调用试一下:

rand_words(ARGV[0].to_i,ARGV[1].to_i,ARGV[2].to_i).each do |w|
		printf w+" " if spell_word(w)
	end

上测试代码:

wisy@wisy-ThinkPad-X61:~/src/ruby_src$ time ./a.rb 2000 3 12
usage : a.rb [-all|-all2] words_count min_len max_len
eta war raw chum lab err woe coil pee swum yap sap mud who sin 
real	0m22.770s
user	0m3.350s
sys	0m7.216s

速度貌似不甚理想啊,2000个单词用了22秒多!下面用传递文件给spell的方法看看速度如何,遂写一个spell_words方法:

#spell all words by tmpfile
def spell_words(words)
	puts "using spell_words..."
	f = Tempfile.new("#{$$}_spell_blablabla")
	#f = File.open("spell_test","w+")
	#f.write Marshal.dump(words)
	f.write words.join(" ")
	f.close

	cmd = `spell #{f.path}`
	no_spell_words = cmd.split("\n")
	words - no_spell_words
end

修改参数调用方式:

if ARGV[0] =~ /^-all$/
	puts spell_words(rand_words(ARGV[1].to_i,ARGV[2].to_i,ARGV[3].to_i)).join(" ")
else
	rand_words(ARGV[0].to_i,ARGV[1].to_i,ARGV[2].to_i).each do |w|
		printf w+" " if spell_word(w)
	end
end

看一下速度有没有提升啊:

wisy@wisy-ThinkPad-X61:~/src/ruby_src$ time ./a.rb -all 2000 3 12
usage : a.rb [-all|-all2] words_count min_len max_len
using spell_words...
work bah air hop pus etc bob

real	0m3.945s
user	0m0.163s
sys	0m0.050s

效率有变快,只用了不到4秒啊!最后如果spell直接将结果写入文件,然后再读出的方式会不会更快呢?再写一个spell_words2方法吧微笑

#spell all words by tmpfile and spell ret is also use tmpfile
def spell_words2(words)
	puts "using spell_words2..."
	f_words = Tempfile.new("#{$$}_spell_words")
	f_ret = Tempfile.new("#{$$}_spell_ret")
	f_ret.close

	f_words.write words.join(" ")
	f_words.close

	cmd = `spell #{f_words.path} > #{f_ret.path}`
	f=File.open(f_ret.path)
	no_spell_words = f.read.split("\n")
	f.close
	words - no_spell_words
end

最终修改后的源代码如下:

#!/usr/bin/ruby
#code by hopy 2014.12.08
#random create some words and check if a valid word!

require 'tempfile'

def rand_words(n=10000,min_len=2,max_len=12)
	chars = (("a".."z").to_a * max_len).freeze
	words = []
	srand
	n.times do |x|
		len = min_len + (rand*1000).to_i % max_len
		idxes = []
		len.times {idxes<<(rand*100)%26}
		chars.shuffle
		words << chars.values_at(*idxes).join
		idxes.clear
	end 
	words
end

#ret word that can spell or ret nil
def spell_word(word)
	cmd = `echo #{word}|spell`.chomp
	if cmd == word
		return nil
	else
		return word
	end
end

#spell all words by tmpfile
def spell_words(words)
	puts "using spell_words..."
	f = Tempfile.new("#{$$}_spell_blablabla")
	#f = File.open("spell_test","w+")
	#f.write Marshal.dump(words)
	f.write words.join(" ")
	f.close

	cmd = `spell #{f.path}`
	no_spell_words = cmd.split("\n")
	words - no_spell_words
end

#spell all words by tmpfile and spell ret is also use tmpfile
def spell_words2(words)
	puts "using spell_words2..."
	f_words = Tempfile.new("#{$$}_spell_words")
	f_ret = Tempfile.new("#{$$}_spell_ret")
	f_ret.close

	f_words.write words.join(" ")
	f_words.close

	cmd = `spell #{f_words.path} > #{f_ret.path}`
	f=File.open(f_ret.path)
	no_spell_words = f.read.split("\n")
	f.close
	words - no_spell_words
end

puts "usage : #{$0[2..-1]} [-all|-all2] words_count min_len max_len"

if ARGV[0] =~ /^-all$/
	puts spell_words(rand_words(ARGV[1].to_i,ARGV[2].to_i,ARGV[3].to_i)).join(" ")
elsif ARGV[0] =~ /^-all2$/
	puts spell_words2(rand_words(ARGV[1].to_i,ARGV[2].to_i,ARGV[3].to_i)).join(" ")
else
	rand_words(ARGV[0].to_i,ARGV[1].to_i,ARGV[2].to_i).each do |w|
		printf w+" " if spell_word(w)
	end
end

测试如下:

wisy@wisy-ThinkPad-X61:~/src/ruby_src$ time ./a.rb -all2 2000 3 12
usage : a.rb [-all|-all2] words_count min_len max_len
using spell_words2...
pus tty sis aft cut

real	0m4.443s
user	0m0.163s
sys	0m0.050s

貌似spell_words2的方法比spell_words还要略慢啊!?2种方法基本效率差不多啊!一种功能却写了3种实现方法,本猫是不是闲的蛋疼呢?也不尽然,只能说多一种尝试,多一种可能吧!大笑

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4615 0
windows server 2008阿里云ECS服务器安全设置
最近我们Sinesafe安全公司在为客户使用阿里云ecs服务器做安全的过程中,发现服务器基础安全性都没有做。为了为站长们提供更加有效的安全基础解决方案,我们Sinesafe将对阿里云服务器win2008 系统进行基础安全部署实战过程! 比较重要的几部分 1.
5534 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
5828 0
阿里云服务器远程登录用户名和密码的查询方法
阿里云服务器远程连接登录用户名和密码在哪查看?阿里云服务器默认密码是什么?云服务器系统不同默认用户名不同
846 0
腾讯云服务器 设置ngxin + fastdfs +tomcat 开机自启动
在tomcat中新建一个可以启动的 .sh 脚本文件 /usr/local/tomcat7/bin/ export JAVA_HOME=/usr/local/java/jdk7 export PATH=$JAVA_HOME/bin/:$PATH export CLASSPATH=.
2245 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
4265 0
+关注
大熊猫侯佩
贪吃贪睡的大熊猫侯佩
689
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载