求解阿里技术的彩蛋
除夕中午看到 阿里技术 公众号推送一个挺有意思的解密题目, 问题原文在这里. 现在来求解一下这个题目.
题目给了三条线索:
先来看第一条线索, 第一张图片是印在一块钱上的西湖的景色, 第二个看起来像郑成功雕像. 以图搜索发现第一个是西湖的三潭印月, 第二个是鼓浪屿的郑成功雕像. 再加上 延伸的轨道 这句话, 推测应该和杭州到厦门的火车有关.
再来看第二条线索, 是9个时间, 对照着杭州到厦门的火车时刻表, 恰好有且仅有 D3217
这趟车是符合的. 再仔细看线索 沿路拾起9把时间钥匙 沿路二字似乎暗示了和途径站点有关. 筛查一下列车时刻表, 不出意外, 有9站点恰好符合时间.
序号 | 时间 | 站点 | 到站次序 |
---|---|---|---|
1 | 22:41 | 厦门北 | 16 |
2 | 18:33 | 雁荡山 | 7 |
3 | 16:33 | 绍兴东 | 3 |
4 | 21:55 | 仙游 | 14 |
5 | 17:52 | 三门县 | 5 |
6 | 15:58 | 杭州东 | 1 |
7 | 19:09 | 温州南 | 9 |
8 | 19:58 | 太姥山 | 11 |
9 | 19:28 | 鳌江 | 10 |
再看线索三, 凯撒大帝应该是指凯撒密码了, 那么后面那段应该就是密文了. 数一下总共有45个, 恰好是9的倍数, 而且刚好可以用 U
分成9段, 而且还那么刚好是除了 U
还有4个字符. 估计这就是Unicode编码, 那么凯撒密码要移动的应该就是这里边的字母了. 可是到底要移动多少呢? 再仔细看线索三, 打通时空的站次, 站次这个词有点突兀, 也许移位和到站次序有关. 以到站次序移动字母, 在 U963V
中 V
, 变成了 F
, 字符变成了 \u963F
恰好是十六进制的编码, 测试一下, 还刚好是 阿
字, 这种方法应该是可行的.
于是编程求解:
# -*- coding: utf-8 -*-
'''
name: 凯撒密码.py
usage: --
author: [[
date: 2018-02-15 14:42:37
version: 1.0
Env.: Python 3.6.4, WIN 10
'''
class Caesar(object):
def __init__(self, words, distances):
self.words = words.split('U')[1:]
self.distances = distances
self.result = []
def shift_word(self):
for index, word in enumerate(self.words):
shifted_word = ''
for letter in word:
if letter > '9':
shifted_word += self.shift_letter(letter, self.distances[index])
else:
shifted_word += letter
self.result.append(r'\u' + shifted_word)
def show(self):
for word in self.result:
print(word.encode('latin-1').decode('unicode_escape'), end='')
@staticmethod
def shift_letter(letter, distance):
moved_char = chr(ord(letter) - distance)
return moved_char
word = Caesar(
"U963VU91JJU59E9U5728U4J00U8E77U8OL7U798QU5O74",
(16, 7, 3, 14, 5, 1, 9, 11, 10)
)
word.shift_word()
print(word.result)
word.show()
# 结果为:
# ['\\u963F', '\\u91CC', '\\u59B9', '\\u5728', '\\u4E00',
# '\\u8D77', '\\u8FC7', '\\u798F', '\\u5E74']
# 阿里妹在一起过福年