代码挑战“ Vrolijke Framboos”事后验尸

星期二,我们在JDriven举行了第二次“ Vrolijke Framboos”(快乐树莓的荷兰语)Java代码挑战赛 ,这是爆炸性的! 今年的挑战是创建一个REST服务客户端,该客户端将与服务器一起玩猜数字游戏。 设置会话后,您会猜到一个数字,服务器将以“较低”,“较高”或“宾果”响应。 目标是在两分钟内猜出尽可能多的数字。 给定挑战的名称,您可能会猜到目标平台将是Raspberry Pi !

这是一次令人难以置信的有趣体验,在这篇文章中,我想解释一下我是如何应对挑战的,而我的解决方案最终是如何获得第二名的,这让我只是错失了将奖杯和新树莓带回家的机会。

制备

从上一期挑战中我所知道的(不幸的是,这并不是我的一部分),我们必须提供一个可运行的jar,该jar将在树莓上执行。 我通过设置一个空的Maven项目来进行准备,该项目将其自身及其依赖项组装到一个胖的jar中,该胖的jar可通过java -jar <jarfile> .jar从命令行运行。 我还包括了一堆我甚至没有使用过的标准依赖项(Log4j,Junit,Guava)。

执行

当我们被解释为将通过发布请求与REST服务进行通信时,我首先添加了Apache HTTP客户端( 流畅的API很好!),并为该客户端添加了Jackson。

我还使用了一个现有的Spring Boot REST测试项目来添加我自己的服务器模拟版本,因为直到截止日期前30分钟我们才可以使用该服务器。 我花了相当多的时间来创建服务器端点,以便我的客户可以和别人交谈。

在服务器就位的情况下,我实现了客户端接口。 使用Jackson + Apache HTTP客户端,这非常简单。 一个例子:

public GuessResponse guess(GuessRequest req)  throws IOException  {String result = Request.Post(baseUrl + "/api/numbergame").bodyString(toJson(req), ContentType.APPLICATION_JSON).execute().returnContent().asString();return mapper.readValue(result, GuessResponse.class);
}

这是进行猜测的REST调用; 非常简单!

算法

该操作的“大脑”是一个Worker线程,该线程不断启动新游戏,并且在游戏内使用简单的二进制搜索来尽快向下钻取正确的猜测。 通过伪查询中的二进制搜索来猜测数字是:

low_bounds = 0
high_bounds = 2^63
loop:pivot = low_bounts + (high_bounds - low_bounds / 2)guess = guess(pivot)if guess == "lower":high_bounds = pivot - 1else if guess == "higher":low_bounds = pivot + 1else if guess == "bingo"return pivotelsethrow Error

典型的复杂度是O(log n),比O(n)蛮力好得多。

我的第一个实现使用2 ^ 31的上限,但是我很快发现服务器正在分发更高的数字。

最佳化

通过基本的实现工作,我开始尝试优化解决方案,因为我想我不是唯一一个使用binsearch实现的人。 我的第一个猜测是通过让多个工人同时玩游戏来并行化工作。 效果很好; 似乎最大的瓶颈是HTTP往返,转移到8个线程使我大大提高了速度。

不幸的是,当截止日期临近时,我听说实际的比赛只能允许一个会话进行,所以我的方法行不通。 我花了很多时间试图找到一种方法来让多个线程处理该问题,以尝试规避HTTP开销,但是不幸的是,我没有时间提出解决方案。

比赛时间

我们提交了解决方案(在20位左右的参赛者中,我们大约有13种实现方案),而我的同事Pepijn开始运行它们。 该服务器具有非常整洁的报告功能,可向我们实时显示得分!

某些解决方案根本不起作用,但一堆却不能,而且很快! 我进入前三名的机会确实开始变得渺茫了。 我的提交实际上是最后一次执行,因此必须等待,这真让人不知所措。 当他们最终运行我的解决方案时,它比我期望的运行速度要快得多,这是基于我看到的运行自己的机器的速度。 这显然是由于树莓派和服务器之间的有线连接。

所有解决方案都运行了2分钟,我以556个正确的猜测最终排名第二。 数字1(由里卡多提交)是714,数字3是289,所以我对结果非常满意!

验尸

这是一个了不起的夜晚,当我们接到任务后,看到每个人都进入极端聚焦模式真是太有趣了。 我们大多数人浪费很少的时间(如果有的话)吃披萨,而是非常努力地工作以找到可行的解决方案。

对我来说很好的是

  • 准备 :必须拥有一个IDE,该IDE的一个空项目已经准备好构建到jar中。 进行这样的设置不需要花费很多时间,但是当您的总时间约为2-3小时时,那15分钟非常有价值!
  • 算法 :我的二进制搜索方法效果很好,特别是与某些人采用的蛮力方法相比。 最初,我以为他们会使用整个“ int”搜索空间,但是我很快就知道这实际上是一个“ long”搜索空间。 蛮力根本不会削减它。
  • 关注速度 :我没有为单元测试或使用getter / setter创建适当的Java POJO而烦恼。 CheckStyle用我的代码会心脏病发作。 重要的是使其正常运行。
  • 删除调试语句 :System.out非常昂贵! 有些人忘了删除紧密循环中的打印内容,这会大大降低您的应用程序的速度。 我的只报告了猜测的数字。

本来可以更好的

  • 准备 :尽管我设置了IDE,但我不知道我会实现模拟REST服务。 如果我可以使用Node.js之类的东西和基本的REST服务,那么我将在客户端集成方面取得很大进步。
  • 专注于多线程 :最终没有成功的赌博。 会话系统将不允许执行并行游戏,并且二进制搜索实际上并不能很好地并行化。
  • 缺乏对搜索空间的关注 :我认为0到2 ^ 63之间的完整空间是可以猜测的,但是很明显,当我们开始比赛时,它总是在猜测非常高的数字。 如果我创建了第一个测试结果的直方图,我可能会发现分布根本不均匀。 我本可以使下限和上限适应所找到的数字。
  • 缺乏对HTTP开销的关注 :我没有时间去寻找如何通过例如保持连接打开来减少HTTP开销的方法。 回想起来,这可能会有很大的不同。

结论

这是我的第一个代码的质询/ hackaton我参加了,这是这么多的乐趣,我可以把它推荐给任何人。 在竞争激烈的环境中编码与您的日常工作有很大不同。 这要更加激烈,因此每个人都直接进入“区域”,而实际上您的生产力非常高。 这个“区域”对我来说是个快乐的地方,相当让人上瘾。 缺点是我被大肆宣传,甚至无法入睡。 我写这篇文章的主要原因是 把它从我的脑子里弄出来;)

翻译自: https://www.javacodegeeks.com/2015/07/code-challenge-vrolijke-framboos-postmortem.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子门锁没电的解决办法

导读:今天对象回家,输入电子门锁密码怎么也打不开,指示灯也不亮,前段时间也时不时的能按,我就预感到电池没电了,那么我是如何进入家门的呢? 一般这种电子门锁可以输入密码,也可以使用机械钥匙。说实话,这钥匙在哪我压根没见过,租的房子,房东都不知道,只能输入密码才…

oracle学习笔记系列------oracle 基本操作之表的增删改查

--创建一个表 CREATE TABLE employee_souvc(id NUMBER(4),name VARCHAR2(20),gender CHAR(1),birth DATE,salary NUMBER(6,2),job VARCHAR2(30),deptno NUMBER(2) ); --DESC table_name:查看表结构,看到表的列的名字&#xff0c;以及对应的类型&#xff0c;长度等 DESC employe…

【前端笔试题】文本居中的几种小技巧

前端面试或者开发总会遇到是文本居中的情况及场景,这里一起总结一下。便于查找和使用。 目录 方法一 方法二 方法三 方法四 方法一 自动外边距 div #container{margin-left:auto;margin-right:auto;width:168px;} 方法二 使用text-align body{text-align:center;}

计算机专业常用图论,同等学力申硕计算机专业--数学公式集合(新增学习笔记)...

组合数学部分&#xff1a;基础公式&#xff1a;定义:从n个不同的元素中, 取r个并按次序排列, 称为从n中取r个的一个排列, 全部这样的排列数记为P(n, r).定义: 从n个不同的元素中, 取r个但是不考虑次序时候, 称为从n中取r个的一个组合, 全部这样的组合总数记为C(n, r).定义: 从n…

使用Ubuntu22+Minikube快速搭建K8S开发环境

安装Vmware 这一步&#xff0c;可以参考我的如下课程。 安装Ubuntu22 下载ISO镜像 这里我推荐从清华镜像源下载&#xff0c;速度会快非常多。 下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04.3/ 如果你报名了我的这门视频课程&#xf…

linux内核分析——扒开系统调用的三层皮(上)

20135125陈智威 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 系统调用&#xff1a;库函数封装了系统调用&#xff0c;通过库函数和系统调用打交道 用户态&#xff1a;低级别执行状态&#xff0c;代码的掌控范围会受到限…

前端常见浏览器兼容性问题及解决办法

不同浏览器的内核也不尽相同&#xff0c;所以各个浏览器对网页的解析存在一定的差异。 1.不同浏览器的标签默认的外补丁和内补丁不同 *{ margin:0; padding:0; } 2. 块属性标签float后&#xff0c;又有横行的margin情况下&#xff0c;在IE6显示margin比设置的大 style{ disp…

unchecked异常_为什么要在Java中使用Unchecked异常而不是Checked异常

unchecked异常关于检查与未检查的异常的争论可以追溯到过去。 有人说这是Java包含的最佳功能之一。 其他人则说这是他们最大的错误之一[ 1 ]。 辩论似乎结束了。 在这篇文章中&#xff0c;我将尝试包含涉及该主题的文章和书籍的链接。 我不是专家&#xff0c;但是我会尽力向您解…

微型计算机系统中的内部寄存,微机原理与接口技术习题集汇总.doc

微机原理与接口技术习题集汇总.doc (50页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;29.9 积分&#xfeff;.word格式,第二章 微机基本组成及工作原理1.1微型机的基本结构一、单项选择题1&#xf…

10个对Web开发者最有用的Python包

Python最近成为了开发人员最喜欢的语言之一。无论你是专业的&#xff0c;业余的&#xff0c;还是一个初学者&#xff0c;你都可以从Python语言及其程序包中受益。Python已经被证明是当今最具活力的面向对象的编程语言之一。这就是为什么即使是世界顶级公司也广泛使用这种语言的…

移动端适配的几种解决办法

所谓移动端适配,就是WebApp在不同尺寸的屏幕上等比显示 原则 开发时方便,写代码时设置的值要和标注的 160px 相关方案要适配大多数手机屏幕,并且无 BUG用户体验要好,页面看着没有不适感思路 写页面时,按照设计稿写固定宽度,最后再统一缩放处理,在不同手机上都能用按照设…

真正释放Maven和Java EE的强大功能

如果野心和愿景太复杂而无法使用&#xff0c;那么它们可能会毁灭伟大的解决方案。 尽管Maven和Java EE是在整个Java行业中都已建立的良好技术&#xff0c;但是使用它们并使用其作者希望您使用的所有技术和模式来设计项目可能非常棘手。 在开发过程中途&#xff0c;由于一开始就…

浙江丽水学院计算机专业,2019丽水学院专业排名

丽水学院是一所公办全日制普通本科高校&#xff0c;地处浙江绿谷、瓯江之畔、国家级生态示范区——丽水市。为了让大家更好的了解这所大学的专业排名&#xff0c;下面是学习啦小编给大家带来的丽水学院专业排名&#xff0c;供大家参考!丽水学院王牌专业名单省级重点专业&#x…

开发高性能JAVA应用程序基础(内存篇)

虽然JAVA的垃圾回收和当前高配置的服务器可以让程序员大部分时间忘掉OutOfMemoryError的存在&#xff0c;但是访问量增大后频繁的GC会额外消耗CPU (使用top查看结果为us值高)&#xff0c;系统响应速度下降&#xff0c;积压的请求又会占用更多内存从而恶性循环&#xff0c;严重时…

【前端面试题】2021/3/12挺经典的面试题,这个经历很深刻。

今天面试去啦&#xff0c;填了职业性格测试&#xff0c;人格测试及招聘的基本经历信息&#xff0c;面试官是技术头头&#xff0c;柔中带钢&#xff0c;问题润物细无声的感觉&#xff0c;很考验基本功。 上午10:30面试了一个达达的前端&#xff0c;采用的是线上腾讯会议的方式&a…

html5 ios cookie,ios – WKWebView,获取所有cookie

我想从WKWebView获取所有cookie.为什么&#xff1f;我已经启动了一个使用基于Web的身份验证的项目.因此,我应该拦截cookie以确保用户已登录并用于其他目的.另一种情况 – 想象一下,如果用户登录,而不是“杀死”应用程序 – 由于存储此cookie会话的一些延迟将丢失:(.The problem…

【前端面试题】2021/3/15面试题

最近在boss直聘上投了很多简历&#xff0c;记录一下今天的面试题&#xff0c;这个好几个都是电话直接打过来问时间方便&#xff1f;我一回答方便就直接开始丢题目&#xff0c;我也不知道哪个公司的。感觉公司不是很正规的感觉&#xff0c;感觉那边有个问题题库&#xff0c;面试…

计算机考研数学基础知识点,2019计算机考研数学复习:打好基础是必须的啊喂!...

"基础不牢&#xff0c;地动山摇"这句话形容考研数学的复习真是太贴切不过了&#xff0c;尤其是对处于打基础阶段的19考研党们来说&#xff0c;新东方在线整理了2019计算机考研数学复习&#xff1a;打好基础是必须的啊喂!很多同学都存在着这样的误区&#xff1a;考研数…

javafx打包路径问题_关于JavaFX的最常见问题

javafx打包路径问题上周&#xff0c;我在斯德哥尔摩的Jfokus 2012上做了一个关于JavaFX的演讲&#xff0c;当时我意识到每次活动都会问三个问题。 似乎有一个普遍的兴趣&#xff0c;所以我尝试在这篇文章中回答他们&#xff08;尽可能的说实话&#xff09;&#xff1a; iPad或其…

【前端面试题】关于一些js的一些面试题(金融行业),我和面试官扯了三个小时

今天去面试了一家金融公司&#xff0c;招聘比较着急&#xff0c;一面后直接二面等结果&#xff0c;这种公司一般对js要求比较高&#xff0c;笔试题基本都是js相关的题&#xff0c;针对公司的客户要求也会做一些jquery,vue.react相关的插件&#xff0c;H5及webAPP。下面直接说题…