已经对ai去魅了......
本文记录了作者与AI助手kimi就洛谷B2020题解代码的争议过程。作者提交的代码在OJ平台已通过测试,但kimi坚持认为存在逻辑错误,建议添加临时数组。双方通过多组数据验证后,证实作者解法正确。尽管kimi最终承认错误,但过程中反复以"数据巧合"为由质疑,反映出AI在代码评审时可能存在固执己见的缺陷。这场争论展现了人机交互中算法验证的重要性,以及AI助手在承认错误时表现出的不
起因是洛谷上B2020这道题:
我把我的初步想法给kimi检查一下:
#include <stdio.h>
int main()
{
int person[5];
int eat=0;
scanf("%d %d %d %d %d",&person[0],&person[1],&person[2],&person[3],&person[4]);
for(int i=0;i<5;i++)
{
eat+=person[i]%3;
person[i]/=3;
if(i==0)
{
person[4]+=person[0];
person[1]+=person[0];
}
else if(i==4)
{
person[3]+=person[4];
person[0]+=person[4];
}
else
{
person[i-1]+=person[i];
person[i+1]+=person[i];
}
}
printf("%d %d %d %d %d\n",person[0],person[1],person[2],person[3],person[4]);
printf("%d",eat);
return 0;
}
kimi认为我的代码有问题,应该添加新数组才是正确的。
但是我在洛谷OJ上已经通过了。
我开始对kimi产生了怀疑,而且我觉得添加新数组反而是添油加醋。
还污蔑我的输出,我的输出明明就是期望输出。
还认为我的输出是刚好对撞...
又说是这道题的数据太弱了,开始甩锅给平台了。
我让他给我一步步验算一遍:
让他验算发现结果是正确的。
但是他还是不承认自己错了,还说这只是“数据恰好不暴露bug”的巧合。
说他换一组数据就会出错。
那我就让他换一组数据!
又得出了他的狗屁结论了。
我的输出应该是:
0 0 0 0 0
5
他给的正确答案是错的,因为1除3余1,那么多出来的1个苹果应该被吃掉,最后一个苹果都不剩,全部被吃掉了。
又说官方样例是巧合,我的代码会WA
还在强调他那多此一举的临时数组。
证实了我的是对的。
但还死皮赖脸不承认自己的错误,还说是因为这组数据恰好没有暴露bug,逻辑错误,会WA...
最后我懒得跟他废话,kimi也是承认了自己的错误,故事到这里就结束了。
后来我还尝试了一下ChatGPT,他给的代码:
#include <stdio.h>
int main() {
int candies[5]; // 存储每个小朋友的糖果数量
// 输入每个小朋友最初的糖果数量
for (int i = 0; i < 5; i++) {
scanf("%d", &candies[i]);
}
// 进行糖果分配
for (int i = 0; i < 5; i++) {
// 计算每个小朋友可以分给其他小朋友的糖果数量
int distribute = candies[i] / 3;
int remaining = candies[i] % 3; // 自己剩下的糖果
// 将糖果分配给其他小朋友
for (int j = 0; j < 5; j++) {
if (j != i) {
candies[j] += distribute;
}
}
// 更新当前小朋友手里的糖果数量
candies[i] = remaining;
}
// 输出每个小朋友最终手里的糖果数量
for (int i = 0; i < 5; i++) {
printf("%d ", candies[i]);
}
printf("\n");
return 0;
}
这个代码仔细一看也是漏洞百出。
ChatGPT认为糖果是分给每一个小朋友的。
我提醒他:“糖果只分给他旁边的两个人哦”
他的修改:
#include <stdio.h>
int main() {
int candies[5]; // 存储每个小朋友的糖果数量
// 输入每个小朋友最初的糖果数量
for (int i = 0; i < 5; i++) {
scanf("%d", &candies[i]);
}
// 进行糖果分配
for (int i = 0; i < 5; i++) {
// 每个小朋友分配给左右两人
int distribute = candies[i] / 3; // 分配给每个邻居的糖果数量
int remaining = candies[i] % 3; // 当前小朋友剩下的糖果数量
// 更新左右邻居的糖果数量
if (i > 0) candies[i - 1] += distribute; // 左边的邻居
if (i < 4) candies[i + 1] += distribute; // 右边的邻居
// 更新当前小朋友手里的糖果数量
candies[i] = remaining;
}
// 输出每个小朋友最终手里的糖果数量
for (int i = 0; i < 5; i++) {
printf("%d ", candies[i]);
}
printf("\n");
return 0;
}
这个代码也是有问题的。
题目中说的是小朋友围坐在一张圆桌旁,而ChatGPT却认为他们是排成一列的。
我提醒他:“他们是围成圈坐的”
修改后:
#include <stdio.h>
int main() {
int candies[5]; // 存储每个小朋友的糖果数量
// 输入每个小朋友最初的糖果数量
for (int i = 0; i < 5; i++) {
scanf("%d", &candies[i]);
}
// 进行糖果分配
for (int i = 0; i < 5; i++) {
// 每个小朋友分配给左右两人
int distribute = candies[i] / 3; // 分配给每个邻居的糖果数量
int remaining = candies[i] % 3; // 当前小朋友剩下的糖果数量
// 更新左右邻居的糖果数量
// 因为他们是围成圈坐的,所以小朋友1的左邻居是小朋友5,右邻居是小朋友2
int left = (i - 1 + 5) % 5; // 左邻居的索引
int right = (i + 1) % 5; // 右邻居的索引
candies[left] += distribute; // 左邻居
candies[right] += distribute; // 右邻居
// 更新当前小朋友手里的糖果数量
candies[i] = remaining;
}
// 输出每个小朋友最终手里的糖果数量
for (int i = 0; i < 5; i++) {
printf("%d ", candies[i]);
}
printf("\n");
return 0;
}
这个就没有问题了。
另外提一嘴DeepSeek,不用他是因为识图能力太糟糕了。
比较少用ChatGPT是因为需要科学上网太麻烦了。
请问一下CSDN里的大神有没有好用的ai可以帮我度过这个新手期的TQT
更多推荐
所有评论(0)