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

使用Linux命令行解决Wordle问题_0

时间:2023-03-17 20:13:09 科技观察

使用Linux的grep和fgrep命令赢得您最喜欢的基于单词的猜谜游戏。我最近有点迷上了一个在线猜词游戏,你有六次机会猜一个随机的五个字母的单词。这个词每天都在变化,你每天只能玩一次。每次猜测后,您猜中的每个字母都会突出显示:灰色表示该字母未出现在神秘单词中,黄色表示该字母出现在该单词中但未出现在该位置,绿色表示该字母出现在该单词的正确位置在。下面介绍如何使用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但这个wordlist的第一个位置也有字母a,这是我不想要的。游戏已经显示字母a存在于其他地方。我可以使用grep修改我的命令以查找在第一个位置包含其他字母的单词。这将我可能的猜测范围缩小到5500个单词:$fgrepamyguess|grep'^[b-z]'>myguess2$wc-lmyguessmyguess215034myguess5566myguess220600total但我知道神秘词不包含字母c,r,e,ors.我可以使用另一个grep命令在搜索中省略这些字母:$fgrepamyguess|grep'^[b-z]'|grep-v'[cres]'>myguess2$wc-lmyguessmyguess215034myguess1257myguess216291total-v选项表示反转搜索,所以grep只会返回不匹配正则表达式[cres]或者单列字母c,r,e,或s。通过这个额外的grep命令,我将下一个猜测范围大幅缩小到只有1200个可能的单词,这些单词在某处有一个但不在第一个位置,并且不包含c、r、e或s。查看此列表后,我决定尝试一下balmy这个词。balmywordattempt这次第三次尝试,字母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个词。这就是命令行的力量。