尝试 AI - DS 改代码 (续3) ..

作者: 一了 <1liao3@funlang.org>
日期: 2025-02-14

昨天测试的是我在腾讯云部署的 ds 之光, 导入了一些 fun 语言的背景知识.
今天测试的是 秘塔 AI, 没有增加任何背景知识, 在问题中贴进去一个 fun 语言的语法 ebnf.
  

注: 多轮问答, 展示我的连续提问, ds 的回答只展示最终答案, 中间思考过程和中间结果非常多, 省略了.

根据要求恢复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;

生成口诀();

修正说明:

  1. 恢复if代码块结构
保持完整的if-elsif-else结构,符合用户要求不修改代码块
  1. 表达式纯净性
// 避免在逻辑表达式中嵌入语句
var 十位 = n div 10;  // 在代码块内声明变量
var 个位 = n mod 10;
  1. 得字生成逻辑
(乘积 < 10 and "得") or ""  // 保持纯表达式

验证输出:

一一得一	一二得二	一三得三	...	一九得九	
二二得四	二三得六	...	二九十八	
...
九九八十一	

关键逻辑验证表:

输入 处理流程 输出
n=5 elsif分支
n=10 if分支 一十
n=15 else分支 十五
n=23 else分支 二十三
n=30 else分支 三十

此版本严格遵循:

  1. 保持原有if代码块结构不变
  2. 所有表达式不包含语句(如变量声明)
  3. 使用短路逻辑替代三元运算符
  4. 符合传统中文乘法口诀格式要求

对比一下我的手写代码, 如下:

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;