Scala Word轮解算器

几年前,我在Java和Android中创建了Word Wheel解算器,今年初(一月)我再次决定创建Word Wheel解算器,但是这次是在Scala中。 我在推特上发布了一个结果,该程序长不到100行,与我的Java版本相比要短得多(它运行起来也快得多),但是我认为我会在博客文章中重新访问它。

斯卡拉

首先,对于那些不熟悉它的人; Scala是一种在Java虚拟机上运行的功能性编程语言。
它具有令人难以置信的丰富功能,并且比诸如Java或C ++的更多面向对象的语言,您可以更轻松地解决一些问题。

像Python; Scala具有强大的解释器,可让您即时评估代码:

 欢迎使用Scala 2.11.8(OpenJDK 64位服务器VM,Java 1.8.0_92)。 
输入要评估的表达式。 或尝试:help。

标量> 1 + 1
res0:整数= 2

斯卡拉>

在测试或浏览数据时,这可以证明是无价的。

对于那些对Scala感兴趣的人,我强烈建议使用Scala语言网站,对于那些熟悉Java的人,请阅读《 Scala for Java程序员》一书。

字轮

单词轮是一个简单的谜题,您尝试从一组字母中创建尽可能多的单词,而所有单词中都必须包含一个(或多个)字母。

通常情况下,还有一个词会使用“字轮”中的所有字母,您能看到给定示例中的内容吗?

字轮解算器

现在,这已经超出了我的Word Wheel解算器的范围。

Word Wheel解算器具有3个必需参数:

  1. 要求的字母-要求字母必须在任何拼写单词内
  2. 可选字母-所需字母周围的字母
  3. 单词列表的路径—每行一个单词的文件

还有第四个可选参数; 最小长度的单词可以,默认情况下设置为3。

当您查看Word Wheel时,前两个参数很简单,但是对于单词列表,您可以使用Unix单词文件,从文本生成自己的单词或下载现有的单词列表。

生成单词列表

我通常会下载现有的单词列表,但是生成单词列表相对容易,因此,我将展示如何使用Project Gutenberg提供的文本文件(书)来做到这一点。

在此示例中,我选择了以下书籍:

  • 傲慢与偏见
  • 双城记
  • 福尔摩斯历险记
  • 哈克贝利·费恩历险记
  • 多里安·格雷的图片

我下载了这些文件的UTF-8文本版本,并将它们放在一个文件夹中。

为了将这些书变成单词列表,我编写了以下Scala程序(下面是其解释):

  1. 该程序将文本文件的1条或多条路径作为参数。
  2. 它创建了一个可变集来存储所有单词
  3. 然后遍历每个文件并打开它们
  4. 对于文件中的每一行,它都会清理输入内容:确保用空格替换所有特殊字符,并使所有内容都小写
  5. 然后针对这些行中的每一行,在空格和制表符上拆分行,并创建一组结果词
  6. 然后将此单词集添加到主要单词集中
  7. 然后,它将打开一个名为wordlist.txt的文件,并使用单词集中的所有单词填充该文件

这为我生成了一个包含近20,000个“单词”的文件。 其中一些不是真正的单词,但我现在已经忽略了它们。

求解器代码

现在,我有了一个单词列表,可以使用它在上面给出的示例Word Wheel上运行Word Wheel解算器。

以下是Word Wheel解算器的来源:

大部分工作是在resolve和createWordMap方法中完成的。

createWordMap方法

此方法从单词列表中提取单词,并创建字母到对应单词的映射。 例如:

想象一下,我们的单词列表由2个单词组成: catact
该方法将:

  1. 带字
  2. 按字母顺序排列字母(作用)
  3. 在映射中找到这些字母(行为)的条目,如果找不到该条目,则创建一个新的映射该字母(行为)到包含单词cat的单词列表的条目
  4. 接下来,采取行动这个词
  5. 按字母顺序排列字母(作用)
  6. 在地图中找到这些字母(行为)的条目,并将单词“ 行为”添加到已存在的列表中

此数据结构使您可以找到对主要的求解方法有用的字谜。

解决方法

在solve方法中创建单词映射后的下一行将执行solve方法中的大部分计算。
它基本上会生成可选字母和必需字母的所有可能组合。

然后,此方法中的最后一位代码将使用较早生成的映射,并尝试将生成的组合与其条目进行匹配。
将所有匹配项平展为一个序列,然后使用main方法将其打印到控制台。

结果

当使用生成的单词列表对示例Word Wheel运行时,我得到以下结果:

 危险的 
危险
花园

搁浅
理由
经历
破烂
回响
引起
远射
花园
甘德
格兰德
危险

地面
陷入困境
周围
隆德斯
打s
调养
回合
守卫
争论
葫芦
崇拜者
飙升
被激起
变酸了
盛大
达人
阿登
多兰
装饰

回合
鼻子
没有
昂德斯
声音
阻力
守护

毒品
督促
葫芦


道路
崇拜
行动者
ang
达森

丹犬
杜安
德恩
撕裂
结束
窝点
发送
点头
完成
撤消
拖动
艾格德
老龄化
药物
小狗

总督
阿兹




苏打


无礼
确实
剂量
用过的
起诉
会费



内德
结束
点头
不要
逼债





伤心
阿多
红色
竿
des

到期

其中一些看起来并不像真实的单词。 这是因为我生成的单词列表的内容包含一些拼写错误,语单词和格式错误的文本。

但是,它的确包含使用所有字母的长词:“危险”以及可以在词轮中找到的许多其他真实词。

这篇文章到此结束,请随时对此处提供的代码发表评论。