TiDB1024谜题解题报告

2020-10-24
TiDB Bash

今天(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 ' ' '\\'

欢迎加入技术讨论 QQ 群: 745157974

给TiDB(MySQL)写一个代理网关

引入数据库网关来优化TiDB Cloud服务运营成本的故事,以及处理MySQL协议的糟心细节
TiDB MySQL serverless

TrueTime和原子钟

2021-02-10
分布式系统 TiDB

价值6万元的TiDB Hackathon创意

2020-12-17
TiDB