==============================================首先是2011年的==================================================
实际上,这张图真正最有趣的地方并非作为背景的妹子,而恰恰是前面的这个01串。下面我们就来看看这个01串到底是什么意思。
首先用ocr软件将图片上的数字转化为文本,有些地方颜色和背景差不多需要手工识别。数字串总共26行,除最后一行98个数字外其它每行110个数字,共计2848个数字。最后手工校验一遍。这个过程比较考验耐心……
00011111100010110000100000000000000000000000000000000000000000000000001000000011011011010101000011001011010011
10110000100100000000010100001111010101001100011110100001010101101010110101100000001110000000000011010100001101
10000101000100010011011010001110001000010110001100010011000110101100010011000011010010011010011000001101100010
11100000011010011010101001010111100001110100010011011001110101100000001011000011110111010010111101110010111000
11010110000001010010011000101110111111000000000011111111110000111000111101110000111000011110001100010110010011
01000011001000100110010011110011001001110010111001111101111001111010010011011110111110111001111101111111010111
11000111111000000001101100001000011110110010000001100001010100101011010010011010110011000010010010000010000010
10010100100001100011011000110010000110001101010110010001010101111001000101010010101100001100111100010011110111
10000101001010111110010000000001010000111010010001100010101101100001100110100010010011011110111111010010001000
01000110000111001011100001001100101110010000101010000101111100011100111101001111101110011011010110100000001011
10111101011101010110010010110000011011000010101111011010111010000111101101001110010110010110111001000111011011
11111110000100111110111110011110111100001100110111000001110100001001001001000001010100101100011010000101100011
00010011010110110000110011100110101001001100101001000111110000010110000000100010011011010101011100111000000100
11101011110110011001010101011001011010110111011111111010110000111010100100100110001111101011000010011100110110
10101001111011010101000111110000011110100011110110100001010101110111010101001110010001110101000101000101000001
01010010110001101011010110001100000111001001010000011000100110000110001000110010111111100101101010011110011101
10011110011000111100101110000101010101000110101101111010001000111001110100100001111110011111010101000110010101
00110010001111111011111000000100111001111001110101010001101110011000100100010110010111010011111000101100001011
11100010100010011000110110111010011001001001111011010010111000001111000011100100100100010011101011010001110010
01100101001101100001101100110000111111010010101000011010011000000111110100011000100001101010010110100110110110
01010001010000101001110011010110000101110001111010000101001011100100110100001001000001101000110101111110001010
01010000100100011000011000110110110111110100000010011110111001100000010011100100100101100010000010111111100101
10110110111000100000100010100000100001100001001110011101001000101000000110001110011000011101111100101000111101
01000011010010100100011000001000010001111011110001101010100110001111110100001101110100100001101101100010101101
11000010111011101011111111011110010000100010100101101101100100110101111000001101110010100000011100110101011000
01111011110010100000000010110111111110101010100011000010011100000110111110000000010000000000000000
首先第一个想法肯定是ASCII编码,由于不知道是big-endian还是little-endian就两个都试一次,结果看不出来是什么有意义的字符串。考虑到可能用凯撒密码加密过,去掉非拉丁字母后反解出26个可能的文本,也都没有什么意义。看来不是ASCII编码。
考虑到2848长度是8的倍数,也可能是二进制文件,所以也big-endian和little-endian地读出来并写成二进制文件。
gnome还是比较聪明的,认出了big-endian的那个输出是一个gz压缩包。实际上,看不出来的话,也可以把文件头的3个字节丢google,
改名为bin.gz,解压得到一个叫做bin的文件。看一下
\CA\FE\BA\BE\00\00\002\00!
\00\00 \00\00\00
\00\00
\00\00\00\00\00<init>\00()V\00Code\00main\00([Ljava/lang/String;)V\00 StackMapTable \00\00 \00 \00\00\00)w-aurlwtcniewo./-t.kjhltiypioe.o/kvru.fae\00 \00\00\00 \00\00 \00i\00java/lang/Object\00java/lang/System\00out\00Ljava/io/PrintStream;\00java/lang/String\00charAt\00(I)C\00java/io/PrintStream\00print\00(C)V\00 \00\00\00\00\00\00\00\00\00\00\00 \00\00
\00\00\00\00\00\00\00\00*\B7\00\B1\00\00\00\00\00 \00 \00 \00\00
\00\00\00=\00\00\00\00\00!=)\A2\00\B2\00h)p\B6\00\B6\00\84\A7\FF\E5\B1\00\00\00\00 \00\00\00
\00\FD\00\00\F9\00\00\00\00
熟悉java的同学应该一眼就能看出这是个编译过的class文件(看不懂的也可以用jd-gui反编译),改名为bin.class,运行提示
Exception in thread "main" java.lang.NoClassDefFoundError: bin (wrong name: i)
再改名为i.class,运行得到
www.i.u-tokyo.ac.jp/fun/hikari-loveletter
另外还有版权信息的文本解密: 0x11c开始,sjis编码
哦哦哦!感觉要接近真相了。
information is conceived in letters and sounds,
and wherever sentiment and intention are found -
poetry is formed when feelings rest within consonants and vowels,
melody is born when emotion in harmony with each soul resounds.
our desire to communicate is found at the core of the information we impart,
likes or dislikes, black or white, 0 or 1, science or art -
from our eyes and our ears - our whole bodies - each part,
and, most assuredly, from each one of our hearts.
唔哦,好文艺……点next进去,有一首歌 ヒカリラブレター hikari loveletter,似乎就是海报上那个妹子唱的,还挺好听的……
反复听了几遍,当作练听力好了……嗯,其实有一段挺违和的,在2:58 - 3:01那一段,明显不是日语,而且感觉是机器合成的一样。用audacity把这段剪出来分析。
瞎搞了一番,最后的发现其实很简单:倒放reverse即可。听到的应该是xxxくれて、ありがとう(听力不好,真心听不清楚……)。
有说是慢放能听作“聞いたくれてありがとう” (谢谢倾听)。不过我是听作“いてくれて、ありがとう”(来到这里,谢谢你了),超带感的啊~
========================================接下来是2010年的==========================================
妹子还是一如既往可爱呢。
100011101110010011000010110010001110101011000010111010001100101001000000101001101100011011010000110111101101111
011011000010000001101111011001100010000001001001011011100110011001101111011100100110110101100001011101000110100
101101111011011100010000001010011011000110110100101100101011011100110001101100101001000000110000101101110011001
000010000001010100011001010110001101101000011011100110111101101100011011110110011101111001001011000010000001010
100011010000110010100100000010101010110111001101001011101100110010101110010011100110110100101110100011110010010
000001101111011001100010000001010100011011110110101101111001011011111000111011100100110000101100100011101010110
000101110100011001010010000001010011011000110110100001101111011011110110110000100000011011110110011000100000010
010010110111001100110011011110111001001101101011000010111010001101001011011110110111000100000010100110110001101
101001011001010110111001100011011001010010000001100001011011100110010000100000010101000110010101100011011010000
110111001101111011011000110111101100111011110010010110000100000010101000110100001100101001000000101010101101110
011010010111011001100101011100100111001101101001011101000111100100100000011011110110011000100000010101000110111
101101011011110010110111110001110111001001100001011001000111010101100001011101000110010100100000010100110110001
101101000011011110110111101101100001000000110111101100110001000000100100101101110011001100110111101110010011011
010110000101110100011010010110111101101110001000000101001101100011011010010110010101101110011000110110010100100
000011000010110111001100100001000000101010001100101011000110110100001101110011011110110110001101111011001110111
100100101100001000000101010001101000011001010010000001010101011011100110100101110110011001010111001001110011011
010010111010001111001001000000110111101100110001000000101010001101111011010110111100101101111100011101110010011
000010110010001110101011000010111010001100101001000000101001101100011011010000110111101101111011011000010000001
101111011001100010000001001001011011100110011001101111011100100110110101100001011101000110100101101111011011100
010000001010011011000110110100101100101011011100110001101100101001000000110000101101110011001000010000001010100
011001010110001101101000011011100110111101101100011011110110011101111001001011000010000001010100011010000110010
100100000010101010110111001101001011101100110010101110010011100110110100101110100011110010010000001101111011001
100010000001010100011011110110100011101110010011000010110010001110101011000010111010001100101001000000101001101
100011011010000110111101101111011011000010000001101111011001100010000001001001011011100110011001101111011100100
110110101100001011101000110100101101111011011100010000001010011011000110110100101100101011011100110001101100101
001000000110000101101110011001000010000001010100011001010110001101101000011011100110111101101100011011110110011
10111100100101100001000000101010001101000011001010010000001010101011011100110100101110110011001010111001001110011011
共27行,除最后一行116个数字外每行111个数字,共计3002个数字。尝试掐掉末尾转成ASCII码和二进制文件都失败了。
试着转化为图像,大致如图。
仔细观察可以发现,似乎什么东西重复了4遍……于是用kmp作check,发现第1-第623个字符重复了3次,而第四次的后面似乎有些噪声。不管它,先把1-623扣出来。
623不是8的倍数,但623=7*89,考虑到ASCII码第一位一定是0,所以每7位组成一个字符,尝试打出来。毫无结果……
等等,第一位一定是0的话,似乎这串里8的倍数的位置都是0,这样的话……莫非是最后补上一个0,然后这回是看作little-endian?尝试后依旧无果……
再等等,8的倍数的位置都是0的话,也有可能是在第一位补0,然后看作big-endian。这回结果出来了:
[jffifa@jffifa acm]$ ./t
Graduate School of Information Science and Technology, The University of Tokyo
怎么不是妹子的联系方式呢……
顺便一提,妹子的衣服叫做“十二单“,是一种极其考究的古服,有兴趣的同学可以研究一下。
有关衣服的姿势
色调搭得很漂亮啊,胡乱目测一下,这一身是表红里紫的脂烛染向蝶丸二陪织唐衣,山吹色菱纹表着——没意外的话应该是幸菱纹吧,考虑到入学是春季的关系?五衣大概是饼踟蹰,然后海赋裳,深红袴,引腰,小腰,桧扇,十二单标准配备
几张日本平安朝时期女子的服饰图。“十二单”由长袴(贴身裙裤)、小袖(白色短内衣)、单衣(小袖外)、五衣(开口处五层)、打衣(五衣外)、表着(外袍)、唐衣(最外短褂)、裳(围腰长裙)、桧扇组成。——第二张“晴之装束”貌似最接近
如何像那位姑娘一样冒出那么多名词:
首先去風俗博物館查十二単,搞清楚每个部位叫什么。
http://www.iz2.or.jp/fukushoku/f_disp.php?page_no=0000031
然后从外到内。先看唐衣。红色是表色,翻出来的领子紫色是里色。去下面两个网站查重色目:
http://www.kariginu.jp/kikata/kasane-irome.htm
http://www.bb.em-net.ne.jp/~maccafushigi/mac/7.htm
我目测是岩躑躅(3月中 男女)或者薔薇。按月份岩躑躅可能性比较大。旧历三月正好是公历的四月。
那位姑娘说的脂燭明显是把里外看反了。
其实重色目叫什么无所谓,直接说表红里紫就好。
二陪織指的是先绣一层底纹再用其他颜色绣上大的纹样。
http://www.kariginu.jp/kikata/6-1.htm
http://www.kariginu.jp/sozai/sozai4.htm
很明显大的圆形图案是向蝶。至于是不是二陪織,里纹是什么,图这么小谁看的出来呀。
http://www.otomiya.com/kamon/animal/tyo.htm
================================以下是2012年的海报(未破解)=====================================
====================================下面是2013年的海报=================================
shtml下没法右键存图,Chrome右键审查元素,拿到图像的实际地址:
拿到海报后可以尝试OCR,但是一看这对比度不行,错了一位数都可能毁灭后面的破解工作。还是丢到PS里修修看,没办法,coder就得有兼职美工+营销+策划+搬砖……杂学到瑞士军刀程度的觉悟。
识别出来一串二进制码:
0010101100101101001011010010110100101101001010110000101001111100010010010111000001110111011001110111110000001010011111000110111100101110001011100111010101111100010001010100011001001000010010010010000001001011010011100100111101010010000010100111110001100001011000110111010001101111011111000111110001111100011111000111110000100000011111000111110001111100011111000000101001111100011101010111001101110111001000010111110001010110010101100101011001010110001000000101011001010110010101100101011000001010001010110010110100101101001011010010110100101011001011010010110100101101001011010010101100101101001011010010110100101101001010110010110100101101001011010010110100101011000010100111110000100000011101010110100101101100011111000110111100100000001000000111010001111100011010000111011100111010001000000111110001100001011010110010111001111001011111000010110100111110010100110000101001111100001000000110011001110100001000000111110001010011001011010111010001101111011111000110111001110111001011110111001001111100010111110010111101100001011011110111110000101101001111100101010000001010011111000111001101100011011110010111001101111100011010010110000101101001001000000111110001101111001011100110111100100000011111000101111101110100011101000110110001111100001011010011111001010101000010100111110001110100011101010111010101100101011111000110111001101110011011100010111001111100011011110110101001101011011010010111110001101100011010110010111000100000011111000010110100111110010101100010110001011001000010100010101100101101001011010010110100101101001010110010110100101101001011010010110100101011001011010010110100101101001011010010101100101101001011010010110100101101001010110000101001111100010001110101010001100001011001000111110000001010011111000110100000101111011100110110010101111100000010100111110001101100011010000010000001110010011111000000101001111100010000110101001101110000010001100111110000001010001010110010110100101101001011010010110100101011000010100000101001010010011011110111010001100001011101000110010100100000011101000110100001101001011100110010000001100011011101010110001001100101001000000110001001111001001000000111001001100101011100000110010101100001011101000110100101101110011001110000101001010100001011000100100000101100010001010010110001010101001011000100111000101100010010010010110001010110001011000100010100101100010100100010110001010011001011000100100100101100010101000010110001011001001011000100111100101100010001100010110001010100001011000100111100101100010010110010110001011001001011000100111100001010001100100011000000110001010111100101111000110011001000000111010001101001011011010110010101110011001011100000101000001010011000010101111001011110011000100010000001101001011100110010000001110101011100000010110101100001011100100111001001101111011101110010000001101110011011110111010001100001011101000110100101101111011011100010111000001010 |
统计一下位数,一共2848位,是8的倍数,那就好办了,不管三七二十一看看ASCII再说,hankcs写的一段解码程式:
输出:
居然直接拿到了明文,也算是意外了。不过也许从另一方面来讲,也许是因为明文有足够的难度把人难倒吧。这些文字描述了什么呢?我来翻译并且解释一下。
文本分为两部分,上半部分其实是一个四阶魔方的展开图。魔方一共六个面,每个面被分为16块,每一块上标注了一个字符。其中有三条边上表明了转动方向。比如最右边的S代表如图往右旋转,最上面的E代表往下旋转(当然hankcs指的是是组合后的3d魔方的旋转)。hankcs其实根本不了解魔方,为此还专门给自己画了一个图:
下半部分是解魔方的key,也就是按照T,H,E,U,N,I,V,E,R,S,I,T,Y,O,F,T,O,K,Y,O的顺序重复一定次数n(PS:THEUNIVERSITYOFTOKYO 就是东京大学的英文全称)。这个次数n是多少呢?下面说了,是201^^3次。看到这里,估计你可能不认识201^^3,hankcs也不认识。从小到大的奥数高数没涉及到这个运算符,后来查维基百科才知道^^是超运算,201^^3 = 201201201。三个201叠在一起,这是个天文数字,宇宙中可以观测到的原子数目估计才有1080个,绝对比你在现实生活里见过的最大的数都大。
OK,题目就是这么简洁。开始干吧,为了那个啥,勇敢的少年呀快去创造奇迹吧!。
首先是解决魔方的旋转问题,这个稍有些复杂。hankcs以前没玩过魔方,为了辅助思考,于是自己拿起纸笔画了一个,首先是平面图:
然后把它叠起来就是了,请诸位睁大眼睛,纯手工高端洋气高仿日式4 x 4魔方诞生了:
(擦,这是什么奇葩玩意儿……顺便一提,昨天写code到凌晨两点半没搞定,于是今天上午把这玩意儿拿到精读教室去继续了。你能想象拿着这么蠢的东西被众人围观的心情吗?连石津先生都凑过来了……)
然后怎么办呢,拿这玩意儿旋转201^^3次吗?
当然不了,hankcs写了一段魔方程序。在开始写的时候,hankcs倾向于建立3d坐标系来完成旋转。可是这未免太小题大做了,而且魔方的面的坐标的表示方法操作性很差。于是hankcs采取了伪3d的方法,这一套东西写下来花了一个晚上和半个上午呢,如果要仔细解释的话又是一片博文的篇幅了。而这篇博文是科普向的,所以不折磨大家的眼睛了,完整的代码请跳转http://www.hankcs.com/program/magiccube.html。
有了旋转程序,剩下的就是计算201^^3次了。以下计算稍有难度,请以消遣为目的的读者朋友直接跳过看图就好了。
前文已经说过了,201^^3是个天文数字,肯定不需要计算的。一般ACM里遇到了大数,那肯定是有周期性的,最后往往求mod解决。注意到前面的密匙“THEUNIVERSITYOFTOKYO”本身就是一个周期,于是hankcs用自己的魔方程序跑了下,发现了周期。
我们定义每次旋转魔方(比如执行T)为1步,让程序按照密匙一直旋转,发现20160步后魔方还原了,那么此20160就是周期。也就是说在20160步内肯定已经破解了此魔方,假设是在第n * 20步(20是密匙的长度)的时候破解了,那么剩下的201^^3 – n * 20 步都是耍花招骗人的。由于密匙有长度20,需要将周期除一下:20160 / 20 = 1008。
问题归结于求n,由周期性可知n = 201^^3 % 1008。
hankcs并不了解数论,但是还是搜索到一个有用的公式:
(a * b) % c = ((a % c) * (b % c)) % c
看到这里hankcs明白201^^3 % 1008仍然含有一个大数,大数怎么办?还是一板斧,找周期!hankcs编写了一段程序求解201x % 1008(x = 1 …… 1024)并从中发现了周期规律:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
201
81
153
513
297
225
873
81
153
513
297
225
873
|
从第二个余开始都在重复着周期为6的周期串。hankcs并不了解数论,所以这里只是依据“现象”推断这就是一个周期串。如果读者朋友能够证明的话,请一定赐教。今天发现这个完全可以用数学归纳法证明……
那么问题进一步简化为201201 % 6 等于多少的问题。不过201201仍然是个大数,怎么办?仍然靠周期一板斧!继续用前面的程序求解201x % 6(x = 1 …… 1024)并从中发现了周期规律:
1
2
3
4
5
6
7
8
9
10
|
3
3
3
3
3
3
3
3
3
3
|
这下不用我说明了,201x % 6 = 3是板上钉钉的事情了。
于是201^^3 % 1008 = 第一个列表中第 (201x % 6 – 1) % 6 + 1 = 2 个数(先减一后加一是因为周期从第二个数开始),也就是153,n = 153 !没有严密的证明,浪人的剑法只要夺命就好了。
于是重复153次密匙,也就是旋转153 * 20 = 3060 步就能破解魔方,将3060代入魔方程序解出最终结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
看来谜题的答案就是让我Follow the link. http://www.is.s.u-tokyo.ac.jp/ist_ueno_yuuka ,于是hankcs复制此url到地址栏回车,结果看到:
这句话的意思是,已结束这个页面的公开展示。想想也不奇怪,海报是5月份贴出来的,现在都11月份了。反正我破解了这个谜题,这就是我要的结果。
昨天晚上开始熬夜到2点,上午精读课上终于解明此题的时候,hankcs简直要无视讲台上的石津先生狂笑起来。也许这个简陋的画面对hankcs来说,胜于一切红颜: