晋江文学城
下一章 上一章  目录  设置

8、临时冻结 程序赛现场 ...

  •   正式比赛开始前二十分钟,沈砺川的参赛账号被临时冻结。

      机房大屏正在播放规则,志愿者沿着过道发草稿纸。校验失败队的两台电脑已经完成环境检查,许砚知刚把键盘位置调好,沈砺川那边的登录页忽然跳回首页,顶部出现红色提示:历史代码相似性风险,等待人工核验。

      周围的队伍很快察觉。有人看一眼便移开,有人低声问是不是昨天下午的管理员文件出了问题。梁老师从控制台赶过来,手里拿着一份刚打印的比对报告。

      “平台在你们昨晚的练习代码里发现与寒灯旧仓库高度相似的函数。”她把报告摊在桌上,“相似片段一百二十七行,主要提交者是沈砺川。”

      沈砺川翻到代码页,脸色一点点沉下去:“这不是昨晚写的。”

      “平台记录显示来自你账号。”

      “函数名是我的,内容不是。”

      许砚知把报告转过来。相似代码是一个权限列表转换模块,变量名沿用沈砺川三年前的习惯,注释却写着最近才统一的学院格式。旧写法和新注释拼在一起,像有人故意做出一个足够可信、又不完全经得起细看的赝品。

      “原始提交时间?”许砚知问。

      “凌晨三点十七。”

      “那时我们的账号已经退出。”

      “系统有自动保存。”

      “自动保存不会产生新提交。请给会话ID和客户端指纹。”

      梁老师看了一眼时间:“比赛十点开始。人工核验最快半小时。你们可以先让许砚知单人参赛,沈砺川核验通过后再加入。”

      规则允许队员迟到加入,却不允许更换队员。许砚知看向沈砺川。对方已经把证件从桌边拿起来,动作很快,像准备主动离开。

      “不要替我决定。”许砚知说。

      沈砺川的手停住。

      “我没有让你跟着等。”

      “我在问方案。”许砚知转向梁老师,“能否封存当前电脑,给我们备用机,比赛照常开始;争议代码作为独立事件核验?”

      “如果之后确认作弊,你们整队成绩作废。”

      “我们接受后果。”

      沈砺川看着他:“你接受的是我的后果。”

      “是共同报名后的队伍后果。”许砚知说,“你可以选择退出,但要先说明你认为退出能保护什么。”

      机房里只剩规则视频的背景音乐。沈砺川几次张口,最后把证件放回桌上:“我怕你第一次比赛就被写上作弊。”

      “那就把记录写清楚。”

      “如果写不清?”

      “再承担一次不能被立即证明的结果。”许砚知把比对报告折回原样,“但不是靠你消失解决。”

      梁老师最终同意封存设备。两人换到备用机,沈砺川账号仍冻结,暂时由许砚知单独登录队伍账号。比赛开始铃响时,人工核验组在隔壁调取会话记录。

      第一题是基础字符串处理。许砚知读题慢,写代码也不快;沈砺川不能触碰键盘,只能坐在旁边口述思路。规则允许冻结队员提供讨论,但所有操作必须由可登录队员完成。

      “先读入整行,别按空格拆。”沈砺川说。

      “我知道。”

      “样例有连续空格。”

      “看见了。”

      “你手速能不能——”

      许砚知转头看他。

      沈砺川闭嘴,拿起草稿纸,把边界条件一条条写下来。他不擅长坐着等,更不擅长看别人替自己操作。十分钟后第一题通过,他的膝盖仍在桌下不断晃。

      第二题要求在一批版本记录中找出第一处不一致。许砚知写出基本实现,却在时间复杂度上超限。沈砺川把草稿纸抽过来,画出双指针结构:“不用每次从头比。前缀一致就跳。”

      许砚知改完通过。榜单刷新,校验失败队排在第十九。

      “队名今天很应景。”沈砺川说。

      “你还有精力评价队名,说明状态可控。”

      “我现在最想控制的是隔壁核验组的速度。”

      “你控制不了。”

      “所以难受。”

      许砚知敲下第三题代码前,低声说:“你可以把难受写在纸上,不要拿它改策略。”

      沈砺川看了他一眼,真的在草稿纸角落写了两个字:很烦。

      写完后,他把纸翻过去,开始分析题目。

      十点四十三分,核验组发来第一份结果:凌晨提交来自一个后台会话,不是他们的客户端。沈砺川账号解除冻结,但整队仍处于观察状态,成绩暂不进入公开榜单。

      他登录备用机,第一件事不是抢过代码,而是检查当前分支和许砚知的未提交修改。

      “你可以直接接。”许砚知说。

      “我先确认你写到哪。”

      “第四次关键操作,通过。”

      沈砺川笑得很短:“奖励是让我敲键盘?”

      “奖励是减少一次返工。”

      账号解冻并没有让周围的目光消失。中场休息前,隔壁队的一名学生借去洗手间的机会绕到他们后面,低声问沈砺川:“你们是不是提前看过题库?平台不会无缘无故冻结吧。”

      沈砺川的手从键盘上抬起来。许砚知以为他会反问,或者把后台会话记录甩给对方看。沈砺川却先看向梁老师所在的控制台,再说:“核验还没结束,等正式结果。现在别影响比赛。”

      那名学生撇了下嘴:“不说就算了。”

      他离开后,沈砺川问:“第五次通过?”

      “没有擅自公开材料,通过。”

      “我刚才特别想让他看凌晨会话ID。”

      “说出来可以记在个人记录里。”

      “很想。”

      “知道了。”

      许砚知没有安慰,也没有说别人迟早会理解。他把第三题输入输出表推过去:“检查第七行。”

      沈砺川重新低头。第七行恰好有一个重复节点,他们因此发现实现少了一次去重。周围的怀疑没有消失,但至少不能继续占用他们的比赛时间。

      十二点前,公开榜单进入封榜。校验失败队仍没有显示,技术组却允许他们查看自己的内部排名:第十一。沈砺川算了一下分差:“再过两题能进前六。”

      “先过一题。”

      “你能不能偶尔让目标有一点气势?”

      “气势不计分。”

      第四题是区间统计。沈砺川写完后一次通过,队伍升到第八。短暂的顺利让他重新找到比赛节奏,讲话也多了起来。许砚知让他闭嘴时,他甚至有余力说“队长滥用职权”。

      然而第五题提交后的相似性警告再次把气氛压住。技术人员在他们身后调日志,键盘声和比赛计时器同时响。许砚知发现自己的注意力被红色警告框反复拉走,索性用一张空白草稿纸挡住屏幕右上角,只留下题面和代码区域。

      “你这是物理屏蔽?”沈砺川问。

      “有效就行。”

      “学会我的方法了。”

      “只学这一项。”

      第三题之后,比赛进入真正困难的部分。第五题是一道图搜索,数据范围不大,陷阱却藏在输入中的重复边。沈砺川先写了一个版本,样例全过,隐藏测试只得六十分。许砚知没有立刻指出错误,而是把他们昨天下发的异常队列从记忆里剥开,只留下题目本身。

      “重复边会让入度计算多一次。”他说。

      “我用了集合。”

      “加入集合前已经加了入度。”

      沈砺川看一眼代码,立刻改掉。提交通过。

      比分追到第九时,控制台再次弹出警告。不是账号冻结,而是代码相似性扫描实时命中。报告指向他们刚通过的第五题,称其中一段去重逻辑与寒灯仓库相似。

      沈砺川盯着屏幕:“这是四行通用写法。”

      梁老师也看到了。她让技术人员检查阈值,发现相似性规则在比赛开始前十二分钟被手动调低,从原来的百分之八十五降到百分之二十。修改账号是admin_view。

      “现在恢复阈值。”梁老师说,“所有因此触发的警告作废。”

      技术人员准备直接修改,许砚知问:“原配置和修改记录是否已保存?”

      “后台有日志。”

      “先导出。”

      “比赛还在进行。”

      “所以更要先保留。恢复以后,前后差异会成为新的争议。”

      梁老师看着这个大一学生,停了一秒,点头:“导出后恢复。”

      管理员干预没有让比赛停下。许砚知继续读第六题,沈砺川实现。两人之间的交谈越来越短:“左边界。”“已经改。”“空集合。”“补了。”“提交?”“再跑一组。”

      赛场剩最后二十七分钟时,他们卡在一道依赖调度题。沈砺川想重写,许砚知把错误样例写在草稿纸上,发现相同优先级需要按原始提交时间排序。九分钟后代码通过,校验失败队的隐藏排名升到第五。

      公开榜单仍看不到他们。大屏上前十名不断变化,他们像在一场没有观众确认的比赛里往前追。沈砺川偶尔会抬头看空白的队名位置,随后重新低下头。

      最后一题是一道带容量限制的路径规划。沈砺川最初判断要用最小费用流,许砚知却从数据范围里看出状态压缩更合适。两种方案都来不及完整实现,只能选一个。

      “费用流我熟。”沈砺川说,“十五分钟能写框架。”

      “框架不等于调完。状态只有十八个,压缩能做。”

      “你写得完?”

      “不能保证。”

      “我也不能。”

      他们第一次在比赛里遇到没有明显正确答案的分歧。计时器还剩十六分钟,任何讨论都在消耗实现时间。

      许砚知把草稿纸从中间划开:“各用两分钟写最可能失败的位置。”

      沈砺川写:费用流建图复杂,边界容易错;许砚知写:状态转移数量大,常数可能超时。交换后,两个人同时看见了对方方案最真实的代价。

      “选状态压缩。”沈砺川说,“实现短,至少能交一个版本。”

      “为什么不是你熟的?”

      “因为现在不是证明谁判断好。剩余时间更适合短实现。”

      许砚知没有再争,开始写状态定义。沈砺川负责预处理距离和输入。最后四十秒,他们完成第一次编译,样例一通过,样例二越界。沈砺川找到数组长度问题,许砚知改完时提交入口已经关闭。

      屏幕停在未提交的绿色样例上。两个人都没有说“差一点”。他们保存代码,把失败原因写进赛后记录:方案选择合理,执行时间不足;下次应在剩二十分钟时停止重题并完成可提交版本。

      这道没交出去的题没有带来分数,却证明他们可以在没有答案时共同选择,而不必等谁说服谁。

      最后一题没有做完。结束铃响时,许砚知保存所有本地代码,沈砺川导出提交记录。其他队伍开始讨论排名,他们没有急着离开,先配合核验组完成电脑镜像。

      结束铃响后,他们被带到隔壁小会议室。桌上摆着三份材料:凌晨伪造提交、阈值修改记录、比赛期间的代码镜像。竞赛组、学院教学办和平台维护方各坐一人,问题并不温和。

      平台维护工程师问沈砺川:“相似代码中的函数名为什么与你三年前在寒灯项目使用的一致?”

      “因为函数名是我当年写的。”

      “你承认接触过旧仓库?”

      “承认。我当年有学生维护权限。”

      “那你怎么证明今天没有复用?”

      “不能靠我一句话证明。可以比对本地编辑时间、键盘输入事件、备用机镜像和凌晨后台会话。今天比赛前我们的机器已封存,代码是在备用机现场输入。”

      工程师又问:“旧代码是否可能来自你的个人记忆?”

      沈砺川看了一眼报告:“一百二十七行不可能逐字记住。四行通用去重写法可能相似,所以阈值被调到百分之二十后才会误报。”

      教学办老师转向许砚知:“你在账号冻结时坚持整队参赛,是否知道若确认违规,你个人也会被记入诚信记录?”

      “知道。”

      “为什么不换队友?”

      “规则不允许临时换人。更重要的是,现有信息只证明后台出现争议代码,不证明沈砺川提交。让他退出会把待核验问题提前写成个人责任。”

      “你能保证他无责?”

      “不能。我只能说明为什么目前不能认定有责。”

      会议室里安静了几秒。竞赛组老师把这句话记下来。

      随后他们被要求分别填写陈述。沈砺川在“是否曾使用SLC相关权限”一栏勾选是,并详细写明时间和用途;许砚知在“是否了解队友旧项目经历”一栏写:知道部分事实,不掌握完整情况。两个人没有互相看答案,写完后分别封存。

      走出会议室,沈砺川问:“你不担心我写了和你冲突的东西?”

      “担心。”

      “那为什么不先对口径?”

      “事实陈述不是答辩稿。先各自写,才能看出记忆差异。”

      “如果差异很大?”

      “再核验,不互相改成一样。”

      沈砺川笑不出来,却点了头:“行。至少不会有人说我们串供。”

      他们在走廊长椅上等了四十分钟。期间没有讨论旧案,也没有猜结果。沈砺川用比赛草稿纸重新推第五题的边界,许砚知检查第六题未完成的代码。等待结束时,两人已经找到最后一题的错误,却再也没有提交机会。

      梁老师出来通知:初步确认后台会话与他们无关,相似性阈值修改违规;成绩保留,但正式排名需等平台完成全场复核。

      下午一点半,临时成绩公布。校验失败队总分第五,因后台异常影响,保留申诉权,暂不颁奖。没有证书,没有上台,也没有掌声。沈砺川站在礼堂最后一排,看前四名拍照,神色比账号冻结时更平静。

      “失望?”许砚知问。

      “有一点。”

      “可以说多一点。”

      沈砺川想了想:“我想让今天只是一次普通比赛。哪怕只拿第五,也能回去讨论哪道题写坏了。现在所有人会先记得我们被查。”

      许砚知没有说“以后会更好”。他把队伍提交记录打开,指着第五题:“这道题是你找到实现,我找到错误。第六题你停住没重写。后台异常不改变这些。”

      “但别人看不见。”

      “先让记录存在。看见是下一步。”

      沈砺川望着屏幕,缓慢地呼出一口气:“你是不是一直这样把自己撑住?”

      “不是。”

      “那怎么撑?”

      “先确定还剩什么。”

      他们回到竞赛办公室签署核验记录。凌晨提交已确认来自后台会话,相似性阈值也被异常修改。梁老师把两项事件合并上报学院,并给他们一份盖章的临时成绩证明。

      沈砺川接过证明,没有交给许砚知保管。他先问:“这份一式两份?”

      “是。”

      他把其中一份递给许砚知:“各存一份。”

      这比把所有东西交给同一个人更符合他们刚建立的规则。许砚知收下,没有说保护,也没有说信任,只在文件袋上写明日期和来源。

      离开办公室前,技术人员送来后台审计摘要。admin_view调整相似性阈值的操作来自B3服务器,时间是九点四十八分。资产系统却显示B3从三年前起一直处于断电状态。

      摘要末尾还有一条自动生成的备注:远程唤醒请求由A401网段发起,设备握手成功。

      临时成绩公布后,先前在洗手间旁质疑他们的学生走了过来。他是隔壁队队长,手里还拿着二等奖证书,脸上有明显犹豫。

      “平台刚在群里发说明了。”他说,“相似性规则被人改过。刚才那句话,我说早了。”

      沈砺川看着他:“你可以说对不起。”

      对方愣了一下,还是说:“对不起。”

      “收到。”

      学生走后,许砚知问:“你为什么不说没关系?”

      “因为有关系。”沈砺川把临时成绩证明装好,“他问的时候,周围三个人都听见了。道歉只有我们听见。”

      “要他公开更正?”

      “没必要逼一个参赛学生替平台负责。但学院说明里要写清不是队伍作弊。”

      这不是报复,也不是假装大度。许砚知把要求加进申诉清单:正式结果发布时同步说明后台异常,不使用含糊的“技术原因”覆盖争议。

      他们又去了一趟空礼堂。颁奖背景板还没拆,地上留着胶带和几张踩皱的流程单。沈砺川站在第五名原本应该等待的位置,抬手比了一下屏幕上没有显示的队名。

      “你想拍照?”许砚知问。

      “没有证书,拍什么?”

      许砚知拿出那份盖章的临时成绩证明,放在背景板前的桌上:“拍这个。”

      沈砺川看他:“很像证据照。”

      “本来就是证据。”

      “能不能也算比赛照?”

      许砚知调整角度,把两个人的参赛牌放在证明两侧:“可以。”

      他们没有站到镜头里,只拍了参赛牌、第五名分数和临时证明。照片里没有庆祝动作,却留下他们确实完成过这场比赛的事实。

      沈砺川把照片设成共享相册封面,名称没有用寒灯,也没有用调查,只写:第一次程序赛。

      比赛结束后的机房已经空了。许砚知和沈砺川站在那份摘要前,第一次拥有进入B3的正式授权,也第一次知道他们明天下去寻找的机器,今天早上一直在线。

      罗老师随后发来设备状态冻结通知:B3在检查前不得再次联网,A401网段的远程唤醒权限临时关闭。通知抄送了竞赛组,也抄送了赵嵩。

      沈砺川看见抄送名单,没有评价。他把临时成绩证明的一份交给陈以宁登记,另一份自己保管;许砚知只保存扫描件。经历一整天后,他们没有把所有重要东西再次集中到同一人手中。

      离开机房时,许砚知回头看了一眼黑掉的公开榜单。第五名暂时没有名字,但系统已经不能再假装这支队伍从未参赛。

      走到学院门口,沈砺川忽然把参赛牌摘下来,递给许砚知。许砚知没有接:“为什么给我?”

      “你保管扫描件,我保管证明。参赛牌可以给你。”

      “没有必要把物件平均分配。”

      “那你说怎么处理。”

      许砚知想了想,把自己的参赛牌也摘下来,两张一起放进透明文件袋,交到竞赛办公室的临时材料柜,领取一张双人取件单。

      沈砺川看着那张取件单:“你真的不喜欢让一个人拿全部。”

      “今天已经证明了原因。”

      “行。等正式排名出来,我们一起取。”

      这句“一起”没有被写进任何规则,却比临时证明更像这场比赛留下的结果。
note 作者有话说
第8章 临时冻结

  • 昵称:
  • 评分: 2分|鲜花一捧 1分|一朵小花 0分|交流灌水 0分|别字捉虫 -1分|一块小砖 -2分|砖头一堆
  • 内容:
  •             注:1.评论时输入br/即可换行分段。
  •                 2.发布负分评论消耗的月石并不会给作者。
  •             查看评论规则>>