博客 · 第 7 页
关于工程、设计与一些随手记录。
手写 cron 解析器:五段、并集规则,以及 2 月 30 日
cron 的语法半小时能写完,难的是语义:日与星期同时限定时是并集而非交集,不存在的时间要有终止条件,7 与 0 都是星期天。
CSV 不是「按逗号切」:RFC 4180 的引号与换行
一旦字段里有引号,split 立刻出错:引号能包住逗号和换行,引号自己写成两个。三十行状态机比任何正则都可靠。
黑白棋的合法落点:一次扫描,八个方向
一个空位合法,当且仅当八个方向里至少有一个方向能夹住对方的棋子。判断与翻转用的是同一次扫描,不必先模拟再回滚。
数独生成器:挖洞、唯一解,以及一个把页面卡死的 bug
生成器先填一个完整解,再逐格挖洞并验证唯一性。我在求解器里把「不限」写成 0,结果空盘要枚举全部解,点新局直接卡死。
一致性哈希:加一台机器为什么不用重排所有键
取模分片在机器数变化时几乎搬走全部数据。把哈希空间首尾相接成一个环,键归顺时针第一台机器,加节点只影响一段区间 —— 代价是需要虚拟节点。
五子棋的胜负判定:只查刚落下的那一点就够
每次落子后全盘扫描是浪费:胜负只可能因为最新一手而改变。沿四个方向从落子点向两侧延伸计数,判定成本与棋盘大小无关。
