抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

题目标题:big data
题目描述:要吐就去wc,合并起来吐哦亲。
题目附件:bigdata.7z

看题目就知道是要用到很大的数据了,其实这道题说难不难,说简单也不简单。
首先下载题目的附件,发现有150.85Mb。

我用的是MacOS系统,安装p7zip后用以下命令解压7z压缩包:

1
7za x bigdata.7z

下面是终端输出的解压信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Extracting  0/0/1/0/3/1/3/3/400
Extracting 0/0/2/0/2/2/5/6/401
Extracting 0/0/0/2/3/5/1/3/402
Extracting 0/1/0/0/3/4/3/3/403
Extracting 0/1/2/0/2/5/4/0/404
Extracting 0/0/0/0/0/3/5/1/405
Extracting 0/1/1/1/3/5/5/2/406
Extracting 0/0/2/1/3/5/6/7/407
Extracting 0/1/0/1/1/3/0/0/408
Extracting 0/1/0/0/0/4/1/6/409
Extracting myboyfriend.png

......

Folders: 46233
Files: 11
Size: 503091348
Compressed: 158023104

感觉很牛B的样子,150多M的压缩包解压后有500多M,包含了46233个文件夹和11个文件。
其中有一张名为myboyfriend.png的图片,还有10个文件,每个文件有50多M。

先打开图片看一下,居然是一张很猥琐的图片:
This is a picture without description

看来题目的提示就是Python image steganography了。
Google一下关键字,点开第一个链接《Stepic》
看介绍说是Python的图片隐写术,也就是把一些信息隐藏在图片里的技术。

按照官方教程先安装Stepic:

1
easy_install stepic

然后提取图片里的隐藏信息:

1
stepic --decode --image-in=myboyfriend.png --out=tips

执行后在目录下生成了一个tips文件,用MacVim打开文件,查看内容:

1
<tip>&#26377;10&#20010;&#20307;&#31215;&#36739;&#22823;&#30340;&#25991;&#26412;&#25991;&#20214;&#38543;&#26426;&#25955;&#33853;&#22312;&#25991;&#20214;&#22841;0&#30340;&#23376;&#30446;&#24405;&#20013;&#65292;&#25991;&#20214;&#20869;&#23481;&#20026;&#33521;&#25991;&#21333;&#35789;&#65292;&#35831;&#32479;&#35745;&#20986;&#36825;10&#20010;&#25991;&#20214;&#20013;&#20986;&#29616;&#27425;&#25968;&#26368;&#22810;&#30340;&#21333;&#35789;&#21644;&#20986;&#29616;&#27425;&#25968;&#26368;&#23569;&#30340;&#21333;&#35789;&#36824;&#26377;&#20182;&#20204;&#23545;&#24212;&#30340;&#20010;&#25968;&#65292;&#36830;&#25509;&#36215;&#26469;&#23601;&#26159;key&#12290;&#20363;&#22914;&#65306;&#20986;&#29616;&#27425;&#25968;&#26368;&#22810;&#30340;&#21333;&#35789;&#20026;max&#65292;&#27425;&#25968;&#20026;100,&#20986;&#29616;&#27425;&#25968;&#26368;&#23569;&#30340;&#21333;&#35789;&#20026;min&#65292;&#27425;&#25968;&#20026;1,&#37027;&#20040;key&#20026;maxmin1001.</tip>

貌似是html编码,用浏览器打开tips,就能看到文字了:

有10个体积较大的文本文件随机散落在文件夹0的子目录中,文件内容为英文单词,请统计出这10个文件中出现次数最多的单词和出现次数最少的单词还有他们对应的个数,连接起来就是key。例如:出现次数最多的单词为max,次数为100,出现次数最少的单词为min,次数为1,那么key为maxmin1001.

好吧,看来要去wc吐了。
看一下前面的压缩包解压信息,10个文件就藏在这些文件夹里:

1
2
3
4
5
6
7
8
9
10
Extracting  0/0/1/0/3/1/3/3/400
Extracting 0/0/2/0/2/2/5/6/401
Extracting 0/0/0/2/3/5/1/3/402
Extracting 0/1/0/0/3/4/3/3/403
Extracting 0/1/2/0/2/5/4/0/404
Extracting 0/0/0/0/0/3/5/1/405
Extracting 0/1/1/1/3/5/5/2/406
Extracting 0/0/2/1/3/5/6/7/407
Extracting 0/1/0/1/1/3/0/0/408
Extracting 0/1/0/0/0/4/1/6/409

怎么把这些文件拼在一起呢?3条命令就搞定了:

1
2
3
4
5
6
7
8
# 进入名字为0的文件夹。
cd 0

# 搜索出当前目录下所有以"40"开头的文件,移动到0文件夹里。
mv $(find ./ -name 40*) ./

# 把0文件夹里这10个文件按顺序合并到bigdata文件里。
for i in {400..409}; do cat $i >> bigdata; done

执行后生成了一个名为bigdata的文件,这样就成功把10个文本拼接起来了。
用MacVim打开bigdata,发现有2600多万行:
This is a picture without description

观察发现,每一行可能有多个单词,每个单词之间用制表符(\t)隔开。
下面是自动统计单词个数的pyhon代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#coding:utf-8

from collections import Counter

if __name__ == "__main__":

# 读取bigdata文件所有行
bigdata = open("bigdata")
lines = bigdata.readlines()

# 分割出每一行的单词放到words数组里面
words = []
for x in lines:
words.extend(x.strip().split("\t"))

# 统计出次数最多和最少的单词和次数
c = Counter(words)
max = c.most_common(1)[0]
min = c.most_common(len(c.keys()))[-1]
print("key : %s%s%s%s"%(max[0], min[0], max[1], min[1]))

在终端执行这个脚本,占用4G多内存,跑了60多秒,终于出现了答案:

1
key : Landsatproscriptions633444

评论