OO的奇妙冒险——OOP入门与字符串处理
OO的奇妙冒险 ~OOP入门与字符串处理~
总体分析
公测
- 中测(基础与进阶):
- 其实在我看来,从完成作业的角度来说,中测的基础与进阶并没有任何区别,都不能挂,都不太难,都对得分没有什么影响。中测的样例总体来说非常善良,只要是测试过,几乎不会被中测阻拦。checkstyle的规则看似很多,但是在IDEA插件的支持下,见到黄色的warning直接改掉,总体来说我认为偏向于养成习惯性的举措,并不是扣分地方所在
- 强测(正确性):
- 在第一次作业之前,我十分畏惧强测的正确性,尤其是在经历了计组手动定点爆破+10万条随机都仅是中测的说法,但是,就前三次来看,强测的正确性并不严格。第一次作业比较简单,第二次作业我正则表达式根本就没有写对,面对这个十分巨大的问题,强测仅仅挂了我三组,
我在发出强测不够强的想法的同时也暗自窃喜,而第三次作业的重点向面向对象转移 ,对于正确性的检查更加简单,在我连爆sin(- 9),sin(++1),sin(+++1),sin(++x)4个大型bug的情况下强测一组也没挂,互测又禁掉了WF的攻击,不得不说我并不完全认同的强测数据反而救了我一命
- 在第一次作业之前,我十分畏惧强测的正确性,尤其是在经历了计组手动定点爆破+10万条随机都仅是中测的说法,但是,就前三次来看,强测的正确性并不严格。第一次作业比较简单,第二次作业我正则表达式根本就没有写对,面对这个十分巨大的问题,强测仅仅挂了我三组,
- 强测(性能):
- 第一次作业比较简单,第二次作业我进行了初步的贪心优化,然而偷鸡不成蚀把米,优化也出现了bug,我对第二次作业非常满意,但是对自己做出的结果非常不满意。第三次作业由于以下几个原因,我放弃了优化转战OS
- 自己能力太差
- 长度最短的L记为Lmin,就意味着1位dalao可以灭杀所有的人,dalao之下丝毫不优化和熬夜爆肝优化是同等的,我并没有直接挑战的信心和能力
- 性能分仅占5分
- OS等其他课程需要投入时间
- 第一次作业比较简单,第二次作业我进行了初步的贪心优化,然而偷鸡不成蚀把米,优化也出现了bug,我对第二次作业非常满意,但是对自己做出的结果非常不满意。第三次作业由于以下几个原因,我放弃了优化转战OS
互测:
- 第一次互测可以说是相当惨烈。在一个强测全部100分的房间内,8个人总计被找出了50个bug,4人无伤,3人轻伤,1人重伤,我认为原因有下:
- 第一次接触大规模测试,发生了\v惨案,爆栈惨案等bug
- 强测不够强,将一部分性能bug放了过去(例如x-x输出为空而不是0)
- 规则尚未完善,被hack1/x等价于被hack7/x
- 第二次互测由于作业做得很差,进入了C屋,战况同样十分惨烈。在C屋使用对拍器甚至评测机进行测试效果是非常显著地,一屋7个人人人有bug,基本就是大礼包互开的级别,我被查出了正则的巨型bug,不过考虑到客观因素(C屋里对拍器并不普及),仅被人hack3次,如果身处第一次互测的房间,应该是20次起步吧
- 第三次互测由于无法提交WF变得十分无聊,一个屋子的95.8824大眼瞪小眼,不优化的人bug反而更不容易出现,战绩0/0,0/9,不过屋里还是有人因为做了简单的优化而被人查出了bug,这次互测给我的教育是,制造SPJ时要考虑周全,先要判断这个输出是不是WF,再调用sympy进行验证,因为sympy识别的表达式并不一定满足作业要求的文法
作业内容分析
第一次作业比较简单
第二次作业正确性不太困难,但由于个人因素对正则表达式理解不深,检查不细,出现了十分荒谬的bug。优化方面,总体可以分为
- 纯第一次的策略
- 贪心合并
- 贪心合并+分拆
- 深搜+剪枝
- 我看不懂的算法
这几个层次。我采用的是贪心合并的层次,但由于是周二晚上心血来潮才开始优化,处理的很差,出现bug几乎是必然结果,也算作一个惨痛的教训
第三次作业比较特殊,具体体现在
- 面向过程+递归下降+简单的强测+没有WF的互测=轻松地95.8824
- 性能分计算方法+只有5分=不做优化去学习OS可能是更好的选择
在这些因素的考虑下,我选择了权衡所有的科目,进而去学习OS,从而放弃了优化任务。总的来说这次作业正确性的方法比较唯二,arraylist或树,而结合递归下降的方法,封装三种数据结构+Get类递归下降+Main类入口+预处理检查是一个简易可行的方案。面对助教所讲授的面向对象递归下降分析,我认为考虑可能的扩展性,这种封装其实并没有特别大的意义,直接在Get类里面设置Char[] origin与int mark,构造Getconst,GetF,GetT,GetE这四个方法肯能会更直接,更好实现。至于扩展方面,如果更换文法,直接继承了重写具体的某一个Getx方法即可
不过总的来说,我对第三次作业“trade-off”的结果比较满意,但对于作业的完成情况并不满意。本应是第一单元的收官之作,却在客观层面和各种时间投入策略的权衡上上变成了第一单元最简单的一次作业,对于个人来说有关OOP的收获并不如第二次上机或第二次作业的大(不过巩固了陌生的递归下降分析方法)
作业内容总结
互测的收获
- 首先,互测最大的收获是提高了自己对评测机的认识
- 第一次接触评测机是在计组,在计组进入P5之后,手动测试就完全没有功效了,自动测试的需求应然而生。到了实现P7的时候,我完成了一个十分简陋的对拍器,仅仅是检查字符串,总共就是一个100行左右的C程序
- 为了应付第一次作业,我做出了一个“感知机”,顾名思义,就是只检查双方对于是不是WF的判断是否一致。到第三次作业,终于用python写出了一个差不多的判断程序。数据生成方面,从最开始的完全随机字符串(没有卵用),到马尔科夫矩阵生成的表达式,再到用Xeger生成+随机引入噪声,再到现在的Xeger部件+随机选取,我不仅了解到了很多“轮子”的使用方法,更明白了随机性的重要性
- 其次,是发现别人bug的同时,看到别人的代码
- 发现别人的bug比较简单,挂上评测机跑几个小时,有就有,没有就算,在评测机的帮助下,几乎不用过多的检查代码。不过,对于使用大型正则表达式的代码,直接对着正则表达式分析也是很有帮助的
- 第一次作业偶然查看同组Lancer的代码让我获益匪浅,因此第二三次中,我都会查看一下优化效果不错的,评测机扫不出来的dalao的代码,可以学习别人的思路,尤其是第二次作业公开展示的HDLdalao的代码,虽然并不能完全看懂,但总体模板还是很有启发性的
OO的奇妙冒险——OOP入门与字符串处理的更多相关文章
- OO的奇妙冒险1
OO的奇妙冒险 ~OOP入门与字符串处理~ 目录 总体分析 作业内容分析 作业内容总结 互测的收获 公测互测bug分析与总结 不太正经的个人自嗨 总体分析 公测 中测(基础与进阶): 其实在我看来,从 ...
- OO的奇妙冒险2
OO的奇妙冒险 ~多线程入门与魔鬼的优化~ 目录 总体分析 作业内容分析 作业内容总结 互测的收获 公测互测bug分析与总结 优化分析 不太正经的个人自嗨 总体分析 公测 中测(基础与进阶): 这一单 ...
- python3入门之字符串
获得更多资料欢迎进入我的网站或者 csdn或者博客园 经过前面的介绍相信大家也对python有了一个初步的了解:本节主要介绍字符串,不管学习什么编语言字符串一定在其中扮演着重要的地位.本节主要讲解,字 ...
- Swift入门篇-字符串和字符
今天主要是介绍一下字符串的用法 ,字符串的语法和object-c语法不太一样,但是思想是一样,就是写法不太一样.如果您对.net和java语法比较熟悉的话,那您几乎没有深压力.如果您对swift 基本 ...
- Kotlin入门(5)字符串及其格式化
上一篇文章介绍了数组的声明和操作,包括字符串数组的用法.注意到Kotlin的字符串类也叫String,那么String在Java和Kotlin中的用法有哪些差异呢?这便是本文所要阐述的内容了. 首先要 ...
- python学习之基础入门,安装,字符串,数据转换,三元运算符
python基础 我们要开始学习新的编程语言了,加油~~ python是“世界上最好的语言”,学习它当然是认为它是最好的所以我们才学(人生苦短我学python),python运用于不同的领域,采集分析 ...
- 第二章 Vue快速入门-- 27 字符串的padStart方法使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- Java OOP中的字符串篇
字符串的三大特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String.St ...
- 51nod贪心算法入门-----完美字符串
约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同. ...
随机推荐
- selenium 定位密码软键盘
from selenium import webdriver import time driver = webdriver.Chrome() driver.maximize_window() driv ...
- 保存配置,获取配置,XML
private void SaveSOConfig() { //保存配置 Dictionary<string, string> PrintConfigDIC = new Dictionar ...
- vmware中centos6.7系统图形化安装Oracle-无法打开RUNINSTALLER
如果解压正确 unzip linux……1/2 unzip linux……2/2 给了权限 chown -R Oracle:oinstall /home/database/ 在oracle用户下,运行 ...
- ROS之坑
我使用ROS建图的时候,用的是Kinect的深度信息转换成laser scan,Rviz仿真环境调用出laser scan信息的时候显示如下错误: Transform [sender=unknown_ ...
- C++中的纯虚方法
在学习数据结构中优先级队列时遇到纯虚方法的定义,一时没想起来,便查了一下. 1.纯虚方法解决什么样的问题,为什么要设计出纯虚方法? 考虑下面的需求,基类声明了一个方法,这个方法只针对具体的子类才有意义 ...
- struts2+springmvc+hibernate开发。个人纪录
对于很多新手来说,都不太清楚应该怎么去放置代码并让他成为一种习惯.个人的总结如下: 一.基础包类的功能 1.dao :提供底层接口 2.daoimpl:实现底层接口类,与底层交互 3.entity:实 ...
- 关于Python的协程问题总结
协程其实就是可以由程序自主控制的线程 在python里主要由yield 和yield from 控制,可以通过生成者消费者例子来理解协程 利用yield from 向生成器(协程)传送数据# 传统的生 ...
- Vue 组件&组件之间的通信 之 父组件向子组件传值
父组件向子组件传值:父组件通过属性向下传值的方式和子组件通信: 使用步骤: 定义组件:现有自定义组件com-a.com-b,com-a是com-b的父组件: 准备获取数据:com-b要获取父组件dat ...
- Linux命令-cut篇
Cut 命令是常用的 Linux 命令,在这里总结一下平时常用的参数和用法,方便查证. 常用参数: -b:以字节为单位进行分割: -c:以字符为单位进行分割: -d:自定义分割符进行分割,默认为制表符 ...
- Leaflet获取可视范围内4个顶点
//地图级别改变时发生 map.on("zoomend", function (e) { var zoom_val = e.target.getZoom(); map_drag() ...