当前位置: 首页 > 科技观察

使用Linux命令行解决Wordle问题

时间:2023-03-16 17:54:55 科技观察

我最近对一个在线猜词游戏有点着迷,你有六次机会猜一个随机的五个字母的单词。这个词每天都在变化,你每天只能玩一次。每次猜测后,您猜中的每个字母都会突出显示:灰色表示该字母未出现在神秘单词中,黄色表示该字母出现在该单词中但未出现在该位置,绿色表示该字母出现在该单词的正确位置在。下面介绍如何使用Linux命令行来帮助您玩Wordle之类的猜谜游戏。我用这种方法帮助我解决了1月6日的难题:FirstAttemptLinux系统在/usr/share/dict/words文件中保留了一个单词字典。这是一个很长的纯文本文件。我系统的word文件有超过479,800个条目。此文件包含纯文本和专有名词(名称、地点等)。开始我的第一个猜测,我只想得到一个恰好五个字母长的纯文本单词列表。为此,我使用了这个grep命令:$grep'^[a-z][a-z][a-z][a-z][a-z]$'/usr/share/dict/words>myguessgrep命令使用正则表达式进行搜索。您可以使用正则表达式做很多事情,但为了帮助我解决Wordle问题,我只需要基础知识。^表示行首,$表示行尾。在这两者之间,我指定了[a-z]的五个实例,表示从a到z的任何小写字母。我还可以使用wc命令查看我的可能单词列表,“仅”15,000个单词:$wc-lmyguess15034myguess从这个列表中,我随机选择一个五个字母的单词:acres。a设置为黄色,表示该字母存在于神秘词的某处,但不在第一个位置。其他字母是灰色的,所以我知道它们在今天的单词中不存在。acreswordattemptsecondattempt对于我的下一个猜测,我想获得包含a但不在第一个位置的所有单词的列表。我的列表也不应该包括字母c、r、e或s。让我们把这个问题分解成几个步骤。要获取所有带有a的单词的列表,我使用fgrep(固定字符串grep)命令。fgrep命令也像grep一样搜索文本,但没有正则表达式:$fgrepamyguess>myguess2这使我接下来的猜测可能列表从15,000个单词减少到6,600个单词:$wc-lmyguessmyguess215034myguess6634myguess221668total但是这个单词列表的第一个位置也有字母a,我不想要。游戏表明字母a存在于其他地方。我可以使用grep修改我的命令以查找在第一个位置包含其他字母的单词。这将我可能的猜测缩小到5500个单词:$wc-lmyguessmyguess215034myguess6634myguess221668total但我知道神秘单词也不包括字母c、r、e或s。我可以使用另一个grep命令在搜索中省略这些字母:$fgrepamyguess|grep'^[b-z]'|grep-v'[cres]'>myguess2$wc-lmyguessmyguess215034myguess1257myguess216291total-voption表示反向搜索,所以grep只会返回不匹配正则表达式[cres]的行或者单列的字母c、r、e或s。使用这个额外的grep命令,我将我的下一个猜测大幅缩小到只有1200个可能的单词,这些单词在某处有一个但不在第一个位置并且不包含c、r、e或s。查看此列表后,我决定尝试一下balmy这个词。balmywordtrythirdtry这次,字母b和a突出显示为绿色,这意味着我把字母放在了正确的位置。字母l是黄色的,所以这个字母存在于单词的其他地方,但不在那个位置。字母m和y显示为灰色,因此我可以将它们排除在下一次猜测之外。要确定下一个可能的单词列表,我可以使用另一组grep命令。我知道单词以ba开头,所以我可以从这里开始搜索:$grep'^ba'myguess2>myguess3$wc-lmyguess377myguess3那只有77个单词!包含字母l的单词:$grep'^ba[^l]'myguess2>myguess3$wc-lmyguess361myguess3方括号[^l]中的^表示不是这个字母列表,即不是字母l。这使我的可能单词列表达到61,并非所有单词都包含字母l,我可以使用另一个grep搜索将其删除:$grep'^ba[^l]'myguess2|fgrepl>myguess3$wc-lmyguess310myguess3其中有些单词可能包含字母m和y,这在今天的神秘单词中是没有的。我可以再进行一次反向grep搜索,将它们从我的猜测列表中删除:$grep'^ba[^l]'myguess2|fgrepl|grep-v'[my]'>myguess3$wc-lmyguess37myguess3我可能的单词列表现在非常短,只有七个单词!我选择平庸作为我的下一个猜测,它恰好是正确的。$catmyguess3babulbailobakalbaklibanalbauldbaulk我选择banal作为我下一个猜测的可能词,它恰好是正确的。陈词滥调正则表达式的力量Linux命令行提供了强大的工具来帮助您完成实际工作。grep和fgrep命令在扫描单词列表方面提供了极大的灵活性。对于基于单词的猜谜游戏,grep帮助确定了一个包含15,000个可能单词的列表。在猜测并知道哪些字母出现在神秘词中,哪些不出现后,grep和fgrep帮助将选项缩小到1200个词,然后只剩下7个词。这就是命令行的力量。