1
切記,這只是“指南”,沒有一勞永逸,沒有舒適區。
[圖片上傳失敗...(image-b1f77c-1509644653387)]](http://upload-images.jianshu.io/upload_images/2558748-9c11c1cfd710240a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
時隔一年,2017,看到西郵 Linux 興趣小組再出新一度的免試題,不免回想起去年大一的自己的經歷,雖然當時很多關卡都是學長所指點,也依舊收獲滿滿。這里貼上去年的免試題之我的攻略,作為給大一同學的小科普:
如果問我為什么要寫攻略的話~
- 讓大家面對這種套路的免試題不再迷茫。
- 鼓勵 Linux 興趣小組再創新第一個提出發布免試題的學長最棒
如果問我今年的攻略在哪里的話~
- 你為什么不自己好好挑戰一下呢?2017 免試題
- 大一寫攻略的接力棒,我想傳遞給你~
2
以下是我去年的攻略原文,曾發布在博客園。
4.28 的宣講會圓滿結束(就在寫這段話之前不久),對于西郵Linux興趣小組這一次納新,身為局外人表示:還是有歷史,還是會玩,還是厲害哈。
華麗的分割線里面是自己之前的攻關戰略,最后補充了宣講會上學長的解釋,屬于自己的攻關過程之外,但值得記錄。
以下攻關內容敘述角度模擬一個人單獨挑戰時的思考,實則我是在各種指點下與學長共同完成的。。
因此,感謝幫我的學長,還有下方評論區的伙伴@奧爾德賽,對于技術,我們永遠是朋友。
FREE OPEN SHARE
自己的攻關經歷
4月伊始,西郵Linux小組為五月納新進入了前期宣傳階段,免試題一放出,引來各個熱愛技術的同學熱情挑戰。 免試題入門可從西郵Linux小組官網中戳入,或直接點西郵Linux小組2016免試題進入。
本想著從百度進入免試題入口,卻意外發現2013年曾有外校學生寫過13年的免試題攻略,對小組免試題考察風格有了初步的了解。詳見西郵Linux小組2013免試題+繼續之戰。
第一關
首頁如圖所示,看見START,就立刻戳了進去。
進去后是一張背景圖片,中間寫著2006的年份(西郵Linux興趣小組2006年建立),點擊后變成2007,再點擊變成2008……到2015年后點擊會重新跳到2006。那線索說不定在這里,如果能點出今年——2016,或許會有所發現。 打開源代碼,在有關2015的源碼下發現
<input type="hidden">
隱藏域,value值為2006,因此點擊2015后會重新回到2006的界面,而2006的界面源碼隱藏域value的值為2007…… 看來要出現2016的字樣,就需要傳遞2016的value值,在任意年份的頁面中將源碼中隱藏域value改成2016后提交看看:
<input type="hidden" name="year" value="2006"></input>
修改后點擊年份,不出所料,成功過關!
P.S:點擊START之前的頁面源碼中也有相同隱藏域且value=2006,點擊START之后跳到2006的界面中,更加證明了第一關需要出現的2016和該<input>
有關。 而在START頁面將value直接修改成2016后點擊START會怎么樣?結果直接到了第二關!
第二關
一段名言、一副梵高作的《星空圖》和背景的彈琴聲是進入第二關首先注意到的三大線索。再沒有其它什么顯示的,那么應該還需要到源碼里面看看。
分析源碼,發現名言、圖片之外,背景音樂所用的<audio>
標簽多了一個,應該不會平白出現的,如圖,沒怎么接觸過音頻文件,不知道是.3gpp格式和.eop格式哪個是多余的。
復制該鏈接,全部下載出來,發現.3gpp就是背景音樂可以直接播放,而.eop沒有相關軟件可以打開。 百度 .eop格式 發現這需要拿鍵盤鋼琴軟件Everyone Piano打開,下載并打開之。 果然,這個源碼中沒用到的.eop文件用Everyone Piano打開后在鍵盤中敲出了線索————一個網址:
第三關
跟著琴聲來到第三關,一部還看不懂的微電影和一串01碼,對于01碼,西郵Linux興趣小組2013年免試題第一關不就是這個01碼么?老套路試試。
老套路無果,因為這串01和13年不同的是,中間有空格,莫非是摩爾斯電碼?寫一個小程序把0和1變成點和橫杠再用在線翻譯器翻譯,發現第四關的入口鏈接——182.254.246.154。
如果翻譯成亂碼的話,是好事,只需改一下編碼格式就好。這關打過去時間長了,當時好像用的是base64解碼的。
第四關
怪不得納新群之前有人說K炸,我還水了一句王炸。原來是他早已經打到這一關了,好可怕。
亂提交了一些發現并無用,源碼里也毫無破綻,目瞪口呆之際盯著K玩,發現了一個神奇的現象——除了第三張方片國王是褐色胡子的中年人外,剩余三個國王都是白胡子老頭!難道有貓膩,下載第三個圖片之。下載出來后聽說有一種叫“圖種”的制作技術,可以將rar壓縮文件和一張圖片合并起來顯示為一張圖。那這張圖或許就是用圖種制作器做出來的——把這張圖片名字3.png改為3.rar發現正是一個壓縮文件~
如上圖所示,壓縮文件里面放著1.txt,拉出來名稱改成1.exe后發現……是一個貪吃蛇游戲!過關再說。
一閃一閃的速成貪吃蛇游戲終于熬到了第四關,果然出現了
IMPORTANT MESSAGE:VHUUEFUDIXQHU
WHAT??!返回王炸的網頁,在輸入框輸下VHUUEFUDIXQHU后居然還是沒反應,那你還IMPORTANT! 好吧,肯定有出路的,不過我暫時就卡在了這里……
博客園評論區
評論區伙伴說該輸入FREEOPENSHARE,果然到了第5.1關,也是可以從網址直接跳的。
自己的第一反應還是看源碼,發現這是用HTML5的Canvas畫布編寫,由于自己從HTML+CSS直接跳至PHP服務端開發,之前沒怎么深入了解過JavaScript,有些吃力。
但好歹現在也學C,并且JS也是面向對象的腳本語言,根據變量名還是能讀出一些寓意的,如圖所注釋:
然而這時離宣講會開始只剩一小時了,來不及思考了,要開車。
看完宣講會官方攻略后的補充
官方詳解如下,和自己的這篇博客相比的話各有優點哦:
其中,第五大關解題源碼如下:
#include <iostream>
#include <cstring>
#include <math.h>
#include <cstdio>
using namespace std;
const int N = 25;
int dp[N][N][N][N];
int a[N][N];
int fa[2][N*N] = {};
char ans[2][100];
char str[10000];
int main()
{
cin>>str;
int len = strlen(str);
int row, col;
row = col = 0;
int num = 0;
//將方格數據轉化為矩陣
for(int i=0; i<len; i++)
{
if(str[i] >= '0' && str[i] <= '9')
{
num = num * 10 + str[i] - '0';
}
else if(i > 0 && str[i-1] >= '0' && str[i-1] <= '9')
{
if(str[i] == ']')
{
a[row][col] = num;
num = 0;
if(str[i+1] != ']')
{
col++;
row = 0;
}
}
else if(str[i] == ',')
{
a[row][col] = num;
row++;
num = 0;
}
}
}
int n = col;
//動態規劃
for(int i=1; i<=row; i++)
for(int j=1; j<=col; j++)
for(int k=1; k<=row; k++)
for(int l=1; l<=col; l++)
{
int mx = 0;
if(mx < dp[i-1][j][k-1][l])
{
mx = dp[i-1][j][k-1][l];
}
if(mx < dp[i-1][j][k][l-1])
{
mx = dp[i-1][j][k][l-1];
}
if(mx < dp[i][j-1][k-1][l])
{
mx = dp[i][j-1][k-1][l];
}
if(mx < dp[i][j-1][k][l-1])
{
mx = dp[i][j-1][k][l-1];
}
if(i == k && j == l)
dp[i][j][k][l] = mx + a[i][j];
else
dp[i][j][k][l] = mx + a[i][j] + a[k][l];
}
cout<<"the ans = "<<dp[row][col][row][col]<<endl;
//逆推得到路徑
int cnt = 0;
int i=row, j=col, k=row, l=col;
while(1)
{
if(i == 1 && j == 1 && k == 1 && l == 1)
break;
dp[i][j][k][l] -= a[i][j];
if(i != k || j != l)
dp[i][j][k][l] -= a[k][l];
if(dp[i][j][k][l] == dp[i-1][j][k-1][l])
{
ans[0][cnt] = 'U';
ans[1][cnt] = 'D';
cnt++;
i--;k--;
}
else if(dp[i][j][k][l] == dp[i-1][j][k][l-1])
{
ans[0][cnt] = 'U';
ans[1][cnt] = 'R';
cnt++;
i--;l--;
}
else if(dp[i][j][k][l] == dp[i][j-1][k-1][l])
{
ans[0][cnt] = 'L';
ans[1][cnt] = 'D';
cnt++;
j--;k--;
}
else
{
ans[0][cnt] = 'L';
ans[1][cnt] = 'R';
cnt++;
j--;l--;
}
}
//輸出路徑
cout<<"load_one > ";
for(int i=0; i<cnt; i++)
cout<<ans[0][i]<<" > ";
cout<<"end"<<endl;
cout<<"load_two > ";
for(int i=cnt-1; i>=0; i--)
cout<<ans[1][i]<<" > ";
cout<<"end"<<endl;
return 0;
}
3
讀完后,還可以看看前幾個月的百度前端技術學院熱身賽之我的攻略,你就知道為什么我說這是“套路”了~
也可以參考純 URL 過關的智力游戲:Nazo_Game 找找靈感
4
- Hello,我是韓亦樂,現任本科軟工男一枚。軟件工程專業的一路學習中,我有很多感悟,也享受持續分享的過程。如果想了解更多或能及時收到我的最新文章,歡迎訂閱我的個人微信號:韓亦樂。我的簡書個人主頁中,有我的訂閱號二維碼和 Github 主頁地址;我的知乎主頁 中也會堅持產出,歡迎關注。
- 本文內部編號經由我的 Github 相關倉庫統一管理;本文可能發布在多個平臺但僅在上述倉庫中長期維護;本文同時采用【知識共享署名-非商業性使用-禁止演繹 4.0 國際許可協議】進行許可。