多个角色进入压力区域时,门是否开启取决于当前有多少有效占用者。重复收到同一人的进入提示,如果每次都简单加一,就可能让机关在无人时仍认为有人。
下面是一组独立的虚构游戏输入与逐步结果。先记录单位、编号和端点是否包含,再尝试自己推算,最后对照第一处差异。所有结论都以本例规则为前提;其他作品采用不同约定时,应按它自己的说明重新计算。
本例规则与数据
占用者用零到四号表示。进入把该身份加入集合,重复进入不增加人数;离开移除身份,不存在时保持。达到给定人数门槛就开门,低于门槛就关门。这里只处理一处机关和已知事件顺序。
开门人数门槛1 [['进入', 0], ['进入', 0], ['离开', 0], ['离开', 0], ['离开', 2], ['离开', 4], ['进入', 1], ['离开', 4], ['离开', 4], ['离开', 0], ['离开', 3], ['进入', 4], ['离开', 2], ['进入', 0], ['离开', 1], ['离开', 3], ['进入', 2], ['进入', 0], ['离开', 1], ['进入', 2]]
过程记录
第1条:0号进入,原占用[],新占用[0],人数1,门开启。
第2条:0号进入,原占用[0],新占用[0],人数1,门开启。
第3条:0号离开,原占用[0],新占用[],人数0,门关闭。
第4条:0号离开,原占用[],新占用[],人数0,门关闭。
第5条:2号离开,原占用[],新占用[],人数0,门关闭。
第6条:4号离开,原占用[],新占用[],人数0,门关闭。
第7条:1号进入,原占用[],新占用[1],人数1,门开启。
第8条:4号离开,原占用[1],新占用[1],人数1,门开启。
第9条:4号离开,原占用[1],新占用[1],人数1,门开启。
第10条:0号离开,原占用[1],新占用[1],人数1,门开启。
第11条:3号离开,原占用[1],新占用[1],人数1,门开启。
第12条:4号进入,原占用[1],新占用[1, 4],人数2,门开启。
第13条:2号离开,原占用[1, 4],新占用[1, 4],人数2,门开启。
第14条:0号进入,原占用[1, 4],新占用[0, 1, 4],人数3,门开启。
第15条:1号离开,原占用[0, 1, 4],新占用[0, 4],人数2,门开启。
第16条:3号离开,原占用[0, 4],新占用[0, 4],人数2,门开启。
第17条:2号进入,原占用[0, 4],新占用[0, 2, 4],人数3,门开启。
第18条:0号进入,原占用[0, 2, 4],新占用[0, 2, 4],人数3,门开启。
第19条:1号离开,原占用[0, 2, 4],新占用[0, 2, 4],人数3,门开启。
第20条:2号进入,原占用[0, 2, 4],新占用[0, 2, 4],人数3,门开启。
最后在场[0, 2, 4],门状态由当前人数与门槛1直接决定。
独立核对与实际应用
对每个身份查找截至当前最后一条事件,最后是进入才算在场;没有事件或最后是离开则不在场。独立重建在场集合,并与每步开关结果比较。
事件丢失与身份伪造不由这个集合规则解决,真实联网系统还要核对权威位置。本例只展示重复通知为何不能直接等同于新角色。开门是当前集合的派生状态,不需要每条事件都另外翻转一次开关。
测试时先保留输入和中间状态,再只改变一个条件。空状态、正好相等、重复出现和最后一步都值得单独检查。若最终结果不符,应从第一处偏差查起,而不是在末尾随意增加补偿让数字表面一致。
