OO的奇妙冒险 ~OOP入门与字符串处理~

总体分析

公测

  • 中测(基础与进阶):

    • 其实在我看来,从完成作业的角度来说,中测的基础与进阶并没有任何区别,都不能挂,都不太难,都对得分没有什么影响。中测的样例总体来说非常善良,只要是测试过,几乎不会被中测阻拦。checkstyle的规则看似很多,但是在IDEA插件的支持下,见到黄色的warning直接改掉,总体来说我认为偏向于养成习惯性的举措,并不是扣分地方所在
  • 强测(正确性):
    • 在第一次作业之前,我十分畏惧强测的正确性,尤其是在经历了计组手动定点爆破+10万条随机都仅是中测的说法,但是,就前三次来看,强测的正确性并不严格。第一次作业比较简单,第二次作业我正则表达式根本就没有写对,面对这个十分巨大的问题,强测仅仅挂了我三组,我在发出强测不够强的想法的同时也暗自窃喜,而第三次作业的重点向面向对象转移 ,对于正确性的检查更加简单,在我连爆sin(- 9),sin(++1),sin(+++1),sin(++x)4个大型bug的情况下强测一组也没挂,互测又禁掉了WF的攻击,不得不说我并不完全认同的强测数据反而救了我一命
  • 强测(性能):
    • 第一次作业比较简单,第二次作业我进行了初步的贪心优化,然而偷鸡不成蚀把米,优化也出现了bug,我对第二次作业非常满意,但是对自己做出的结果非常不满意。第三次作业由于以下几个原因,我放弃了优化转战OS

      • 自己能力太差
      • 长度最短的L记为Lmin,就意味着1位dalao可以灭杀所有的人,dalao之下丝毫不优化和熬夜爆肝优化是同等的,我并没有直接挑战的信心和能力
      • 性能分仅占5分
      • 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入门与字符串处理的更多相关文章

  1. OO的奇妙冒险1

    OO的奇妙冒险 ~OOP入门与字符串处理~ 目录 总体分析 作业内容分析 作业内容总结 互测的收获 公测互测bug分析与总结 不太正经的个人自嗨 总体分析 公测 中测(基础与进阶): 其实在我看来,从 ...

  2. OO的奇妙冒险2

    OO的奇妙冒险 ~多线程入门与魔鬼的优化~ 目录 总体分析 作业内容分析 作业内容总结 互测的收获 公测互测bug分析与总结 优化分析 不太正经的个人自嗨 总体分析 公测 中测(基础与进阶): 这一单 ...

  3. python3入门之字符串

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 经过前面的介绍相信大家也对python有了一个初步的了解:本节主要介绍字符串,不管学习什么编语言字符串一定在其中扮演着重要的地位.本节主要讲解,字 ...

  4. Swift入门篇-字符串和字符

    今天主要是介绍一下字符串的用法 ,字符串的语法和object-c语法不太一样,但是思想是一样,就是写法不太一样.如果您对.net和java语法比较熟悉的话,那您几乎没有深压力.如果您对swift 基本 ...

  5. Kotlin入门(5)字符串及其格式化

    上一篇文章介绍了数组的声明和操作,包括字符串数组的用法.注意到Kotlin的字符串类也叫String,那么String在Java和Kotlin中的用法有哪些差异呢?这便是本文所要阐述的内容了. 首先要 ...

  6. python学习之基础入门,安装,字符串,数据转换,三元运算符

    python基础 我们要开始学习新的编程语言了,加油~~ python是“世界上最好的语言”,学习它当然是认为它是最好的所以我们才学(人生苦短我学python),python运用于不同的领域,采集分析 ...

  7. 第二章 Vue快速入门-- 27 字符串的padStart方法使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  8. Java OOP中的字符串篇

    字符串的三大特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String.St ...

  9. 51nod贪心算法入门-----完美字符串

    约翰认为字符串的完美度等于它里面所有字母的完美度之和.每个字母的完美度可以由你来分配,不同字母的完美度不同,分别对应一个1-26之间的整数. 约翰不在乎字母大小写.(也就是说字母F和f)的完美度相同. ...

随机推荐

  1. Delphi调用API函数获取Windows目录信息、获取System目录信息、获取Temp临时文件目录信息

    var Str1, Str2: Array[..Max_Path]of Char;//开辟缓冲区 Str3: Array[..]of Char; begin GetWindowsDirectory(@ ...

  2. Ubuntu16.04安装Redis

    前言 Redis是常用基于内存的Key-Value数据库,比Memcache更先进,支持多种数据结构,高效,快速.用Redis可以很轻松解决高并发的数据访问问题:作为实时监控信号处理也非常不错. 环境 ...

  3. CentOS7运行报错kernel:NMI watchdog: BUG: soft lockup - CPU#0 stuck for 26s

    CentOS内核,对应的文件是/proc/sys/kernel/watchdog_thresh.CentOS内核和标准内核还有一个地方不一样,就是处理CPU占用时间过长的函数,CentOS下是watc ...

  4. mysql授权grant

    本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删 ...

  5. Literal绑定数据

    前台: <asp:Literal ID = "ChiCunShow" runat = "server"></asp:Literal> 后 ...

  6. vue 添加旋转图片 修改css transform 值

    //点击放大图片并旋转图片 conponents组建 <template>    <!-- 过渡动画 -->    <transition name="fade ...

  7. MySql 查询表结构信息

    select Column_name as 列名,is_nullable as 是否可为空,data_type as 数据类型,column_default as 默认值,case when colu ...

  8. Hive性能优化上的一些总结

    https://blog.csdn.net/mrlevo520/article/details/76339075 1.介绍 首先,我们来看看Hadoop的计算框架特性,在此特性下会衍生哪些问题? 数据 ...

  9. windows服务加定时器实现

    首先在项目中添加windows服务 然后双击“MainService.cs”,在上面点右键“打开代码” 以下是我的实例代码 partial class MainService : ServiceBas ...

  10. 最短Hamilton路径【状压DP】

    给定一张 nn 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径. Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次. 输入 ...