4.28的宣講會圓滿結束(就在寫這段話之前不久),對於西郵Linux興趣小組這一次納新,身為局外人表示:還是有歷史,還是會玩,還是厲害哈。
華麗的分割線里面是自己之前的攻關戰略,最后補充了宣講會上學長的解釋,屬於自己的攻關過程之外,但值得記錄。
以下攻關內容敘述角度模擬一個人單獨挑戰時的思考,實則我是在各種指點下與學長共同完成的。。
因此,感謝幫我的學長,還有下方評論區的伙伴@奧爾德賽,對於技術,我們永遠是朋友。
FREE OPEN SHARE
-------------------------------------------------------------------自己的攻關經歷分割線(START)-----------------------------------------------------------------------
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打開后在鍵盤中敲出了線索————一個網址:
www.dreamchasinger.cn/movie/ !
第三關
跟着琴聲來到第三關,一部還看不懂的微電影和一串01碼,對於01碼,[西郵Linux興趣小組2013年免試題](http://www.cnblogs.com/ma6174/archive/2013/05/04/3058889.html)第一關不就是這個01碼么?老套路試試。
第四關
怪不得納新群之前有人說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)--------------------------------------------------------------
官方詳解如下,和自己的這篇博客相比的話各有優點哦:
其中,第五大關解題源碼如下:
#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)-----------------------------------------------------------------