微信号:hellojavacases

介绍:分享Java问题排查的Case、Java业界的动态和新技术、Java的一些小知识点Test,以及和大家一起讨论一些Java问题或场景,这里只有Java细节的分享,没有大道理、大架构和大框架.

内部的一次编程比赛

2014-09-18 10:41 bluedavy

中间件团队举办了一次内部的编程比赛,个人觉得还是挺有意思的,把题目分享给大家,感兴趣的同学可以自己写着玩玩,之后也会把比赛最后成绩NB的人的优化思路分享给大家。


题目叫码农来搬砖,题目的要求为:

  1. 实现一个客户端和一个服务器端,客户端把服务器端的一个1G的文件搬到客户端,文件中的每行字符串为一块砖头,字符串由随机的ascii32-127的字符组成,每行的长度为随机的1-200字节;

  2. 服务端必须是单进程并且只能监听一个端口;

  3. 客户端每个发起获取砖头的请求“线程“必须是一问一答,类似这样:

    砖头 result = client.getZhuanTou();

  4. 服务端收到请求后,必须是按顺序获取下一块砖头,类似这样:

    砖头 next = server.getNext();

    不允许批量处理请求,也不允许服务端处理请求的”线程“批量返回砖头,服务端处理请求的”线程“每次只能处理一个请求,并返回一块砖头;

  5. 服务端或客户端需要对砖头进行处理,处理方式为去掉行中间的三分之一字符(从size/3字符开始去掉size/3个字符,除法向下取整)后将剩余部分以倒序的方式传输 例如 123456789 => 123789 => 987321

  6. 每块砖头需要标上序号,例如上面的123456789是第5行,那么最后的砖头结果应该为:5987321;

  7. 客户端需要顺序的输出最终处理过的砖头内容到一个文件中,此文件中的砖头的顺序要和服务端的原始文件完全一致,文件不需要写透磁盘(例如java里就是可以不强制调sync);

  8. 不允许采用内核层面的patch;

  9. 不建议采用通信框架,例如netty之类的这种;

  10. 不限语言、通信协议和连接数。


比赛的运行方式:

服务端启动5s后启动客户端,客户端启动就开始计时,一直到客户端搬完所有砖头并退出计算为耗时时间;

每次启动前清除pagecache。


内部最终有很多的同学参加了这次比赛,最终跑出的结果完全超出了我的想象,大家的优化都非常棒,让我学习到了很多。


我个人对这次比赛的意义的定位是普及通信领域的技术知识,并让大家玩的开心,这次比赛时间非常紧张,有不少同学为此放弃了中秋休假,我相信这些同学不是为了奖品,而纯粹是觉得玩的开心,我自己认为这是典型的程序员品质,:)


我几年前曾经想过做一个编程pk类的网站,上面有各种题目,然后大家只需要上传代码就会自动告诉结果,并更新是否闯入前10,后来由于各种原因这个网站没搞起来,后面看来还是要想办法搞起这个网站,喜欢玩这类的同学还是挺多的。


如果想自己玩这道题目但对题目意思还不是很确定的,可以直接回复下,我来解答,:)


=============================

欢迎关注微信公众号:hellojavacases


关于此微信号:

分享Java问题排查的Case、Java业界的动态和新技术、Java的一些小知识点Test,以及和大家一起讨论一些Java问题或场景,这里只有Java细节的分享,没有大道理、大架构和大框架。


公众号上发布的消息都存放在http://hellojava.info上。


 
HelloJava 更多文章 说说令人头疼的Jar包管理 两起“蝴蝶效应”Cases 万恶的swap 关于Java启动时的速度 一行代码引发的杯具
猜您喜欢 用函数式的 Swift 实现图片转字符画的功能 如何在 Swift 中进行错误处理 自由测试人<Jarodd> 带着手机性能测试神器工作的一天 除了JS代码,还有哪些方法能让用户秒到限量月饼 致程序员爸爸