AI代码的特征(9.6更新)
2025-09-10 17:53:59
发布于:浙江
审核比赛的可以看这个(doge-作者更新下一期了!!!-------------------------------------------
请不要以自己作为某种特例来反驳这些AI所表现出的特征
AI的代码编辑本来就是按照程序员最科学严谨的方式编写的
所以,如果你遇到了与AI码风相似的情况
请不要以“我写代码就会有XXX条特征”的格式发表评论
有特例是正常的
作者更新了!!!
作者更新了!!!
作者更新了!!!
作者更新了!!!
作者更新了!!!
作者更新了!!!
作者更新了!!!
作者更新了!!!
作者更新了!!!
作者更新了!!!
作者更新了!!!
《人类代码的特征》
《人类代码的特征》
《人类代码的特征》
《人类代码的特征》
《人类代码的特征》
《人类代码的特征》
《人类代码的特征》
访谈
此为作者对某人的对话
此为作者对某人的对话此为作者对某人的对话
此为作者对某人的对话
此为作者对某人的对话
此为作者对某人的对话此为作者对某人的对话此为作者对某人的对话
此为作者对某人的对话
此为作者对某人的对话
此为作者对某人的对话
作者用的是乱七八糟的语言,AI看不懂(自带防伪
发现评论区一个很好玩的东西
*关注我,下期继续揭晓其他主题
如果有AIer把这一段喂给AI,也不需要担心;
管理会出手
本来就有很多人类也有的特征,喂给AI反而欲盖弥彰
后期修改的AIer我们这篇帖子也没辙
所以,你可以把这一篇当做识别AI的手段,或是当做水帖也可以
食用过AI的人总是能轻易的看出AI代码的特征,但是总有一些非常厉害的AIer。以下特征可以帮你揪出他们
1.几乎不用万能头
2.设置的变量很长,并经常带有下划线
例如:
人
int c,n;
string b;
AI
int count,number;
string bad_thing;
3.遇到黄题以上的题目,第一个代码是部分分甚至没分的。至少要让他修改到第二段代码以上才会正确。修改次数与题目难度有关
4.注释像是给别人看的
5.代码中的空格一个不缺,非常多
6.会运用一些大多数人所不知道的,老师不会讲的函数或运算符
7.基本只用vector动态数组
8.不会在主函数里写很多代码,基本都是void函数
9.有时候不加using namespace std;代码里全是std::
10.对题目的要求有时候会无视,自己创建
11.对于类似的、不同题目的代码,AI有时会认为是同一道题的
12.AI有时会越界判断,例如题目要求1<n<1e9,AI会判断为零的情况
13.AI 对返回值为 void 的函数通常不写 return;
14.AI对于格式这方面总是PE
15.相比于人类,AI会用我们基本不会用的指针和链表
16.部分AI生成for循环时会采用++i,但由于使用这个的人类比AI更多,所以不建议作为评判依据
17.for循环的一次性变量AI会使用不同变量名(大多数
18.AI在输出时可能使用三目运算符等方式确保不会输出行末空格
19.AI经常不必要地输出行末回车
20.AI基本不使用#define
21.AI基本不会将多个操作变量的语句间使用逗号分隔(如s-=a[i],k<<=2之间的)
22.AI经常创建变量存储接下来要用到的值,尽管这个值可能非常简单且使用很少(如多重背包的k*w[i])
23.一些AI的代码会在int main(){}上加一个空行
24.喜欢写类似于循环条件为char c:s之类
例如下面的深搜模版
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
// 递归实现模板
void dfs_recursive(int node, vector<bool>& visited, const vector<vector<int>>& graph) {
visited[node] = true;
// 处理当前节点(如输出、记录路径等)
cout << node << " ";
for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
dfs_recursive(neighbor, visited, graph);
}
}
}
// 迭代实现模板(显式栈)
void dfs_iterative(int start, const vector<vector<int>>& graph) {
vector<bool> visited(graph.size(), false);
stack<int> stk;
stk.push(start);
while (!stk.empty()) {
int node = stk.top();
stk.pop();
if (!visited[node]) {
visited[node] = true;
cout << node << " ";
// 逆序入栈保证顺序与递归一致
for (auto it = graph[node].rbegin(); it != graph[node].rend(); ++it) {
if (!visited[*it]) {
stk.push(*it);
}
}
}
}
}
int main() {
// 示例图结构(邻接表表示)
vector<vector<int>> graph = {
{1, 2}, // 节点0的邻居
{0, 3, 4}, // 节点1的邻居
{0, 5}, // 节点2的邻居
{1}, // 节点3的邻居
{1, 5}, // 节点4的邻居
{2, 4} // 节点5的邻居
};
cout << "递归DFS: ";
vector<bool> visited_rec(graph.size(), false);
dfs_recursive(0, visited_rec, graph);
cout << "\n迭代DFS: ";
dfs_iterative(0, graph);
return 0;
}
还有一种神秘方法:
对于聪明的AIer,我们可以把题目喂给每一个AI(目前基本是deepseek),然后核对所用方法是否一致
不用担心AIer把此篇喂给AI
这个是评论区一个人问AI后的结果
豆包:AI代码的特征
还挺有道理的
在信息学奥赛(如 NOIP、CSP、IOI 等)题目中,AI 生成的代码除了具备通用 C++ 代码的特征外,还会因竞赛场景的特殊性呈现一些更具体的表现,这些特征与人类选手的竞赛代码习惯形成鲜明对比:
对 “竞赛技巧” 的处理生硬
人类选手:擅长使用竞赛专用技巧,如位运算优化(lowbit、状态压缩)、常数级优化(循环展开、寄存器变量register)、输入输出加速(iossync_with_stdio(false);)等。
AI 生成代码:较少主动使用这些技巧,即使题目涉及大数据量,也可能默认用cin/cout而不加加速,或对可优化的循环保持 “朴素写法”。例如:
cpp
运行
// 人类可能的写法(加速输入)
ios::sync_with_stdio(false);
cin.tie(0);
// AI可能直接写
cin >> n; // 不做任何加速
算法选择 “模板化”,缺乏场景适配
人类选手:会根据题目数据范围灵活选择算法(如 n≤1e5 用 O (n log n),n≤1e4 用 O (n²)),甚至对同一问题混合使用多种算法(如 “小规模用暴力,大规模用 DP”)。
AI 生成代码:倾向于套用 “标准算法模板”,不考虑数据范围的边界情况。例如:
对 n≤100 的题目,可能依然实现复杂的线段树而非直接暴力;
对需要 “贪心 + 特判” 的题目,可能只实现纯贪心导致部分用例错误。
对 “题目隐藏条件” 的敏感度低
竞赛题目:常包含隐含约束(如 “数据保证无环”“输入为正整数”),人类选手会利用这些条件简化代码。
AI 生成代码:可能无视隐含条件,做冗余处理。例如:
题目明确 “树结构无环”,AI 仍在 DFS 中加入环检测代码;
题目说明 “k≤10”,AI 却按 k≤1e9 的情况实现复杂的二分逻辑。
代码 “健壮性过剩”,忽略竞赛效率
人类选手:在竞赛中优先保证效率,允许 “在题目约束内安全” 的不严谨(如默认数组开足够大,不检查动态内存分配失败)。
AI 生成代码:可能加入过多错误处理,导致超时。例如:
cpp
运行
// AI可能的写法(冗余检查)
if (i < 0 || i >= n || j < 0 || j >= m) {
cerr << "Invalid index" << endl;
exit(1);
}
// 人类选手可能直接写(依赖题目约束)
grid[i][j] = 1;
对 “输出格式” 的处理机械
竞赛题目:对输出格式要求严格(如 “每行末尾无空格”“多组数据空行分隔”),人类选手会针对性处理(如用变量记录是否为第一个元素)。
AI 生成代码:可能用统一模板处理(如三目运算符判断是否加空格),但容易在复杂场景(如多组测试用例)中出错,导致 PE(格式错误)。例如:
cpp
运行
// 处理多组输出时,AI可能多输出空行
for (int t=0; t<T; t++) {
solve();
cout << endl; // 最后一组也输出空行,导致PE
}
变量命名 “过度清晰”,不符合竞赛简洁性
人类选手:习惯用短名(n,m,k表示数据量,i,j表示循环,dp[i]表示动态规划数组),节省编码时间。
AI 生成代码:变量名冗长且与问题强绑定(如number_of_vertices max_weight_capacity),在竞赛中显得冗余。
对 “样例输入” 的依赖度高
人类选手:会分析题目逻辑,考虑边缘情况(如 n=0、数据全相同)。
AI 生成代码:若训练数据中缺乏特定边缘情况,可能只通过样例而忽略极端用例。例如:
题目要求处理 n=0 的情况,AI 代码可能因样例中 n≥1 而直接崩溃。
这些特征的核心原因是:AI 对竞赛场景的 “语境理解” 不足,只能基于通用编码规范和算法模板生成代码,而人类选手则会结合竞赛经验(效率优先、抓隐含条件、适配数据范围)进行针对性优化。在实际判题中,这些差异往往体现在 “AI 代码能通过部分样例但难拿满分”,而人类选手的代码则更贴合竞赛的 “应试逻辑”。
如有缺失,欢迎补充
//请把特征||AI代码发在评论区,如有代表性,会采取
此文章并不反对AI,但是不能不正当的运用AI
全部评论 138
看到第12条我蚌埠住了,每次我问WA助手我错哪,它老是问我是否考虑n为0,但是题目保证了1<n
2025-08-23 来自 上海
12这个真难绷
2025-08-24 来自 广东
2它还
不知好歹(友善)地表示“虽然题目保证了n>0,但是还是要判断一下n=0的情况”2025-08-24 来自 上海
6是的,有一次我用Prim做一道最小生成树,WA、TLE了,问AC助手它就提到了这点(后来我去问了老师,说Prim基本没法做)。
2025-08-26 来自 广东
1
作者没少用AI,这么熟悉AI的性质()
2025-08-29 来自 北京
4这些不是显而易见的吗
2025-08-29 来自 浙江
4!
2025-08-29 来自 上海
0
AI宁可用typedef,也不用define
2025-08-28 来自 浙江
4其实nxt_/new_/lst_这种还是经常有人用的,而那种sum加下划线的话一般会省略下划线,比如我会用sumx,但是会写nxt_time之类的。另外,那种什么beautiful_prime啊,total_a啊什么的基本就实锤AIer了
2025-08-31 来自 上海
3再说了多维不开vector你不MLE谁MLE
2025-08-31 来自 上海
4
上榜了
6662025-08-27 来自 浙江
3%%%
2025-08-27 来自 上海
02025-08-29 来自 浙江
1
666WA助手那张图片是我发的
1周前 来自 上海
2?66我摘的
1周前 来自 浙江
0
我发现用FittenCode Ai 喜欢用unordered_map 和unordered_set不用set或map
如下:unordered_map<string, double> vars = { {"a", 1.570796}, // π/2 ≈ 1.570796 {"b", 2} };
和:
// 预定义的函数名列表 unordered_set<string> predefinedFunctions = { "sin", "cos", "log", "cosh", "sinh", "tan", "abs" };
1周前 来自 上海
2除了极为若只的和正确率,几乎都中了
2025-08-28 来自 上海
2相比于人类,AI会用我们基本不会用的指针和链表¿
2025-08-28 来自 江西
0迭代器
2025-08-28 来自 上海
0
第23条不对啊,我就喜欢浪费行,看起来好看
2025-08-28 来自 浙江
2指的是大部分
2025-08-28 来自 浙江
0请勿钻牛角尖
2025-08-28 来自 浙江
0meto
2025-08-29 来自 广东
0
补充:广搜题不跟AI说是广搜它会写深搜代码
2025-08-23 来自 北京
2已补充
2025-08-23 来自 浙江
1最短路呢()
2025-08-29 来自 河北
0
我的ai是天天用万能头,但是不写
using namespace std;
后面都是
std::cout<<...;
十分无语。
2025-08-22 来自 广东
2已补充
2025-08-23 来自 浙江
0
ai会用迭代器,我们只会用auto i:var
4天前 来自 上海
1666我竟然晒在帖子里了
6天前 来自 上海
1看这儿!
6天前 来自 上海
0
要对ai进行简单的调控,并非一下搞定,得像这样:
我:请你揭开这道题!
ai:很像ai代码的代码
我:你给我遵守刚才的规则,避开ai,像人类!!!
ai:很像ai代码的代码
我:我:你给我遵守刚才的规则,避开ai,像人类!!!
ai:很像ai代码的代码
我:你给我遵守刚才的规则,避开ai,像人类!!!
ai:很像ai代码的代码
我:你给我遵守刚才的规则,避开ai,像人类!!!
ai:很像ai代码的代码
我:你给我遵守刚才的规则,避开ai,像人类!!!
ai:很像ai代码的代码
我:你给我遵守刚才的规则,避开ai,像人类!!!
ai:很像ai代码的代码最终:ai:这段代码
#include<iostream> #include<algorithm> using namespace std; struct T{ int num,score; }a[5005]; bool cmp(T x,T y){ return x.score>y.score||(x.score==y.score&&x.num<y.num); } int main(){ int n,m; cin>>n>>m; for(int i=0;i<n;i++) cin>>a[i].num>>a[i].score; sort(a,a+n,cmp); int line=a[m*3/2-1].score,k=0; while(k<n&&a[k].score>=line) k++; cout<<line<<" "<<k<<endl; for(int i=0;i<k;i++) cout<<a[i].num<<" "<<a[i].score<<endl; return 0; }
6天前 来自 上海
1看这儿!
6天前 来自 上海
0
这段是ai生成的
6天前 来自 上海
1紧急情况!!!!!!
#include<iostream> #include<algorithm> using namespace std; struct T{ int num,score; }a[5005]; bool cmp(T x,T y){ return x.score>y.score||(x.score==y.score&&x.num<y.num); } int main(){ int n,m; cin>>n>>m; for(int i=0;i<n;i++) cin>>a[i].num>>a[i].score; sort(a,a+n,cmp); int line=a[m*3/2-1].score,k=0; while(k<n&&a[k].score>=line) k++; cout<<line<<" "<<k<<endl; for(int i=0;i<k;i++) cout<<a[i].num<<" "<<a[i].score<<endl; return 0; }
6天前 来自 上海
1看这儿!
6天前 来自 上海
0
发现一个特征:AI在自动缩进时是4个空格而不是C++默认的Tab,这个应该也算吧
1周前 来自 江苏
1某些人类习惯用
and
和or
,不用&&
和||
,比如我1周前 来自 上海
1而AI必定用
&&
和||
1周前 来自 上海
1但显然这样做的人类更多,暂时无法作为依据。
1周前 来自 广东
0大概是学python的
1周前 来自 上海
0
不是我就不明白了,发不发题解和是否使用AI有什么关系,比如说我就是懒得发题解,难道我就是AI吗?
1周前 来自 广东
1我发了一堆题解,后来要在主页找我的一个帖子,找不到了,红温了,把tj全删了
1周前 来自 上海
0
AI在赋值
bool
类型变量时,会优先赋值ture
false
而不是1周前 来自 上海
1我就用true/false(虽然我知道正常人不用),因为加粗的字体我觉得好看
1周前 来自 上海
0
有帮助,赞一个