3 个版本 (重大更新)

0.3.0 2020 年 6 月 26 日
0.2.0 2020 年 6 月 26 日
0.1.0 2020 年 6 月 26 日

#1926文本处理

MIT/Apache

20KB
392

Swappy

字母表毫无用处但却很有趣。让我们来创建一些吧!

  • "rust programming" => "grim gun port arms" 或 "asymmetry foe" 或 "tarring prom mugs"
  • "rust anagrams library" => "triangular brass army" 或 "snag arbitrary murals"
  • "software engineer" => "we are fingers o net" 或 "sea of wintergreen"
  • "memory safety" => "me, my artsy foe" 或 "ye soft yammer" 或 "format my eyes"

Swappy 使用单词列表文件生成给定短语的字母表。

安装

cargo install swappy

使用方法

  • swappy 'my phrase' (使用 ~/.swappy_wordlist - 复制 这个 或你自己的)
  • 限制=20 单词列表=/一些/文件.txt swappy'my'短语'

Swappy 优先生成包含单词列表中较早出现的单词的字母表,并允许你限制生成的字母表数量。这让你可以定制想要的结果类型(例如,将你认为有趣的单词放在顶部,或将列表按最长到最短排序以获得令人印象深刻的发现)。

默认情况下,它在 ~/.swappy_wordlist 查找单词列表文件,但你可以设置 WORDLIST 环境变量到另一个文件。Swappy 的仓库包含一个 单词列表文件,按最长到最短排序,并删除了许多短的、不常见的单词(如 "oe" 和 "mu"),以提高效率。

基本策略

Swappy 对使用我们的单词列表和短语的字母表树进行深度优先搜索。没有剩余字母的节点是一个字母表。

我们的树可能看起来像这样,其中节点表示为 [找到的单词] / [剩余字母]

  • racecar/
    • race/car
      • 比赛一个 / cr [失败的叶子节点]
      • race car / [成功的叶子节点]
    • 赛车手/ca
      • 赛车手一个 / c [失败的叶子节点]

在决定一个短语是否包含一个单词之前,它会将它们都转换为“字母表排列”,这些排列是无序的;“bat”和“tab”具有相同的字母表排列。我们内部表示字母表排列为一个哈希表,列出了每个字符的计数。这使得比较和减法变得高效。

Swappy是单线程的,但性能良好。我曾考虑过多线程设计,但无法想出一个好的方法来使用多个线程并保证结果按照单词列表给出的顺序产生。我尝试使用优先队列来做这件事,但队列是一个显著的性能瓶颈。

依赖项

~2.2–3.5MB
~60K SLoC