今天(10月24日)被大家称为程序员节,PingCAP也凑热闹发布了一个谜题。其实是很简单,不过借助这题,我也是学习了一些 linux 命令的使用方法,还是很有意义的。不想关注公众号的话,题目也能在asktug直接看到。
首先谜面看形式像是摩尔斯电码,但肯定不是,因为摩尔斯电码不是定长的,但是这里每组长度都是8,大概率是ASCII。
这里-和.想必是0和1(所以提示的莱布尼茨是二进制的意思?),又因为ASCII第一位总是0,所以我们把-换成0,.换成1,再按ASCII转成拉丁字母。
先用 tr 做简单的字符替换,同时把空格换成空行方便后续处理。
cat CODE | tr '-' '0' | tr '.' '1' | tr ' ' '\n'
输出是
00100000
01110101
00110101
00110100
00111000
...
接下来我们用bc来做个进制转换,方法是设置ibase和obase:echo "ibase=2;obase=10000;00100000" | bc
。注意这里我们先设置ibase=2,接着设置obase的时候要按ibase的格式,也就是二进制的16(10000)。
在把之前的结果交给bc之前,先用sed整理下格式。
sed "s/^/ibase=2;obase=10000;/g" | bc
输出:
20
75
35
34
38
...
然后我们用xxd工具,这个一般是用来做hex dump的,不过给它加上-r参数后,可以把hex形式给转回去。在hex之前,我们要整理下格式,把换行符删掉。
tr -d '\n' | xxd -p -r
输出:
u548c u0020 u0054 u0069 u0044 u0042 ...
看上去是固定的u后跟4个字符,显然是unicode了。我随便找了个在线转unicode的网站,发现它要的输入格式是\uXXX。这好说,再用tr把空格换成\,然后填到网站上就出结果了:
和 TiDB 一起用代码....
看上去这就是答案了,用一行脚本的话就是:
cat CODE | tr '-' '0' | tr '.' '1' | tr ' ' '\n' | sed "s/^/ibase=2;obase=10000;/g" | bc | tr -d '\n' | xxd -p -r | tr ' ' '\\'