zoukankan      html  css  js  c++  java
  • 西邮Linux兴趣小组2016免试题

    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码么?老套路试试。

     老套路无果,因为这串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)-----------------------------------------------------------------

  • 相关阅读:
    Python使用QRCode模块生成二维码
    C++ STL中允许重复key的multimap
    C++ STL中Map的按Value排序
    C++ STL中Map的按Key排序
    C++ String和其他类型互换
    android studio
    加快android studio 编译速度(已更新至Android Studio 3.3.1)
    解决Installation failed with message Failed to finalize session : INSTALL_FAILED_INVALID_APK的问题
    Android 自定义Dialog 去除阴影
    FFmpeg(14)-使用NDK、C++完成EGL,display, surface, context的配置和初始化
  • 原文地址:https://www.cnblogs.com/corvoh/p/5375660.html
Copyright © 2011-2022 走看看