应对L33t-Speak

作者:Dave Taylor

如何编写l33t-speak翻译器脚本。

今天早上,我和女儿像往常一样通过短信互相开玩笑,我突然用了一种模仿“leet speak”的说法。她对此不以为然,但这让我开始思考语言中程式化的替换,以及它们如何代表有趣的编程挑战。

如果您不熟悉“leet speak”,它是一些年轻黑客喜欢使用的一种英语变体——它充分地模糊了单词,让其他人感到困惑,但仍然允许相当连贯的交流。以单词“elite”为例,去掉开头的“e”,并将拼写改为“leet”。现在用看起来有点相似的数字替换元音:l33t。

说——或写——l33t,有一种幼稚的乐趣。我想它类似于儿童黑话、东伦敦人的押韵俚语或澳大利亚店主的倒装句结构。目的相同:这是我们与他们,以及一种与知情者分享,而不会让其他人理解你在说什么的方式。

然而,从本质上讲,这些东西中的许多只是替换密码。例如,在伦敦腔押韵俚语中,“apples and pears”替换“stairs”,“baked bean”替换“queen”。

事实证明,l33t speak更加正式,实际上有一个维基百科页面概述了它的大部分规则和结构。我将从单词变体和字母替换开始。

L33t Speak的规则

好吧,我有点超前了。其实并没有“规则”,因为从根本上说,leet speak是一种随意的俚语,所以l33t和733T都是“elite”的有效变体。不过,还是有很多典型的替换,例如删除首字母元音,用数字或符号替换元音(例如用“@”代替“a”),用“z”替换结尾的“s”,用“x”替换“cks”(所以“sucks”变成“sux”),以及后缀“ed”变成'd或字母“d”。

所有这些都非常适合使用shell脚本,对吧?那么,让我们测试一些疯狂的技能吧!

为了简单起见,让我们为l33t.sh脚本解析命令行参数,并使用一定程度的随机性来确保它不会太规范化。如何在shell脚本中做到这一点呢?使用变量$RANDOM。在现代shell中,每次引用该变量时,您都会得到一个介于1..MAXINT之间的不同值。想要“掷硬币”吗?使用$(($RANDOM % 2)),它将以合理的随机顺序返回零或1。

因此,快速简便地进行这些替换的方法是使用sed——这是Linux和UNIX之前的旧支柱,流编辑器。我主要在这里使用sed,因为它很容易使用 substitute/pattern/newpattern/——有点像这样


word="$(echo $word | sed "s/ed$/d/")"

这将把序列“ed”替换为“d”,但仅当它是单词的最后两个字母时。毕竟,您不会想将education更改为ducation。

这里还有一些可能有帮助的


word="$(echo $word | sed "s/s$/z/")"
word="$(echo $word | sed "s/cks/x/g;s/cke/x/g")"
word="$(echo $word | sed "s/a/@/g;s/e/3/g;s/o/0/g")"
word="$(echo $word | sed "s/^@/a/")"
word="$(echo $word |  tr "[[:lower:]]" "[[:upper:]]")"

按顺序,结尾的“s”变成结尾的“z”;单词中任何位置的“cks”都变成“x”,“cke”也是如此;所有出现的“a”都转换为“@”;所有出现的“e”都更改为“3”;所有出现的“o”都变为“0”。最后,脚本清理任何可能以“a”开头的单词。最后,所有小写字母都转换为大写,因为,嗯,它看起来很酷。

它是如何工作的?这是第一个脚本如何翻译句子“I am a master hacker with great skills”的


I AM A M@ST3R H@XR WITH GR3@T SKILLZ

这是一个好的开始,但是还有更多可以做的,我将在我的下一篇文章中继续探讨。同时,如果您认为自己是l33t专家,请联系我,让我们讨论一些额外的字母、字母组合和单词规则。

Dave Taylor长期以来一直在UNIX和Linux系统上编写shell脚本。他是《Learning Unix for Mac OS X》和《Wicked Cool Shell Scripts》的作者。您可以在Twitter上找到他,账号是@DaveTaylor,您也可以通过他的技术问答网站联系他:Ask Dave Taylor

加载Disqus评论