在这些压力重重的时候,玩文字游戏是让自己从郁闷中分心的一种方法。带着这种想法,我挑战自己,找出那些倒过来拼写仍然是单词的单词。
我没有通过简单的谷歌搜索来作弊,而是通过使用Linux命令技能来作弊。因此,在这篇文章中,我们将研究如何使用Linux命令和资源来识别这些单词。
定义搜索
在开始讨论Linux搜索技术之前,我应该指出,我寻找的不仅仅是回文——像“civic”和“deified”这样从左到右读起来和从右到左读起来一样的词。相反,我也在寻找像“奖赏”和“脱咖啡因”这样的词,当人们倒着读它们时,它们会变成不同的词——在本例中是“抽屉”和“面对”。
需要说明的是,人们用来定义可以用这种方式可逆的词的许多术语之一是“倒序词”,而英语中已知最长的倒序词是“重音”和“甜点心”(我的小项目证实了这一点)。我也包括回文词。
使用单词文件
对于我的word资源,我使用的是Linux单词文件。它可能是/usr/dict/words或/usr/share/dict/words在您的系统上。我为这篇文章所使用的系统中的单词文件有超过100,000个单词。你可以使用wc执行计数的命令。
$ wc -l /usr/share/dict/words 102403 /usr/share/dict/words
单词文件的一个特性是,它在以相同字母开头的每组单词之间包含单字母分隔行(用于首字母大写和首字母小写的单词)。这里,作为例子,是两个B和b部分:
咩咩咩咩咩咩咩咩咩咩宝马咩咩宝马咩咩咩
单词文件还包括许多专有名称,首字母缩写和缩写。专有名称(如“Ada”)不能作为无引号,因为名称通常不符合“单词”的资格,因为反转将大写后一个字母(如“Ada”)。单词文件还包含单词的在结尾(所有格和缩写,如isle's和isn't)。因为我不把这些条目当成单词,所以我精心设计了避免考虑它们的技巧。
此外,唯一合法的单字母单词是“a”和“I”。因为这些应该算上总数,我以一些首字母步骤将它们添加到我的单词倒转列表中,以便在循环遍历单词文件时对单个字母部分的标题进行折扣,从而使剩下的处理更容易。
而省略单字母条目,单词全部大写,所有格,我的脚本放在一起找到可逆单词贯穿所有剩下的单词,改变它们中的每一个,然后回头看着歌词文件是否颠倒词也在该文件。
启动脚本
在脚本开始时,我将开始计数设置为2,并显示单词“a”和“I”:
# !以2开头的“a”和“I”(下面避免使用单个字母)计数=2 echo a echo I
循环遍历单词文件
然后我浏览了单词文件。只选择可能符合条件的单词(没有大写、没有撇号等等)的最简单方法是使用grep表达式grep - e " ^ [a - z]{2, 23} *美元”。这将选择从2到23个字母的所有小写单词。我分别确定了单词文件(electroencephalograph’s)中最长的单词有23个字母。
for word in ' cat /usr/share/dict/words | '^[a-z]{2,23}*$' '
扭转每个单词
我使用了牧师反转for循环生成的每个单词的命令。如果我手动做这个,一个反转可能像这样:
$ echo鱼子酱| rev raivac
下面是剧本中的反转:
echo $word | rev
然后查找单词的颠倒形式,看看它是否也存在于单词文件中。这个grep命令将显示找到的单词。如果grep没有找到该单词,则不会生成输出。^和第二个$符号确保只查找完整的单词。
grep ^ revword /usr/share/dict/words美元
计算发现
如果grep命令成功(即,如果它找到了单词的反转),我们就知道反转也是一个单词,并将其添加到计数中。请注意,$ ?控件生成的退出状态grep命令和0表示没有遇到错误(即,没有找到该单词)。
如果[$ ?情商0);然后((count =数+ 1))fi
然后,通过单词文件结束循环,并显示回调数。回文的单词(如“civic”)将被计算一次。非回文的单词将被计算两次(每个单词一次)。因此,最终的计数可能是奇数,也可能是偶数。
echo $count发现的可逆单词
计算百分比
为了满足我的好奇心,我还在脚本的末尾添加了一些命令,以计算单词文件中符合anadromes的条目的百分比。
#确定百分比单词= ' wc -l /usr/share/dict/words ' percent= ' echo $count $words | awk '{打印$1/$2*100}' ' echo -n "百分比:" echo $percent%
在我的例子中,这个百分比是.399%。这个数字略低于0.5%——不到每200个单词中有一个单词。不过,我还是很惊讶有这么多。
这个脚本
整个脚本如下所示,其中包括一些增加可读性的注释。在这个版本的脚本中,我将所有定位到的anadromes放入一个文件中。
# !/bin/bash输出= " anadromes " #从1开始“a”(单个字母下面的条目避免)数= 2回声>输出美元与我> >输出#发现的话,美元逆转时,仍对单词“猫/usr/share/dict/words | grep - e " ^ [a - z]{2, 23} * $‘做revword =“echo $ |转速”grep ^ revword /usr/share/dict/words美元> >输出美元如果[$ ?情商0);然后((count=count+1)) fi完成显示一个单词计数echo $count可逆单词发现确定百分比单词= ' wc -l /usr/share/dict/words ' percent= ' echo $count $words | awk '{打印$1/$2*100}' ' echo -n "百分比:" echo $percent%
我看到了什么?
如果如上所示运行脚本,则可以使用列命令获得它所标识的索引的格式良好的列表。以下是我的发现:
美元列anadromes怪物暗淡的红湿胎我吃苗条看守织大号前夕牛仔鹿以后拉格住最小的媚眼锅ha重温妈妈带点啊哈母羊厄运引用部分拉贾马眼房间啤酒疣脱咖啡因嗯否认者甜点时代ref口香糖更可恨港口血清高尔夫妈妈计时器体育……
该脚本在单词文件中发现了409个前缀。
总结
一个简单的挑战是一个脚本,它锻炼了我的一些Linux技能。这些包括:
- 循环遍历单词文件
- 制作一个grep这个命令只会捕获我想要的东西
- 把每个单词(最后的字母在前)颠倒过来
- 数所发现的前陆线虫
- 计算匹配我的标准的单词的百分比
我还不确定明天的挑战是什么,但是用Linux工具解决问题是一种非常令人满意的脑力锻炼!