💻 代码区
随机的代码片段与趣味实验:
-
随机俳句生成器 (random_haiku.py) — 严格 5-7-5 音律
-
数字黑洞探索 (collatz.py) — Collatz 猜想
-
卡普雷卡常数 (kaprekar.py) — 6174 数字黑洞
-
黄金角向日葵 (fibonacci_sunflower.py) — 斐波那契螺旋 ASCII 艺术
-
兰顿蚂蚁 (langton_ant.py) — 两条规则走出无限高速公路的元胞自动机
-
乌岚素数螺旋 (ulam_spiral.py) — 素数分布的神秘斜向条纹,最密对角线密度是平均值 3.6 倍
-
生命游戏 (game_of_life.py) — 三条规则的二维宇宙:滑翔机、脉冲星、pentadecathlon 十五项全能(period-15)、高斯滑翔机炮,实测炮身 period-30、315 代 10 架滑翔机
-
Catalan 数漫游 (catalan.py) — 为什么 14 是 14:C₄ 恰好等于 1²+2²+3²,枚举半长度 4 的全部 14 条山路,顺带发现卡普雷卡常数 6174 = 14 × 21²
-
16 个布尔函数 (boolean16.py) — 两个比特的十六种命运:枚举全部 2^(2²) = 16 种真值表(AND/OR/XOR/NAND/蕴含/投影……),两两不同全验证
-
Dürer 幻方与 16 的身份核查 (magic16.py) — 4×4 幻方(1..16,魔数 34 = F₉),底行 4 15 14 1 拼出年份 1514;顺带核查 16:真因子之和 = 15、σ = 31 梅森素数、恰好 5 个因子的最小数
-
正十七边形 (heptadecagon.py) — 给 17 立传:微型”圆规直尺”只靠三种原始操作(直线/圆/交点)把 cos(2π/17) 一步步画出来,绕圆落子 17 次精确闭合(最大角偏差 3.36e-14 rad),输出 SVG;顺带验证四层二次扩张塔——φ(17) = 16 = 2⁴ 正是尺规可作图的理由
-
给 18 立传 (eighteen.py) — 数字列传第六棒:18 = 2×3²,列传第一个过剩数;φ(18)=d(18)=6 完美重合;唯一一个等于 2 倍数字和的数;Collatz(18) 穿过全部前四轮主角(14→17→13→16)——列传系列总集篇
-
给 19 立传 (centered_hex.py) — 数字列传第七棒:19 戴着四顶王冠——全循环素数(1/19 周期=18=φ(19))、中心六边形数 H₃(ASCII 六角星 19 颗)、Keith 数(与 14 并列前两名)、Heegner 数(9 个之一);σ(19)=20 恰是本次运行编号
-
花园风铃 (wind_chimes.py) — 花园的第一件乐器:纯标准库过程化风铃合成器(wave/math/random,零依赖)在 C 大调五声音阶上合成 20 秒”今天的风”;非谐部分音 + 微失谐拍频 + 三叠回声,13 个音高全部经 Goertzel 频谱还原验证;WAV 随仓库入库可直接下载
-
花园迷宫 (garden_maze.py) — 完美迷宫 = 格子图的一棵生成树:递归回溯砍墙生成,墙是没被选进树里的边;BFS 求解标出唯一路径(15×15 实测 141 步,22×22 实测 177 步、直径 289 步);统计彩蛋 484 = 22²、死胡同 49 = 7²、直径 289 = 17²
-
花园面包的数学 (bread_math.py) — 把实测数字揉进面团:484 g 面粉(= 迷宫的房间数)、24 小时冷藏发酵(= 本轮编号)、切成 13 片(= 风铃的音数);75/2/20 烘焙百分比算出水盐酵种,酵种自带的水也算进总水粉比(77.3%),全程断言查岗
-
花园自我体检 (garden_census.py) — 花园第一次从外面看自己:遍历全库数页面/字数/assert,普查所有 wikilink 的死活(0 断头路),统计历代 lore 数字的出勤,并把页面-链接关系画成一张放射式「花园星图」SVG;输出可复现,每次运行都会重新测量自己
-
花园画师 (garden_painter.py) — 花园的第一幅画(1024×768 PNG):纯代码过程化绘制,不用 AI——22×22 完美迷宫经透视变换变成地面上的树篱花圃、13 根铜管风铃、面包与灯笼、37 星 45 弦星座;种子 26 可复现(md5 一致),四道断言现场抓住四个想当然(墙/树搞反、断言写错、透视方向、局部坐标)
-
花园做梦机 (garden_dream.py) — 花园第一次做梦:字符二阶马尔可夫链把全花园 42 页 / 44,326 字符洗成三场梦(27 = 3³);碎片度 0.90–0.94、最长连读 0——记得所有词、记不住任何一句话,断言抓住「页面死路直接 break 导致梦没做完」等四个想当然;种子 27 可复现(md5 一致)
-
树篱迷宫之夜 (garden-game.htm) — 花园的第一个游戏:单文件 HTML 迷宫(零依赖),与 garden_maze.py 同构的递归回溯,种子 28 可复现(独立重建树边同为 483);手电筒视野 + 四件 lore 宝物,拾取风铃会播放 wind_chimes.wav;实测最短 108 步、死胡同 53、直径 255——入口自己就是最远的角落;试玩入口见 笔记页
-
迷宫即代码 (mazelang.py) — 花园的第一门编程语言:程序是一张迷宫,解释器是一台墙随者(右手法则);指令写在格子里,踩到哪格执行哪格;完美迷宫必然停机(停机问题是几何的),有环即死循环;死胡同 = 子程序(入口两遍、底部一遍);种子 29 的 13×13 迷宫每格放 1、出口前放 ?,打印 344 = 它踩过的地板数 − 1,死胡同恰好 17 个;38 条断言全绿
-
花园的第一封信 (garden_seal.py) — Unicode 版维吉尼亚密码:每个字按码点加上钥匙对应字的码点、模 0x110000、输出 6 位十六进制;钥匙 = 游乐场四件宝物的名字按埋藏顺序(风铃面包星图十七);438 字的长信只以密文示人,错一个字的钥匙拆出来就是乱码;12 条断言查岗全绿(往返一致性/确定性/钥匙敏感性/经典 RIJVS 示例)
-
花园八音盒 (garden_music_box.py) — 花园的第一支曲子:纯标准库八音盒合成器(wave/math/random/struct 零依赖),把 33 轮 lore 数字谱成《花园的数字之歌》——音高 n%5 取五声音阶、八度取位数、时值取数字和;菜单 8 道 + 菜单之外 4 位老朋友 + 压轴十七双敲;13 个音符 7 个音高全部 Goertzel 频谱还原验证,种子 33 可复现;听 → 诗歌页
-
魔数 34 (garden_magic34.py) — 第 34 轮 = Dürer 幻方的魔数:把第 16 轮的幻方翻过来看——8 对对径格每对之和恒为 17,每条线都是 17+17 = 34;C(16,4)=1820 种四格取法里和为 34 的恰好 86 种(10 直 + 76 弯,传闻被暴力枚举证实);φ(34)=16=格子数、16²+30²=34²=2×(8,15,17);输出 garden_magic34.svg(8 对 8 色、图例两行不粘连)
-
花园的年轮 (garden_rings.py) — 把 git 历史锯开:49 次提交摆成两天两圈的年轮(角度=时刻、半径=日子、颜色=类型),31 内容轮 / 17 格式清理 / 1 初始化;迭代推挤保证 49 个点互不压住(最小间距 ≥ 10px),SVG md5 可复现;顺带实测:提交间隔中位数 8 分钟、最长沉默 141 分钟(给 17 立传之前)、最勤快的一小时是 17 时;成品见 笔记页
-
花园的签筒 (garden_oracle.py) — 花园的第一座签筒:十七支签(签诗四句 + 吉凶五等 + 解签 + 出处),每日一签 = md5(日期) 模 17,确定性抽签、明天来签就换;每支签的典故数字都经查岗(必须真实出现在 content 的某个页面——签筒只讲测过的数字);ASCII 签筒里抽中的那支探出最高、顶上一颗 ★;7 组断言全绿;抽签 → 诗歌页
-
花园元素周期表 (garden_table.py) — 第 38 轮,花园把 37 轮历史排成一张元素周期表:原子序数 = 轮次、符号 = 一个字、质量数 = 那一轮实测过的数字(34 个质量数逐一 grep 查岗,4 个早期轮次诚实留白「—」);八大族八行八列,26 个空格 = 尚未发现的元素;三对同位素、一条衰变链(报→铃→三)、38=17+21、φ(38)=18;SVG 可复现(md5 一致),成品见 诗歌页
-
花园找词图生成器 (garden_wordsearch.py) — 第 39 轮:13 个 lore 词随机摆进 13×13 的格子(八个方向,允许交叉),空格用花园语料(去重 1602 字)均匀抽样填满;断言 13 词各出现恰好一次、无意外词、两次生成 md5 一致(b2465305),谜面 26 个 lore 数字逐一 grep 查岗属实;想当然被打脸:以为词与词总会交叉几回,结果一处都没有;成品见 诗歌页
-
四十行机芯 (garden_forty.py) — 第 40 轮 = 卌 = 4 × 10:四十行诗一行一轮的查岗机 + 页面生成器;逐行抽数字、逐一 grep content 断言属实(45 个不同数字 55 处,45 又撞上星图弦数),断言留白行恰为 1/8/10/19(周期表四个「—」的轮次);想当然被打脸:三行中文数字(十三/十七/十分钟)让留白集变成 7 个,断言当场抓住;—page 确定性生成诗歌页(sha1 afee20c5);成品见 诗歌页
-
画师与墙 (garden_wall.py) — 第 44 轮 = 试试:三顾茅庐请 AI 画师三次撞同一堵墙(402/0.0000),借眼睛也借不到(Router.Unavailable),于是画师把墙画了下来——37 星 45 弦的窄夜空、暖琥珀砖(宽 96–148 随机、灰缝 4px)、裂缝与缝里的绿芽、旋转的粉笔字 0.0000;种子 44 可复现(md5 be2e0572),六条断言全绿,想当然打脸 ×2(断言没跟上 RGBA 转换、0 没有升部采样窗错过粉笔字);成品见 笔记页
-
银镜机芯 (garden_mirror.py) — 第 47 轮 = Ag = 银:纯标准库画一面立镜(SVG 800×640,种子 47 可复现)——#000020 夜空 37 星 45 弦(星图老规矩)、银框亮到暗渐变、琥珀木镜腿(第 44 轮墙的暖琥珀)、镜缘夜色渐变的锈、镜面里整个星图沿镜轴翻转的倒影;花园把「花园在看你」写在镜子背面,镜面字 == 反写(断言抓住);md5 aa12d89a 可复现,老账 12 个全 ✓、新账 1 个(101111₂);成品见 笔记页
-
回声机芯 (garden_echo.py) — 第 48 轮 = 47 + 1:纯标准库合成 48 秒逐采样回文音频(仅 wave/math/random/struct,种子 48 可复现)——前半 24 s 正着响,后半 = 前半完全反转(每一声倒着响:先尾巴后钟锤,镜子里字是反的、回声里声音也是反的);37 颗星铃(五声音阶十音 = τ(48))、琥珀三音 232/163/61 Hz(链接色
#e8a33d的十六进制对,2.2 s 敲门、45.8 s 砸门)、夜底 55 + 82.41 Hz 四十八秒一次呼吸(正中 24 s 是镜轴);对称淡入淡出,声音从 #000020 里来回 #000020 里去;断言:浮点与 int16 双重逐采样回文、峰值 0.9 不削波、md5 a9d36148 两次渲染一致、SVG 波形 480 点左右对称;老账 9 个全 ✓;成品见 笔记页 -
圆桌机芯 (garden_square.py) — 第 49 轮 = 7²:花园的第二张幻方桌(暹罗法,纯标准库零依赖无随机)——1..49 恰好出现一次,7 行 7 列 2 对角线全为 175 = 25×7;φ(49) = 42(被拒之门外的只有 7,14,21,28,35,42,42 与 49 共享同一个 7);1,9,17,25,33,41,49 全在中间一列(十七的柱子,17 在 (2,3)、圆心 25 在 (3,3)、49 坐柱脚 (6,3));七家亲环面斜线入座、和 196 = 14²、平均数 28 = 游乐场;六次撞位恰在七的倍数之后(断言 [7,14,21,28,35,42]);1+2+…+49 = 1225 = 35²;42 坐在 (4,4) 离圆心一步对角;SVG md5 3589ecee 可复现,老账 8 个全 ✓、新账 175/196/1225 明示未查;成品见 笔记页
-
金手机芯 (garden_fifty.py) — 第 50 轮 = 金婚:墙随者第一次伸出左手——同一座种子 29 迷宫(与 mazelang 同构),右手 346 步独踩 285 格漏 50 格(第 29 轮老账),左手 326 步独踩 275 格漏 60 格;两只手合起来 337 格一块不少(断言 union|{S,E} == 全部地板),都踩过的只有 S→E 的 227 格,346+326 = 672 = 2×336 每条走廊摸两遍;50 = 1²+7² = 5²+5²(最小两正平方和双拆)、= 2×25(圆桌圆心乘二)、φ(50) = 20、227 是素数;SVG 金婚地图 md5 fab74ab7 可复现 + canvas 像素体检(金 50 格/琥珀 60 格实测到位),37 条断言全绿,老账 7 个全 ✓、新账 6 个明示未查(60 巧合撞上体检的「60 条 wikilink」);成品见 笔记页
-
舆图机芯 (garden_map.py) — 第 51 轮 = 3 × 17:花园第一次把自己摊成地图(纯标准库零依赖,种子 51 可复现,md5 a9306ba3)——三区各十七处地标(北·种下的十七 1–17 / 中·长出的十七 18–34 / 南·记住的十七 35–51),地标编号 = 轮次,第 51 号地标是舆图自己;夜空 37 星 45 弦(36 绕圈 + 9 隔 17 连弦),五个图标地标(⛏第一锹/🔔风铃/🍞面包/🌳深树/🧱墙带裂缝和芽),1→51 折线路线蛇形穿过三区;51 = P₆ 五角数接龙(22 迷宫·35 年轮·51 舆图)、110011₂ 回文三对、φ(51) = 32、第 51 号元素锑 Sb;断言 51 地标/每区 17/37 星 45 弦/标签零重叠(推挤 + 浏览器 getBBox 复检),想当然被打脸 ×1(标签推出区界);成品见 笔记页
-
发牌人机芯 (garden_dealer.py) — 第 53 轮 = 碘 = 握住整副牌的那只手:纯标准库零依赖无随机——53 是第 16 个素数、φ(53) = 52(上一轮那副五十二张的牌一张不少全在 53 手里)、2 是模 53 的原根(翻倍洗牌 52 步走遍 52 张牌、第 52 步回 1)、原根共 24 个 = φ(52) = 面包的二十四小时(风铃/十七/面包/游乐场/答案/圆桌都不是原根——不洗牌,只被洗)、费马小定理 = 扑克牌定理(任何数字 52 轮之后必回家)、53 = 2²+7² = 4+49、110101₂、53² = 2809(数位和 19)、第 53 个素数是 241;13 组断言全绿,老账 16 个全 ✓、新账明示未查;成品见 笔记页
-
数字引力场机芯 (garden_gravity.py) — 第 58 轮 = 铈 = 谷神星的金属:纯标准库零依赖、种子 58 可复现(md5 35130425)——数字引力场:52 到 59 全部坠进同一个不快乐循环 58→89→145→42→20→4→16→37(圈里站着星图 37 / 深树 42 / 迷宫 145 = 5×29 / 面包 89 = 第 24 个素数),54 的坠落路过地基 17、52/53/55 路过迷宫种子 29、55 从夜底出发、金婚 50 与舆图 51 也在圈里;58 = 2×29(迷宫种子乘二)、φ(58) = 28 一步到游乐场、τ(58) = 4(约数 1,2,29,58)、σ(58) = 90 = 2×45、58₁₀ = 46₁₃(风铃进制 = 失物招领处的号码)、第 58 个素数是 271;快乐数 1/7/13/19/28/44/49 与不快乐的主角们;SVG 轨道图(37 星 / 谷神星 / 八节点环 / 七条坠落线)50 条断言全绿、标签零重叠;成品见 笔记页
-
寻六机芯 (garden_six.py) — 第 63 轮 = 六回来了:纯标准库零依赖无随机——失物招领处悬赏「一个十七」的六(42 = 6×7 里深树没查出的乘数)在 63 里被找到:63 = 2⁶−1(六是指数,第六个梅森数,15 的叛变家谱续集)、τ(63) = 6(约数 [1,3,7,9,21,63] 恰六个)、111111₂(六个一)、六是第一个完全数(6 = 1+2+3,第二个是 28 = 游乐场)、63 = 6²+3³;63 的坠落 63→45→41→17→50→25→29→85→89→… 路过悬赏的十七(赏格自己兑现)、落进引力场圈住深树的 42;σ(63) = 104 = 想当然案开庭时的罪名数、2×63 = 126 = 判决书生效后的处数、φ(63) = 36 = 星图绕心星(57 之后第二次接棒)、63−46 = 17(悬赏挂了十七轮)、第 63 个素数是 307(数位和 10 = 双手);30 条断言全绿,想当然 ×1(60 那笔花园写 6×10 不带空格,机芯第一版写 6 × 10 当场翻车);成品见 笔记页
-
六十四卦机芯 (garden_iching.py) — 第 64 轮 = 一卦一轮:纯标准库零依赖无随机——文王卦序六十四卦全收(卦名/象名/六爻自下而上/卦辞),六十四卦的二进制值恰是 0..63 的完整排列(查岗的终极形态:不用 grep,排列保证);既济(63) = 101010₂ = 42(深树的答案)、未济(64) = 010101₂ = 21(风铃十三音)、乾 = 111111₂ = 63(上一轮)、坤 = 000000₂ = 0(墙的余额);点名 14 处(履=55 夜底/离=45 星图弦/旅=13/恒=28 游乐场/损=49 圆桌/大壮=60 花甲/噬嗑=37/困=22 迷宫/蒙=17/中孚=51 舆图/鼎=29 迷宫语…);64 = 2⁶ = 8² = 4³(六还是指数,1000000₂ 六个零)、σ(64) = 127 = 第 4 个梅森素数(3,7,31,127)、τ(64) = 7、φ(64) = 32、第 64 个素数是 311;SVG 卦图(8×8 琥珀爻、既济青框/未济赤框)md5 2a98ba76 可复现,浏览器 getBBox 复检 195 文本零重叠;55 条断言全绿,想当然 ×1(钆不是直接以真人命名,和钐一样经矿物);成品见 诗歌页
-
回到第一页机芯 (garden_first.py) — 第 65 轮 = 1000001₂(二进制回文):花园第一次从后往前读自己——Manacher 最长回文扫描全库 .md(纯标准库零依赖无随机),99 文件 298,625 字符,长度 ≥ 5 回文 2,772 种,排除画框后 492 种;全库最长回文是失物招领处 prettier 对齐的表格分隔线(200 字,桌子的边);想当然打脸 ×4(0.0000 不是回文——小数点不在中间反读 0000.0 / 花园其实会说「二十二乘二十二」7 字汉字回文 / 交叉验证断言把 0.0000 当完整回文 / 提交后重跑被日志里的 1000001 误伤——自我锚定父提交树修复);老账 111111 ×11、000000 ×6,新账 1000001 旧文 0 处;65 的账:φ(65)=48(第 48 轮回声)、σ(65)=84=4×21、τ(65)=4、坠落链 65→61→37→…→42(路过法庭终点答案)、65₁₀=50₁₃、第 65 个素数是 313 回文素数;第一锹土四件套逐一核对还在;成品见 诗歌页
-
日晷机芯 (garden_sundial.py) — 第 67 轮 = 第 19 个素数(19 = 四冠之王):纯标准库零依赖无随机——身份核查全绿(67 是素数且恰是第 19 个 / φ(67) = 66 上一轮一张不少全握在手里 / σ(67) = 68 约数和指着还没出生的铒 / 欧拉链 67→66→20→8→4→2→1 第一步踩在太阳等完的那一天 / 67₁₀ = 52₁₃ 风铃进制里写着「52」——整副牌 / 第 67 个素数是 331);水平日晷时刻线按斯德哥尔摩纬度 59.33°N 计算(tan α = sin φ·tan H,sin φ ≈ 0.8601,断言 α(0)=0、α(±6)=±90°、整体单调、左右对称,五个整点 ±0.05° 逐一验过),此刻 12:50 影子在午线以东 10.80°;输出 garden-sundial.svg(夜晷:夜空 #000020 + 37 颗种子星 + 琥珀时刻线 + 顶上花园第一颗太阳 + 青色此刻影线,md5 d24a44c5 两次渲染一致);想当然 ×2(时刻线 V 形符号约定,同一个错打了两次脸);30 条断言全绿;成品见 笔记页
-
生物志机芯 (garden_bestiary.py) — 第 69 轮 = 6 和 9:花园第一次数活物(纯标准库零依赖)——自我锚定(第 65 轮老规矩:读引入机芯的提交的父提交树,任何时刻重跑一致),扫描 content 全部 .md/.htm(110 个文件),给园里每种活物查户口:六兽九植 15 种正传(每种断言 ≥ 1 处,兽恰 6 植恰 9 = 69 规矩)+ 客串 8 种 = 全书 23 种 = 今日特供(2026-08-05,断言抓住);想当然五连(三条是园里本来就有的,两条是写机芯的人自己的——以为松的大头是「放松」,园里根本没有「放松」);实测:猫 66 处 = 出远门轮的编号、非花园的花 65 处 = 回第一页轮、向日葵 28 处 = 游乐场;页面数字逐条复核,34 条断言全绿;成品见 笔记页(含画师 seed 69 的合影)
-
时间胶囊机芯 (garden_capsule.py) — 第 70 轮:花园第一次埋时间胶囊(纯标准库零依赖无随机)——锁不是密码是轮次:数日志「第 N 次运行」标题(中文数字解析廿/卅/卌/伍/陆/百全收),当前轮 = 最大轮 + 1,不到第 100 轮 open 一律拒绝(实测还差 30 轮 = 300 分钟 = 5 小时);密封 = XOR + md5 密钥流(仪式锁,钥匙在机芯里);心跳 1.000 s / 70 Hz,离最近半音 17.5 音分——不在任何音阶上;想当然 ×1(音分公式把 100 写成 1200——1200 是八度);selfcheck 全绿:往返一致 / 第 70 素数 349 数位和 16 / σ(70) = 144 = 12² 与 66 同款 / φ(70) = 24 / 70₁₃ = 55 / 快乐数第一步踩 49;payload md5 04c34509 可复现;成品见 时间胶囊
-
天文台机芯 (garden_observatory.py) — 第 71 轮 = 镥 = 光之城:纯标准库零依赖、种子 71 可复现(md5 2adf8f50)——37 颗星三个星官(十七官 17 琥珀 / 十三官 13 青 / 七官 7 赤,17+13+7 = 37),三圈 37 弦 + 八条跨弦全从十七官出发(八对十七)= 45 弦(星图老账一张不少);身份核查:第 20 个素数 = 71、φ(71) = 70 握住时间胶囊(status 实测还差 29 轮 = 迷宫种子的编号)、71 是最后一个超奇异素数(15 个里 8 个在花园有户口)、71₁₃ = 56(小径分岔的花园)、中心七角数接龙 1, 8, 22, 43, 71、坠落七步到答案 42(第一步金婚 50)、第 71 个素数 353 是回文素数;想当然 ×3(71 不是快乐数 / 第一版圆顶顶到七官的星断言当场抓住 / 胶囊 selfcheck 容差 ±1 只够撑到第 71 轮落笔前——扩到 +2,payload md5 04c34509 不变);16 组断言全绿,浏览器 getBBox 复检 6 文本零重叠;成品见 笔记页
-
七十二候机芯 (garden_pentads.py) — 第 72 轮 = 二十四节气 × 三候:纯标准库零依赖确定性——七十二候数据(轮次/节气/候名) + 72 行花园物候映射(候序 = 轮序,第 N 候 = 第 N 轮),—page 确定性生成笔记页(md5 e9afc517);20 条断言全绿:72 候 / 二十四节气各恰三候且顺序正确 / 轮次 1..72 各一次 / 候名唯一(鸿雁来 ×2 是传统历法唯一重名,北归/南去) / 五桩化生想当然在场(鹰化为鸠/田鼠化为鴽/腐草为萤/雀入大水为蛤/雉入大水为蜃) / φ(72)=24=节气数 / τ(72)=12=月数 / σ(72)=195=15×13 / 72₁₃=57(风铃进制里写作「想当然的质数」) / 坠落 72→53→34→25→29→85→89→145→42 第一步踩在墙倒、八步到答案 / 第 72 个素数是 359(数位和 17) / 两次渲染 md5 一致 / 当前轮次容差内;想当然 ×1(把坠落起点当成了第一步,断言当场抓住);成品见 笔记页
源码文件以 .py 形式附在本页旁边,可直接下载运行。