当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 周五乐趣:PowerShell 字谜

作者:精品下载站 日期:2024-12-14 07:51:15 浏览:16 分类:玩电脑

周五乐趣:PowerShell 字谜


也许是我的文科背景,但我喜欢文字和文字游戏。我有一堆填字游戏,喜欢用双关语折磨我的孩子(和妻子)。我也对回文和字谜等单词黑客很着迷。字谜法是指将“pot”这样的单词重新排列,以拼写出“opt”或“top”等另一个单词。简短的话语很容易在你的脑海中完成。所以我想为什么不让 PowerShell 为我做一些字母处理工作。

请记住,这些文章的目的不是最终结果,而是过程和技术。我们先从一句话开始吧。

$w = "angle"

我知道这个词应该与这个列表中的一些词匹配。

#should match Angle,glean, and genal
$l = "Angle","aaa","glean","genal","angles"

在字谜中,它具有与源单词相同的字母,只是顺序不同。所以我想我可以将源单词转换为字符数组并比较潜在目标的数组。我进行了多次实验,但最终决定这样做。

$a = (($w.GetEnumerator() | sort) -join '')

本质上,我获取了“angle”一词中的字母,对它们进行了排序,然后重新连接成一个字符串“aegln”。如果有帮助,您可以将其视为一种哈希。现在,我可以浏览潜在列表中的每个单词,执行相同类型的哈希操作并进行比较。

$l | where {$a -eq (($_.GetEnumerator() | sort) -join '')}

如果您尝试这样做,您应该会得到预期的结果。但重点是发现给定单词的字谜词。为此,我需要一大堆单词。

我在 https://github.com/dwyl/english-words 中找到了一个,其中包含超过 466K 的条目。我将副本下载到我的 Scripts 文件夹中。考虑到大小,我认为在单词子集上测试我的过程会更容易。

Get-content c:\scripts\dictionary.txt | select -first 50000 | 
where {($a -eq (($_.GetEnumerator() | sort) -join ''))}

这在不到 15 秒的时间内给了我 3 个字谜。然后我意识到,比较列表中字符数不同的任何单词是没有任何意义的。

Get-content c:\scripts\dictionary.txt | select -first 50000 |  
where { ($_.length -eq $w.length) -and ($a -eq (($_.GetEnumerator() | sort) -join ''))}

花了2.5秒!让我们尝试一下整个单词列表。

$w = "angel"
$a = ($w.getenumerator() | sort) -join ""
Get-content c:\scripts\dictionary.txt | 
where {($_.length -eq $w.length) -AND ((($_.getenumerator() | sort) -join "") -eq $a )}

这花了大约 21 秒。

[玩转系统] 周五乐趣:PowerShell 字谜

顺便说一句,我还测试了首先获取单词列表,然后将其通过管道传输到Where-Object。

$dict = Get-content c:\scripts\dictionary.txt
$dict | where {($_.length -eq $w.length) -AND ((($_.getenumerator() | sort) -join "") -eq $a )}

这速度并没有更快。读取 466K 个单词花了 9 秒多的时间,然后过滤了近 2 分钟。

现在我已经确定了一些核心代码,让我们将其包装在一个函数中。

https://gist.github.com/jdhitsolutions/1a05db07a3bc1b5c93728755f631b34e

该函数是我的 GitHub 存储库上的要点,并定义了一个名为 Get-Anagram 的函数。您将需要一个单词列表。我已经为我的设置了默认值。

使用方法,非常简单。指定一个单词和一个单词列表。我的函数将使用所有字谜词的属性将自定义对象写入管道。以下是该功能实际运行的几个示例。

[玩转系统] 周五乐趣:PowerShell 字谜

是的,我不希望您有紧急的业务需求来找到“危险”的字谜(如果您好奇,则为“范围”),但您可能需要处理大型日志文件,了解过滤或获取示例如何编写函数。

或者也许您只是想找点乐子。享受!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯