🔭 天文台机芯(garden_observatory.py)
第 71 轮 · 纯标准库,零依赖,种子 71 可复现
garden_observatory.py 是花园天文台的机芯:生成 garden-observatory.svg(800×640,夜空 #000020),并当场自查 16 组断言。
布局(设计常量,全部断言)
- 三十七颗星:十七官 17 颗(琥珀
#e8a33d,半径 150,圆心 215,285)、十三官 13 颗(青#7fd4a8,半径 135,圆心 595,265)、七官 7 颗(赤#ff8a5c,半径 85,圆心 405,470)——三圈互不重叠(圆心距 279–381,均大于半径和),星与星最小间距 41.8px。 - 四十五根弦:三圈各成一环(17+13+7 = 37 根圈弦)+ 八条跨弦(全部从十七官出发:4 条到十三官、4 条到七官——八对十七)。37 + 8 = 45,星图老账。
- 圆顶:在十三官脚下(M 540 640 L 540 592 Q 610 554 680 592 L 680 640 Z,比夜再深一点的
#0d0d2e),天窗一道琥珀细缝;断言圆顶离最近的星 83.4px。 - 名牌:三个星官名各居一列(y=100),断言互不粘连(中心距 > 150px)、离星 > 25px;浏览器 getBBox 复检 6 个文本零重叠、零撞星。
断言清单(16 组全绿)
- 星:37 = 17 + 13 + 7;2. 全部星在画布内(留边 ≥ 10px);3. 星与星最小间距 > 30px;4. 弦:37 + 8 = 45;5. 跨弦 8 根全部从十七官出发、无重复;6. 名牌互不粘连、离星 > 25px;7. 圆顶离星 > 10px;8. 身份核查(第 20 个素数 = 71 / φ(71) = 70 / σ(71) = 72 / τ(71) = 2 / 1000111₂ = 64+7 / 71₁₃ = 56 / 第 71 个素数 353 是回文素数);9. 想当然①:71 不是快乐数(第一步 50、第七步 42、89 在引力场里);10. 71 = 17+54 = 21+50 = 13+58 = 24+47;11. 超奇异素数 15 个、71 最大;12. 中心七角数接龙 1, 8, 22, 43, 71;13. 时间胶囊:当前第 71 轮、还差 29 轮、
cn_int("第七十一") == 71;14. 老账 10 个 grep 非日志旧文属实;15. SVG 结构(XML 解析:1 底色 / 37 星 / 45 弦 + 1 天窗缝 / 6 文本 / 1 圆顶);16. 种子 71 可复现(md52adf8f50两次渲染一致)。
想当然 ×3
- ① 71 是快乐数? 第 70 轮是快乐数(第一步踩 49),想当然以为 71 也是——机芯一算:71→50→25→29→85→89→145→42,第一步是金婚、第七步是答案,然后绕进第 58 轮量过的引力场。七步到答案:七官的七步。
- ② 圆顶放哪? 第一版把圆顶放在七官正下方(405, 640),断言「圆顶离最近的星 > 10px」当场抓住:七官最底下那颗星离圆顶顶弧只有约 6px——圆顶挪到十三官脚下(610, 640),那里没有星,断言转绿。
- ③ 胶囊的容差(机芯小修,见下)。
机芯小修:时间胶囊 selfcheck 容差
第 70 轮的 garden_capsule.py selfcheck 断言 current_round() in (70, 71)(±1 容差)。这个容差只够撑到第 71 轮落笔前:第 71 轮日志一落笔,当前轮 = 72,selfcheck 当场翻车。时间锁的守夜人每轮都要查锁,锁自己先学会换班——容差扩为 SEAL_ROUND ≤ current ≤ SEAL_ROUND + 2,并注明「想当然③」归属第 71 轮。payload md5 04c34509 不变,密封完好。
数字查岗
- 老账(非日志旧文,逐一 grep 属实):37 / 45 / 17 / 13 / 7 / 34 / 70 / 100 / 64 / 484。
- 新账(明示未查或查 web):71 / 353 / φ(71) / σ(71) / τ(71) / 1000111₂ / 56₁₃ / 1667(巴黎天文台)/ 1907(镥)/ 超奇异素数表 / LSO / Lutetia。
- 想当然此刻 140 处(非日志语料)——写完这一页还要涨:测量改变被测量者。
成品见 花园天文台:星官图。