您的位置:首页 > 编程语言 > Ruby

Ruby的几道题目

2016-01-23 22:00 330 查看

Ruby的几道题目

2016/1/22

一、回文

给定词典文档word.txt(在这里下载),找出词典中是回文的单词并输出。回文词是指字母顺序颠倒但同样是单词的词,例如:level。

编程要求:

      (1)设计函数,统一命名为palindromes.rb

      (2)输出格式

           执行结果根据字符串长度由大到小输出。

           例如:现有回文集合{non, dad, madam, mom, level,redivider},则输出顺序为{redivider,madam, level, non, dad, mom}

 

程序如下:palindromes.rb

#encoding:utf-8
require 'benchmark'  #加入库文件
def palindromes
words =Array.new#words=[]  #保存回文的单词
fin=File.new("words.txt","r")
while word = fin.gets
word = word.strip  #去除单词的空格
if word == word.reverse  #判断是否回文
words.push word#words+=[word]#存入数组中
end
end
fin.close
fout=File.new("result.txt","w")
words=words.sort_by{|x| x.length}.reverse #按长度排序
fout.puts words #写入文件中
fout.close
end
Benchmark.bm(20) do |t|
t.report('palindromes运行时间'){palindromes}
end


运行结果如下:






运行时间如下:






一些函数简单说明:

1.      str.strip → new_str :Returns a copy of strwith leading and trailing whitespace removed.

去掉字符串前面和后面的空格。

示例:

"    hello    ".strip   #=> "hello"
"\tgoodbye\r\n".strip   #=> "goodbye"


2.      str.reverse → new_str:Returns anew string with the characters from strin reverse order.

翻转字符串。

示例:

"stressed".reverse   #=> "desserts"


3.       ary.push(obj,... ) → ary:Append — Pushes the given object(s) on to the end of thisarray. This expression returns the array itself, so several appends may bechained together. 

在数组后面追加数组元素,返回值为增加后的数组。

示例:

a = [ "a", "b", "c" ]
a.push("d", "e", "f")
#=> ["a", "b", "c", "d", "e", "f"]
[1, 2, 3,].push(4).push(5)
#=> [1, 2, 3, 4, 5]


4.      enum.sort_by { |obj| block } → array enum.sort_by→ an_enumerator:Sorts enumusing a set of keys generated by mapping thevalues in enumthrough the given block. If no block isgiven, an enumerator is returned instead.

将枚举的元素按照某种方式排序(整理),此处是按照单词的长度排序(整理)

示例:

%w{apple pear fig}.sort_by { |word| word.length}
#=> ["fig", "pear", "apple"]


1.      Benchmark可以测试代码运行的时间。可以使用bm或者bmbm方法进行测试。

其中,report 括号里面为相应测试的标签名, 用来区别测试结果,bm里面参数7用来调节标签在结果里的显示占位宽度, 不对结果产生影响。产生的时间有4个时间,分别是用户CPU时间(user CPU time),系统CPU时间( system CPUtime),用户CPU时间与系统CPU时间之和(the
sum of the user and system CPU times),实际运行的真实时间(the elapsed real time)。

示例:

require 'benchmark'

n = 5000000
Benchmark.bm(7) do |x|
x.report("for:")   { for i in 1..n; a = "1"; end }
x.report("times:") { n.times do   ; a = "1"; end }
x.report("upto:")  { 1.upto(n) do ; a = "1"; end }
end

结果:

              user     system      total        real

for:      1.010000   0.000000   1.010000 (  1.015688)

times:    1.000000   0.000000   1.000000 (  1.003611)

upto:     1.030000   0.000000   1.030000 (  1.028098)


二、单词统计

给定一篇文章word9count.txt,也可以自选。统计文章中每个单词的词频,例如:"Tobe or not to be" # => {"to"=>2, "be"=>2,"or"=>1, "not"=>1}

编程要求:

       (1)设计函数,统一命名为count_words.rb

       (2)输出格式

        a.结果返回一个hash键值对(key,value),key指words字符串,value指每个单词出现的词频;   

        b.单词根据词频的大小由大到小输出;

        c.定冠词(the)不计入其中。

程序如下:

#encoding:utf-8
require 'benchmark'  #加入库文件
def count_words
count = Hash.new(0)
file = 'wordcount.txt'
File.read(file).gsub(/[!"";(),?.-]/," ").split.each {|word| count[word.downcase] +=1}
count.delete("the") #去掉定冠词the
count = count.sort_by{|x,y| y}.reverse #排序/整理
#count=count.sort{|x,y| y[1]<=>x[1]}  #从大到小排序
result=Hash[count]  #将数组转换为哈希
#puts result   #输出单词以及词频
fout=File.new("result2.txt","w")
result.each{|x,y| fout.puts x+ " => "+ y.to_s}#输出到文件中
fout.close
end
Benchmark.bm(20) do |t|
t.report('count_words运行时间'){count_words}
end

运行结果如下:



运行时间如下:



一些函数简单说明:

1.      str.gsub(pattern, replacement) → new_str   Returns a copy of strwith the alloccurrences of patternsubstituted for the second argument. The pattern istypically a 
Regexp
; if given as
String
, any regular expression metacharacters itcontains will be interpreted literally, e.g. 
'\\d'
will match a backlash followed by 'd', instead ofa digit.      

字符串替换功能。将左边的字符替换为右边的字符。

举例:

"hello".gsub(/[aeiou]/, '*')                  #=> "h*ll*"





附:正则表达式



2.      str.split(pattern=$;, [limit]) → anArray Divides strinto substrings based on a delimiter, returning anarray of these substrings.

字符串分隔,默认分隔符为空格

例子:

" now's  the time".split        #=> ["now's", "the", "time"]
" now's  the time".split(' ')   #=> ["now's", "the", "time"]
"mellow yellow".split("ello")   #=> ["m", "w y", "w"]
"1,2,,3,4,,".split(',')         #=> ["1", "2", "", "3", "4"]

3.      str.downcase → new_str Returns a copy of strwith all uppercase letters replaced with theirlowercase counterparts. The operation is locale insensitive—only characters“A'' to “Z'' are affected.

将字符串中的大写字母都转换为小写字母。

示例:

"hEllO".downcase   #=> "hello"


4.      ary.delete(obj) → item or nil  Deletes allitems from 
self
that are equal to 
obj
.

删除数组中的obj元素。

示例:

a = [ "a", "b", "b", "b", "c" ]
a.delete("b")                   #=> "b"
a                               #=> ["a", "c"]
a.delete("z")                   #=> nil
a.delete("z") { "not found" }   #=> "not found"

三、找出字典中,字母相同、组合方式不同的集合

   在英文词库中,有这样一些有趣的集合,例如:{"rats","tars" , "star"},在这个集合中四个字母通过组合的方式分别构成了三个单词。在给定的word.txt词库中找到并输出这样的集合,注意,不输出只有一个字母的单词。

编程要求:

  (1)设计函数,统一命名为anagrams.rb

  (2)输出格式

       a.每个集合输出一行;

       b.集合间的单词以空格区分。

程序如下:

#encoding:utf-8
require 'benchmark'  #加入库文件
def anagrams
#创建hash表,用于存放‘兄弟单词’
#键值为单词,值为数组,存储满足该键值的所有单词
words={}
aFile = File.new("words.txt","r")
aFile.each() do|line| #读取文件中的每一行,每一行即为一个单词
line=line.strip #去除单词前后空格
#创建键值,将单词按字符拆分并排序
word=line.split('').sort.join('')
if words.has_key?(word)
#如果该键值存在,则在对于数组中加入该单词
words[word]+=[line]
else
words[word] = [line]#如果没有该单词,则创建
end
end
aFile.close
fout=File.new("result3.txt","w")
words.each do |key,value|
if value.length>1
# puts "#{key}=>#{value}"
fout.puts value.join(' ')
end
end
fout.close
end
Benchmark.bm(20) do |t|
t.report('anagrams运行时间'){anagrams}
end

程序运行结果如下:



程序运行时间如下:



一些函数简单说明:

1.      ary.sort → new_ary Returns a new array created by sorting 
self
.

自身字符排序,字符串同理。

例子:



a = [ "d", "a", "e", "c", "b" ]
a.sort                    #=> ["a", "b", "c", "d", "e"]


2.      ary.join(separator=$,) → str  Returns astring created by converting each element of the array to a string, separatedby the given 
separator
.

组合字符

示例:

[ "a", "b", "c" ].join        #=> "abc"
[ "a", "b", "c" ].join("-")   #=> "a-b-c"

本文使用的Ruby编译器为RubyMine

 

参考文献:

Ruby2.1.0 APIhttp://doc.rubyfans.com/ruby/v2.1/

Ruby开发文档 :http://doc.rubyfans.com/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: