简介: 由阿里云云效主办的2021年第3届83行代码挑战赛已经收官。超2万人围观,近4000人参赛,85个团队组团来战。大赛采用游戏闯关玩儿法,融合元宇宙科幻和剧本杀元素,让一众开发者玩得不亦乐乎。
今天请来决赛赛题设计者杜万,给大家分享一下设计与解题思路。
搭配《用代码玩剧本杀?第3届83行代码大赛剧情官方解析》使用效果更佳。
第四题整体是一个C/S架构,客户客户端是一个编译好的命令行程序,不可被修改,服务端是一个 Spring Boot 的 Web 应用;赛题要求,找出服务端程序的 BUG 并修复;客户端有两个职责,一个是说去向服务端发送正常 HTTP 请求,让参赛者发现BUG。
另一个是验证 bug 修复情况,然后发送给远端的评分程序,获得评分。整个赛题是跑在我们阿里云 DevStudio 上面,在 DevStudio 里我们启动一个Intellij IDEA 的社区版,内置了应用观测器(AppObserver) 插件。
Bug 1 :修复 Regex
我们来看第一个bug 如何修复吧。运行 ‘mvn test’,10 个测试有 9 个错误。
这里有好几个BUG,我们先看正则表达式相关的,我们先修复ExtractHtmlTest,翻阅源码,很快能定位到 Utils.stripHtmlTag 方法,方法名字面意思是去除 HTML Tag 标签,然后仔细查看日志会发现。
删除的Tag内容包括了 > 和 ,那说明正则有问题,下图是对正则的剖析。
所以该 BUG上述两种修复方法都是 OK 的。
解法:将 Utils.java 里的正则表达式<(?.*)>
改为<(?[^>]*)>
。
Bug 2:修复尾串缺失
再次执行 mvn test,发现还有单测没有通过,我们会发现字符串少了一截。
再次查看 Utils.stripHtmlTag 方法,发现 matcher.appendReplacement 方法,如果不熟悉该方法,查看JDK的注释后,会发现 matcher.appendReplacement 和 matcher.appendTail 是成对出现的。所以在循环外补上 mat