西郵Linux興趣小組2016免試題

4.28的宣講會圓滿結束(就在寫這段話以前不久),對於西郵Linux興趣小組這一次納新,身爲局外人表示:仍是有歷史,仍是會玩,仍是厲害哈。html

華麗的分割線裏面是本身以前的攻關戰略,最後補充了宣講會上學長的解釋,屬於本身的攻關過程以外,但值得記錄。linux

如下攻關內容敘述角度模擬一我的單獨挑戰時的思考,實則我是在各類指點下與學長共同完成的。。ios

所以,感謝幫個人學長,還有下方評論區的夥伴@奧爾德賽,對於技術,咱們永遠是朋友。小程序

FREE OPEN SHAREide

 

-------------------------------------------------------------------本身的攻關經歷分割線(START)-----------------------------------------------------------------------ui

 

4月伊始,西郵Linux小組爲五月納新進入了前期宣傳階段,免試題一放出,引來各個熱愛技術的同窗熱情挑戰。 
免試題入門可從西郵Linux小組官網中戳入,或直接點西郵Linux小組2016免試題進入。編碼

本想着從百度進入免試題入口,卻意外發現2013年曾有外校學生寫過13年的免試題攻略,對小組免試題考察風格有了初步的瞭解。詳見西郵Linux小組2013免試題+繼續之戰spa

 

第一關

首頁如圖所示,看見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>

修改後點擊年份,不出所料,成功過關!3d

P.S:點擊START以前的頁面源碼中也有相同隱藏域且value=2006,點擊START以後跳到2006的界面中,更加證實了第一關須要出現的2016和該<input>有關。 
而在START頁面將value直接修改爲2016後點擊START會怎麼樣?結果直接到了第二關! 

 

第二關

一段名言、一副梵高做的《星空圖》和背景的彈琴聲是進入第二關首先注意到的三大線索。再沒有其它什麼顯示的,那麼應該還須要到源碼裏面看看。 

分析源碼,發現名言、圖片以外,背景音樂所用的<audio>標籤多了一個,應該不會平白出現的,如圖,沒怎麼接觸過音頻文件,不知道是.3gpp格式和.eop格式哪一個是多餘的。 

複製該連接,所有下載出來,發現.3gpp就是背景音樂能夠直接播放,而.eop沒有相關軟件能夠打開。 
百度 .eop格式 發現這須要拿鍵盤鋼琴軟件Everyone Piano打開,下載並打開之。 
果真,這個源碼中沒用到的.eop文件用Everyone Piano打開後在鍵盤中敲出了線索————一個網址: 
 
www.dreamchasinger.cn/movie/ !

 

第三關

跟着琴聲來到第三關,一部還看不懂的微電影和一串01碼,對於01碼,[西郵Linux興趣小組2013年免試題](http://www.cnblogs.com/ma6174/archive/2013/05/04/3058889.html)第一關不就是這個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! 
好吧,確定有出路的,不過我暫時就卡在了這裏……

 

-------------------------------------------------------------------本身的攻關經歷分割線(END)-----------------------------------------------------------------------

 

-------------------------------------------------------------------評論區(START)-----------------------------------------------------------------------------------

評論區夥伴說該輸入FREEOPENSHARE,果真到了第5.1關,也是能夠從網址直接跳的。

 本身的第一反應仍是看源碼,發現這是用HTML5的Canvas畫布編寫,因爲本身從HTML+CSS直接跳至PHP服務端開發,以前沒怎麼深刻了解過JavaScript,有些吃力。

 但好歹如今也學C,而且JS也是面向對象的腳本語言,根據變量名仍是能讀出一些寓意的,如圖所註釋:

 

然而這時離宣講會開始只剩一小時了,來不及思考了,要開車。

-------------------------------------------------------------------評論區(END)-------------------------------------------------------------------------------------

 

-------------------------------------------------------------------看完宣講會官方攻略後的補充(START)--------------------------------------------------------------

官方詳解以下,和本身的這篇博客相比的話各有優勢哦:

    西郵Linux興趣小組2016免試題詳解(一)

    西郵Linux興趣小組2016免試題詳解(二)

其中,第五大關解題源碼以下:

#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;
}

-------------------------------------------------------------------看完宣講會官方攻略後的補充(END)-----------------------------------------------------------------

相關文章
相關標籤/搜索