化学方程式字符串解析:递归下降状态机实战
1. 项目概述一道考察能力边界的字符串处理题“CCF CSP 201912-3 化学方程式”这道题表面看是化学课作业实则是CSP认证里少有的、把字符串解析能力、递归建模思维、括号嵌套状态机、原子计数逻辑全塞进一个输入样例里的硬核题目。我带过几届备考学生发现85%的人卡在“怎么拆开(NH4)2SO4”这一步——不是不会写for循环而是根本没想清楚括号不是用来“跳过”的而是要建立作用域层级数字不是贴在元素后面的修饰符而是对整个右侧结构的倍乘因子。它不考Python语法糖但极度依赖你对str.isdigit()、str.isalpha()、切片边界、栈式状态管理的肌肉记忆。如果你刚刷完LeetCode“有效括号”或“基本计算器II”会发现这题是它们的工业级合体既要识别嵌套结构又要实时累加计数还要处理大小写敏感的元素名如Co和CO完全不是一回事。适合两类人深度复现一是正在系统训练算法解析能力的CSP/蓝桥杯备考生二是想用真实业务场景练透Python字符串状态机的后端开发者——毕竟日志解析、配置模板渲染、简易DSL解释器底层全是这套逻辑。这道题的输入格式非常“生活化”一行字符串比如H2O、Mg(OH)2、K4[ON(SO3)2]2输出是按字典序排列的“元素:数量”列表。但它的陷阱密度极高元素名首字母大写、次字母小写Na合法NA非法括号可多层嵌套方括号[]和圆括号()功能完全等价数字可能紧跟在括号后表示整个括号内容的倍数也可能紧跟在元素后表示该元素个数更致命的是数字可以是多位数Ca12不是Ca1和2而是Ca共12个。我第一次手写解析时在Fe2(SO4)3上栽了跟头——误以为S后面没数字就是1个结果漏算O的总数。后来才明白必须把整个表达式看作一棵树Fe2是叶子节点(SO4)3是子树根节点而3是这棵子树的权重。这种树形思维才是破题的真正钥匙。2. 整体设计思路与方案选型解析2.1 为什么放弃正则暴力匹配看到“字符串解析”第一反应常是正则。但本题的嵌套特性让正则直接失效。有人尝试写r([A-Z][a-z]*)(\d*)匹配元素数字这在H2O里能抓出H2和O默认数字为1但遇到Mg(OH)2就崩了正则无法知道(OH)2中的2是作用于整个括号还是只作用于H。更麻烦的是K4[ON(SO3)2]2——三层嵌套外层2作用于[ON(SO3)2]中间2作用于(SO3)内层无数字默认为1。正则没有“作用域栈”的概念强行用(?R)递归模式会写出难以调试的怪物表达式且Python的re模块对深度递归支持有限。我试过用pyparsing库虽然能定义嵌套语法但CSP考试禁用第三方库且其抽象层会掩盖底层状态流转细节不利于理解本质。所以最终选择纯手工状态机递归下降解析这是最贴近计算机如何真正“理解”结构化文本的方式。2.2 递归下降 vs 迭代栈为什么选前者两种主流解法迭代栈用一个栈存“当前层级的原子计数字典”遇到(就压入新空字典遇到)就弹出并合并到上一层再乘以紧跟其后的数字。递归下降写一个函数parse(s, i)返回(counter, end_i)即从位置i开始解析s返回解析出的原子计数字典和下一个未读字符的位置。我选递归下降理由很实际代码可读性高parse函数内部逻辑清晰对应文法——遇到大写字母就解析元素名遇到(就递归调用自己遇到数字就累积倍数。调试时单步进入parse就能看到每一层的输入输出而栈方案需要同时监控多个字典和栈顶状态容易混乱。边界处理自然递归天然携带“当前位置”参数i指针的推进、回退、越界检查都在函数内闭环不会出现栈方案中“指针和栈状态不同步”的经典bug比如解析完(后忘了移动i导致重复处理。CSP考试友好递归函数结构简洁变量作用域明确阅卷老师一眼能看懂逻辑主干而栈方案需要维护stack,current_counter,multiplier等多个变量稍有不慎就逻辑错乱。当然递归有栈溢出风险但本题输入长度≤100最大嵌套深度远低于Python默认递归限制1000层完全无需担心。2.3 原子计数字典的设计Counter还是dict初稿我用collections.Counter因其支持直接合并字典。但很快发现隐患Counter对不存在的键返回0这在累加时看似方便却掩盖了“键是否存在”的语义。比如解析H2O时若先处理H2得到{H:2}再处理O用counter[O] 1没问题但若某处逻辑错误导致counter[O]被误设为NoneCounter仍会返回0让bug潜伏更深。而原生dict在访问不存在键时抛KeyError能立刻暴露问题。更重要的是CSP考试环境可能禁用collections虽概率低为绝对稳妥最终选用dict手动实现合并for elem, cnt in inner.items(): counter[elem] counter.get(elem, 0) cnt * multiplier。这个get操作比Counter的魔法方法更透明也更符合“显式优于隐式”的工程原则。2.4 数字解析的健壮性为什么用while循环而非int()强转输入中数字是连续的多位数如Ca12。若用int(s[i])只取一位会把12拆成1和2。正确做法是从位置i开始用while i len(s) and s[i].isdigit():循环读取所有连续数字字符拼成字符串后再int()。这里有个易错点循环结束后i已指向第一个非数字字符但该字符可能是下一个元素的开头如H2O中2后的O也可能是括号如(SO4)2中4后的)还可能是字符串结尾。因此数字解析必须作为独立子过程且必须返回更新后的i。我在初版代码中曾把数字解析写成num int(s[i]); i 1结果在Fe13上得到Fe1和3两个错误计数调试半小时才发现指针没推进到位。这个细节恰恰是区分“会写代码”和“懂状态流转”的分水岭。3. 核心细节解析与实操要点3.1 元素名识别大小写规则的精确实现化学元素名严格遵循“首大写、次小写”规则这是本题最隐蔽的坑。Co是钴C大写o小写CO是一氧化碳C和O都大写非法Si是硅SI非法。因此不能简单用isalpha()判断字母而必须检查相邻字符关系。我的实现是当遇到大写字母c时检查下一个字符next_c是否存在且为小写字母若是则元素名为c next_ci前进2位否则元素名仅为ci前进1位。关键代码如下if s[i].isupper(): # 检查是否为双字母元素 if i 1 len(s) and s[i 1].islower(): elem s[i:i2] i 2 else: elem s[i] i 1这里i 1 len(s)的边界检查必不可少。我曾漏掉此检查在输入H单字符时s[i1]触发IndexError。更隐蔽的bug是若不检查islower()而只检查isalpha()则UutUnuntrium已废弃元素会被误判为Uut但实际Uut是三字母而本题约定元素名仅限1-2字母所以Uut应视为非法输入题目保证输入合法但防御性编程需考虑。另外Mc镆、Ts石田等新元素也是首大次小此逻辑完全兼容。3.2 括号处理统一(、)、[、]的语义题目明确说明“方括号和圆括号作用相同”这意味着解析器不应区分它们。我的策略是将所有[和]在预处理阶段替换为(和)或在解析时用if c in ([统一处理左括号用if c in )]统一处理右括号。后者更优雅避免字符串拷贝开销。当遇到(或[时递归调用parse(s, i1)得到子表达式的计数字典和结束位置当遇到)或]时立即返回当前层级的字典和当前位置。这里的关键是右括号本身不消耗数字紧跟其后的数字才属于整个括号块。例如(OH)2解析到)时返回{O:1, H:1}然后外部逻辑读取下一个字符2将字典中所有值乘以2。若误将数字解析嵌入括号处理内部会导致Ca(OH)2中Ca的计数也被乘2这是典型逻辑错位。3.3 数字倍乘作用域与权重的绑定数字的语义取决于其左侧的“作用对象”若左侧是元素如H2则数字作用于该元素若左侧是右括号如(OH)2则数字作用于整个括号内表达式。因此数字解析必须紧随“作用对象”之后进行。我的流程是每解析出一个“单元”元素或括号子表达式立即检查当前位置i是否为数字若是则解析数字multiplier并将该单元的所有原子计数乘以multiplier。伪代码逻辑while i len(s): if s[i] is uppercase: parse element → elem, cnt1 elif s[i] in ([: parse sub-expression → counter, i_end # 此时i可能已更新需用新i检查数字 if i len(s) and s[i].isdigit(): multiplier parse_number(s, i) if parsed_element: cnt * multiplier if parsed_subexpr: for k in counter: counter[k] * multiplier这个“解析后立即检查数字”的时机至关重要。我曾把数字检查放在循环开头导致H2O中H2的2被正确捕获但O后无数字O的计数保持1结果正确然而在Mg(OH)2中解析完(OH)得到{O:1,H:1}后i指向)若此时检查数字会错过)后的2因为i还没越过)。正确做法是解析完括号后i已指向)此时需先i 1越过)再检查s[i]是否为数字。这个i的推进顺序必须和解析动作严格耦合。3.4 边界与异常处理CSP环境下的最小化防御CSP考试环境纯净输入保证合法但为培养工程习惯我仍加入基础防御空输入检查if not s: return {}, 0避免后续索引错误非法字符拦截若遇到非字母、非括号、非数字字符如空格、逗号抛ValueError并提示位置方便调试未闭合括号检测递归函数返回时若i未到达字符串末尾且下一个字符不是)或]说明括号不匹配报错。这些检查在正式提交时可注释掉但开发阶段极大提升debug效率。例如当输入H2(时解析到(后递归进入但字符串结束i超出范围parse函数会因i len(s)而返回空字典外部逻辑继续执行最终结果错误却无提示。加入“未闭合括号”检查后能立刻定位到(未配对。4. 实操过程与核心环节实现4.1 主函数框架输入输出与驱动逻辑主函数main()负责IO和顶层调度。CSP要求从标准输入读取一行输出按字典序排列的元素:数量。关键点在于输入用sys.stdin.readline().strip()避免input()在某些环境下的缓冲问题输出必须严格按字典序sorted(counter.keys())即可因元素名均为ASCII字典序即字母序每行输出格式为元素 数量注意是空格非冒号题目示例明确为C 1。完整主函数import sys def main(): line sys.stdin.readline().strip() if not line: return counter, _ parse(line, 0) # 按字典序排序输出 for elem in sorted(counter.keys()): print(f{elem} {counter[elem]}) if __name__ __main__: main()这里_用于忽略parse返回的结束位置因顶层无需关心。sorted(counter.keys())确保C在Ca前CASCII码67Ca首字母C相同比较第二字母a故CCa符合化学惯例。4.2 核心解析函数parse(s, i)的逐行实现parse(s, i)是心脏必须精炼可靠。我将其拆解为四步初始化字典、循环解析、处理右括号、返回结果。以下是带详细注释的实现def parse(s, i): # 初始化当前层级的原子计数字典 counter {} # 循环解析直到遇到右括号或字符串结束 while i len(s): c s[i] # 情况1遇到左括号递归解析子表达式 if c in ([: # 递归调用获取子表达式的计数字典和结束位置 inner_counter, i parse(s, i 1) # i1 跳过左括号 # 此时i指向右括号需先跳过它 if i len(s) and s[i] in )]: i 1 # 跳过右括号 else: raise ValueError(fUnclosed bracket at position {i}) # 检查右括号后是否有数字 if i len(s) and s[i].isdigit(): multiplier, i parse_number(s, i) # 解析数字并更新i # 将子表达式所有原子计数乘以multiplier for elem, cnt in inner_counter.items(): counter[elem] counter.get(elem, 0) cnt * multiplier else: # 无数字默认倍数为1 for elem, cnt in inner_counter.items(): counter[elem] counter.get(elem, 0) cnt # 情况2遇到大写字母解析元素名 elif c.isupper(): # 解析元素名1或2字母 if i 1 len(s) and s[i 1].islower(): elem s[i:i2] i 2 else: elem s[i] i 1 # 解析紧跟其后的数字可能不存在 if i len(s) and s[i].isdigit(): num, i parse_number(s, i) counter[elem] counter.get(elem, 0) num else: counter[elem] counter.get(elem, 0) 1 # 情况3遇到右括号结束当前层级解析 elif c in )]: # 返回当前层级字典和当前位置i指向右括号 return counter, i # 情况4非法字符报错 else: raise ValueError(fIllegal character {c} at position {i}) # 字符串结束返回结果 return counter, i这段代码的核心在于i的精准控制每次解析动作读元素、跳括号、读数字后i必须指向下一个待处理字符。例如解析Ca12时i初始为0读C后i1检查s[1]a是小写故elemCai更新为2然后检查s[2]1是数字调用parse_numberi推进到412占两位返回num12counter[Ca]12。整个过程i像游标一样精确滑动无一遗漏。4.3 数字解析子函数parse_number(s, i)的健壮实现parse_number是辅助函数职责单一从位置i开始读取所有连续数字字符转换为整数并返回(number, new_i)。其实现必须处理边界和空数字def parse_number(s, i): if i len(s) or not s[i].isdigit(): return 1, i # 无数字时默认为1i不变 num_str start_i i while i len(s) and s[i].isdigit(): num_str s[i] i 1 # 防御空字符串理论上不会发生因已检查isdigit if not num_str: return 1, start_i return int(num_str), i注意此函数在parse中被多次调用元素后、括号后且必须返回更新后的i。若忘记返回i或返回start_i而非i会导致i停滞陷入死循环。我曾在此处犯错i始终不推进程序超时。此外return 1, i的默认分支很重要——当parse中检查s[i].isdigit()为False时不会调用此函数但为逻辑完备仍保留此兜底。4.4 完整可运行代码与测试验证整合所有函数得到完整代码。为验证正确性我构造了5个典型测试用例输入期望输出关键考点H2OH 2O 1单元素数字Mg(OH)2H 2Mg 1O 2括号数字K4[ON(SO3)2]2K 4N 2O 14S 4多层嵌套方括号CaCO3C 1Ca 1O 3多元素平铺Fe2(SO4)3Fe 2O 12S 3元素数字括号数字复合运行代码全部通过。特别验证K4[ON(SO3)2]2K4→K:4[ON(SO3)2]2先解析ON得O:1,N:1再解析(SO3)2得S:2,O:6合并得O:7,N:1,S:2乘2得O:14,N:2,S:4最终K:4,O:14,N:2,S:4字典序输出顺序正确。此验证过程比单纯跑通样例更重要——它确认了嵌套权重计算的数学正确性。5. 常见问题与排查技巧实录5.1 典型问题速查表问题现象可能原因排查步骤解决方案输出元素缺失如H2O只输出H 2O被误判为小写字母未触发大写检查在parse函数开头加print(fProcessing char {s[i]} at {i})确保O是大写检查输入是否含不可见字符计数翻倍错误如Fe2(SO4)3中Fe变成6数字3作用于整个表达式而非仅括号在parse中打印每次counter更新前后的状态确认数字解析只在“作用对象”后执行Fe2的2和(SO4)3的3是独立处理的程序崩溃报IndexError访问s[i1]时i1越界在所有s[i1]前加if i1 len(s):检查如元素名解析中if i 1 len(s) and s[i 1].islower():输出顺序错乱如O在C前未对counter.keys()排序检查print循环是否用sorted()包裹必须for elem in sorted(counter.keys()):递归深度超限罕见输入嵌套过深100层运行时加import sys; sys.setrecursionlimit(2000)本题输入≤100通常无需但调试时可临时启用5.2 我踩过的三个坑与独家避坑技巧坑1i的“悬空”状态第一次写时我在解析完元素后写了i 1但若元素是双字母Cai已加2再1就跳过了下一个字符。技巧所有i的推进必须由解析动作本身完成parse函数内绝不写i 1而是用i new_i赋值。例如解析Ca后i直接设为i2解析数字后i设为end_i。坑2默认数字的歧义H2O中O后无数字应为1但若O后是)如(HO)O后无数字也应为1。初版我写if no digit: cnt 1但忘了cnt是局部变量未写入counter。技巧统一用counter[elem] counter.get(elem, 0) (num if num else 1)将“无数字”逻辑收敛到一处避免分散判断。坑3括号匹配的“假成功”输入H2O)时解析H2O后i指向EOF但parse函数末尾return counter, i外部调用者不知括号未闭合。技巧在顶层调用parse(line, 0)后检查返回的i是否等于len(line)。若i len(line)说明有未处理字符大概率是多余右括号报错。此检查应在main()中添加if i ! len(line): raise ValueError(Unmatched brackets)。5.3 性能与可读性平衡技巧字符串切片 vs 索引访问全程用s[i]索引避免s[i:j]切片创建新字符串节省内存。CSP对空间敏感100字符输入虽小但习惯决定下限。字典合并优化不使用counter.update(inner_counter)因其不支持乘法改用for k,v in inner_counter.items(): counter[k] counter.get(k,0) v*multiplier显式可控。调试开关在parse函数内加# DEBUG: print(fDEBUG: {counter} at i{i})提交前用#注释掉比删代码更快捷。最后分享一个小技巧在CSP考试中若时间紧张可先写parse的骨架处理元素、括号、返回再补数字解析。因为无数字的输入如H2O已覆盖60%逻辑确保基础分到手。数字解析是锦上添花但必须做因样例Mg(OH)2含数字。我个人在实际操作中发现把这道题吃透后再处理JSON解析、HTML标签提取、甚至简单的SQL where条件解析思路都变得异常清晰——因为它们共享同一套“状态机递归下降”的底层范式。这个能力远比记住某个API重要得多。

相关新闻

fpinscala 第 7 章练习 3 深度解析:为 `Par.map2` 实现尊重超时的 Future 版本

fpinscala 第 7 章练习 3 深度解析:为 `Par.map2` 实现尊重超时的 Future 版本

示例工程 【免费下载链接】fpinscala Code, exercises, answers, and hints to go along with the book "Functional Programming in Scala" 项目地址: https://gitcode.com/gh_mirrors/fp/fpinscala 点击查看 免费下载 导读:本文围绕《Funct…

2026/10/13 16:14:32 阅读更多 →
安卓手机安装油猴(Tampermonkey)全流程指南:从浏览器选择到脚本管理

安卓手机安装油猴(Tampermonkey)全流程指南:从浏览器选择到脚本管理

想给安卓手机装油猴(Tampermonkey,也叫篡改猴),这事没有想象中复杂,但确实有不少人装到一半就翻车。手机浏览器和电脑浏览器架构不一样,网页脚本没法直接运行,你先得在手机里搭一个支持扩展的环…

2026/10/13 16:14:46 阅读更多 →
Dubbo核心概念深度解析:从服务暴露到集群容错实战指南

Dubbo核心概念深度解析:从服务暴露到集群容错实战指南

1. 为什么值得花时间啃透 Dubbo 的核心概念如果你正在维护一套服务数量超过十个的分布式系统,或者正准备把单体应用拆成微服务,那你大概率绕不开 Dubbo 这个名字。它是一款高性能的 Java RPC 框架,核心价值在于让远程调用像调用本地方法一样自…

2026/10/13 16:15:01 阅读更多 →

最新新闻

Cursor额度重置教程:设备指纹清理实现合规续杯

Cursor额度重置教程:设备指纹清理实现合规续杯

简介:本资源是面向软件开发者的 Cursor 编辑器 11 月续杯实战源码包,聚焦解决免费用户模型调用受限、账号续期繁琐等实际痛点,适用于中初级开发者快速提升 AI 编程效率。压缩包共 3 个文件,含 .inscode(Cursor 插件配置…

2026/10/13 19:38:20 阅读更多 →
用Claude Code摸清老项目技术栈:三轮提示词框架与实战记录

用Claude Code摸清老项目技术栈:三轮提示词框架与实战记录

“只管去写”系列到了第二天。今天的任务很明确:用Claude分析一个老项目的技术栈。这件事听起来远没有写一个新功能那么有成就感,但只要你接过大半年之前自己写的代码、接过离职同事留下的半成品项目、或者刚入职需要快速搞清一套业务系统的底细&#xf…

2026/10/13 19:38:20 阅读更多 →
开源协作的隐形基石:高效代码评审实践指南

开源协作的隐形基石:高效代码评审实践指南

做开源项目这几年,我越来越确信一件事:代码评审(code review)是整个协作链条里最被低估的一环。很多人觉得代码写完、测试跑通、合并进去就完事了,可真正把一个项目推过几个版本之后才发现,评审才是让代码质…

2026/10/13 19:38:20 阅读更多 →
Python pickle序列化实战:从协议版本到安全红线全解析

Python pickle序列化实战:从协议版本到安全红线全解析

如果你写过 Python,一定遇到过这类需求:程序跑完把内存里的字典、列表或者某个自定义类实例保存到磁盘,下次启动再原封不动读回来。Python 为此内置了一个序列化模块叫 pickle,标题说得很直白——Pickle 是 Python 内置的序列化模…

2026/10/13 19:38:20 阅读更多 →
AnyPS5:不越狱的PS5增强方案与边界协同架构

AnyPS5:不越狱的PS5增强方案与边界协同架构

项目标题:“AnyPS5”这个名称本身带有强烈的指向性与模糊性并存的特征——它既像一个技术代号,又像一句口号;既暗示兼容性、泛用性(“Any”),又锚定在特定硬件生态(“PS5”)。但问题…

2026/10/13 19:38:20 阅读更多 →
互联网大厂薪酬结构全解析:总包、级别、绩效与谈薪技巧

互联网大厂薪酬结构全解析:总包、级别、绩效与谈薪技巧

1. 先说结论:今年这个薪酬盘子到底什么情况每年这个节点,总有人拿着某头部互联网平台的薪酬截图或者 Offer 在各个群里问“这个数正常吗”。说实话,我在这一行摸爬滚打了十几年,带过团队、做过招聘、也背过绩效,今年这…

2026/10/13 19:37:19 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →