在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
过年前的时候,看到同事HQJ在手机上玩猜成语,前两天,我也下载了一个《疯狂看图猜成语2》,其实最开始看到这个游戏时候,就习惯性的想作弊了。 #coding: UTF-8 require 'iconv' words_array = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里| #成语游戏的备选字库 words = words_array.map {|x| Iconv.conv 'gbk', 'utf-8', x} #utf-8转gbk idioms = words.permutation(4).to_a #每4个字分组 idioms.each {|x| puts x.join} #分组合并,就是四字成语 功能是有了,但是这个排列组合的数量巨大,人眼很难找到成语,24个字4字排列总共255024个,眼神好能找到符合的成语,不好就很难了。 #coding: UTF-8 require 'iconv' s1 = Iconv.conv 'gbk','utf-8',"【" #烦人的转码 s2 = Iconv.conv 'gbk','utf-8',"】" File.open('成语.txt','w') do |wfile| File.open('成语词典.txt','r') do |rfile| rfile.each do |line| line =~ /#{s1}(.*)#{s2}/ wfile << $1 << "\n" #没有\n就会连一起了 end end end 输出为“成语.txt”,最后有几个错误的词,手工给删除了,最后是23594条成语。 #coding: UTF-8 require 'iconv' words = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里| idioms_array = Array.new idioms_regexp = Array.new File.open('成语.txt','r') do |file| file.each do |line| idioms_array << line.chomp #把成语词典折腾出来,作为array数组 end end words_g = words.map {|x| Iconv.conv 'gbk', 'utf-8',x}.uniq #转码,另外把重复的字去除,后面用不到 words_g.each {|word| idioms_array.map {|x| idioms_regexp << x if x =~ /^#{word}/} #循环,从成语词典中匹配第一个字相同的记录 idioms_regexp.map {|idiom| idioms_regexp = [] #这里坑了我很久,一直有重复的,后来发现因为里面有数据,清空就好了 puts idiom if words_g.include?(idiom[1]) && words_g.include?(idiom[2]) && words_g.include?(idiom[3]) #检查成语的第2、3、4个字,是否在词库中,都在那就ok了 } }
#coding: UTF-8 require 'iconv' require 'benchmark' words = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里| idioms_array = Array.new File.open('成语.txt','r') do |file| file.each do |line| idioms_array << line.chomp #把成语词典折腾出来,作为array数组 end end words_g = words.map {|x| Iconv.conv 'gbk', 'utf-8',x}.uniq #转码,另外把重复的字去除,后面用不到 Benchmark.bm do |bm| bm.report { words_g.each do |word| idioms_array.map do |idiom| puts idiom if idiom =~ /^#{word}/ and words_g.include?(idiom[1]) and words_g.include?(idiom[2]) and words_g.include?(idiom[3]) end end } end
#coding: UTF-8 require 'iconv' require 'benchmark' words = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里| idioms_array = Array.new File.open('成语u.txt','r') do |file| file.each do |line| idioms_array << line.chomp #把成语词典折腾出来,作为array数组 end end Benchmark.bm do |bm| bm.report { words.uniq.each do |word| idioms_array.map do |idiom| puts idiom if idiom =~ /^#{word}/ and words.include?(idiom[1]) and words.include?(idiom[2]) and words.include?(idiom[3]) end end } end
6.看到这里,大家发现了什么没有,其实上面说的都是在扯淡,不过恐怕没有几个人有耐心看到这里的吧。我的处理思想是有问题的,其实完全想多了。最简单的就是,从成语文件中读取,判断是否在字库中存在即可,下面的代码是秒速的,不到0.2秒结果就出来了,快2个数量级的差别。 #coding: UTF-8 require 'iconv' require 'benchmark' words = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里| words_g = words.map {|x| Iconv.conv 'gbk', 'utf-8',x}.uniq #转码,另外把重复的字去除,后面用不到 Benchmark.bm do |bm| bm.report { File.open('成语.txt','r') do |file| file.each do |line| puts line if words_g.include?(line[0]) and words_g.include?(line[1]) and words_g.include?(line[2]) and words_g.include?(line[3]) end end } end
#coding: UTF-8 require 'benchmark' words = %w|无 黑 用 如 小 比 伦 材 脚 纸 四 表 两 得 一 字 天 大 朝 白 与 举 一 里| Benchmark.bm do |bm| bm.report { File.open('成语u.txt','r') do |file| file.each do |line| puts line if words.include?(line[0]) and words.include?(line[1]) and words.include?(line[2]) and words.include?(line[3]) end end } end
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论