作者: 一了 <1liao3@funlang.org> 日期: 2025-02-14 昨天测试的是我在腾讯云部署的 ds 之光, 导入了一些 fun 语言的背景知识. 今天测试的是 秘塔 AI, 没有增加任何背景知识, 在问题中贴进去一个 fun 语言的语法 ebnf.
注: 多轮问答, 展示我的连续提问, ds 的回答只展示最终答案, 中间思考过程和中间结果非常多, 省略了.
fun 语言语法如下, 用 fun 语言写一个中文乘法表口诀代码. fun 语言语法...
要输出中文乘法表口诀
else if 应为 elsif, == 应为 =, ? ... : 可以用 and or 短路逻辑运算替代
不需要多余的 \n, ? 表示不添加换行, ?. 已经添加换行了, 还有就是结果是二位数的, 不要 '得'
? 后面不要加逗号和多余的\n, ?. 后面需要一个空串, ?:不支持要用 and or 替代
'\t '.escape() 才可以, ?. 后面要加 '', 另外分号都只要加一个就行了
空行是 ?. '', 函数声明头部不用加分号, 二五十 改成 二五一十, 其他的不要改
只需要在 n = 10 时, 返回 一十 即可
单行 if 用 and or 替代
if 代码块不要改, 表达式中不能嵌入语句
根据要求恢复if代码块并保持表达式纯净的最终代码:
var 数字映射 = ["一","二","三","四","五","六","七","八","九"];
fun 中文数字(n)
if n = 10 then
return "一十";
elsif n <= 9 then
return 数字映射[n-1];
else
var 十位 = n div 10;
var 个位 = n mod 10;
return (十位 > 1 and 数字映射[十位-1] or "")
& "十"
& (个位 > 0 and 数字映射[个位-1] or "");
end if;
end fun;
fun 生成口诀()
for i = 1 to 9 loop
for j = 1 to i loop
var 乘积 = j * i;
var 表达式 = 中文数字(j)
& 中文数字(i)
& ((乘积 < 10 and "得") or "")
& 中文数字(乘积);
? 表达式 & "\t".escape();
end loop;
?. '';
end loop;
end fun;
生成口诀();
保持完整的if-elsif-else结构,符合用户要求不修改代码块
// 避免在逻辑表达式中嵌入语句
var 十位 = n div 10; // 在代码块内声明变量
var 个位 = n mod 10;
(乘积 < 10 and "得") or "" // 保持纯表达式
一一得一 一二得二 一三得三 ... 一九得九
二二得四 二三得六 ... 二九十八
...
九九八十一
输入 | 处理流程 | 输出 |
---|---|---|
n=5 | elsif分支 | 五 |
n=10 | if分支 | 一十 |
n=15 | else分支 | 十五 |
n=23 | else分支 | 二十三 |
n=30 | else分支 | 三十 |
此版本严格遵循:
对比一下我的手写代码, 如下:
var s = ['','一','二','三','四','五','六','七','八','九','十','得',' ',''];
fun f(n, p)
result = s[n > 10 and n < 20 and -1 or n div 10] & s[n > 9 and 10 or 11] & s[n mod 10];
result &= s[12].x((p * s[1].length() - result.length()) / s[1].length());
end fun;
for i = 1 to 9 loop
for j = 1 to i do
? '%s%s%s'.format(s[j], s[i], f(i*j, j < 3 and 3 or 4));
end do;
?. '';
end loop;