虽然一次周赛的几个题目说明不了太多问题,比如这个周赛的Hard题目就是板子题,算不上Hard,也许把第三题和第四题的顺序换一下比较合适。但是,GPT4的表现已经严重超出了我的预期。对于这次周赛的四个题目,GPT4的表现如下:题目1: 错了一次,简单提示后修正了错误,2A了。题目2: 1A。题目3: 无法通过提示的方法让GPT4做对,WA。题目4: 1A。不得不说,GPT4在模拟,模板题方面已经具备了不错的理解和处理能力,感觉在更强大的数据和更大模型的加持下以后大语言模型的做题能力能赶上一大半人类。| 从提升算法能力的角度来说,我不建议任何读者使用GPT4来做Leetcode。
0x0. 前言
GPT4论文(https://cdn.openai.com/papers/gpt-4.pdf)的第4节展示了GPT4的各种能力,在表格的最后三行展示了GPT4做Leetcode的能力,我比较感兴趣,所以本文打算来探索一下这种能力。看一下GPT4配合一个只发出prompt的人的表现如何。
为了公平起见,我这里选取了LeetCode第 102 场双周赛(https://leetcode.cn/contest/biweekly-contest-102/)也就是2023年4月15日的这一场。我打算用GPT4来尝试解开这场周赛的4道题目,但是不一定能都解开,只是测试一下GPT4的写算法的能力。
我将全程只指挥GPT4写代码来解题,我自己不做任何的Coding工作。
先建立一个GPT4的新对话:
0x1. 第一题
第一题是个Easy的题目,描述如下:
接下来,我们先把题面输入到GPT4。
GPT4给了我们一个回复,感觉挺对的,但是这种格式不能让Leetcode直接通过,我们再让GPT4更新一下格式:
接下来就是紧张的时刻,我们把这个类的代码提交给Leetcode。
结果错误,Leetcode返回了错误的例子。我们把这个错误的例子再返回给GPT4让它自己debug。
我们把它修正后的代码提交给Leetcode。
现在GPT4顺利通过了第一道题目。
0x2. 第二题
我们问一下GPT4
我们提交给Leetcode试试。
直接通过,GPT4真有点强。
0x3. 第三题
问问GPT4:
这个问题感觉还是比较麻烦的,GPT4给出的方案感觉一眼假,不过我们不妨运行一下它给的代码。
我们发现编译就报错了。我们返回这个结果给GPT4:
现在确实可以编译了,但我们发现这个程序连样例都无法通过。显然,GPT4根本没有理解这道题目的意思,结果倾向于是“胡说八道”。再加强一些提示:
最后GPT4输出的代码仍然无法通过样例。这道题,GPT4应该是无能为力了。
从这道题目,我们可以看到GPT4的局限性,那就是对于这种思维性的题目,GPT4很难理解这道题目暗含的意思,设计的算法也是错误的。
题解可以参考:https://leetcode.cn/problems/cousins-in-binary-tree-ii/solution/bfssuan-liang-ci-pythonjavacgo-by-endles-b72a/
0x4. 第4题
接下来我们看一下第4题,这个题是比较模板的题,我们看一下GPT4能否解开。
我们来看一下GPT4给出的答案能否通过样例。
是可以通过给出的样例的。我们提交试试。
这道题GPT4的完整代码实现如下:
class Graph {
public:
Graph(int n, vector<vector<int>>& edges) {
this->n = n;
for (const auto& edge : edges) {
adjList[edge[0]].push_back({edge[1], edge[2]});
}
}
void addEdge(vector<int> edge) {
adjList[edge[0]].push_back({edge[1], edge[2]});
}
int shortestPath(int node1, int node2) {
vector<int> dist(n, INT_MAX);
dist[node1] = 0;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push({0, node1});
while (!pq.empty()) {
int currNode = pq.top().second;
int currDist = pq.top().first;
pq.pop();
if (currNode == node2) return currDist;
if (currDist > dist[currNode]) continue;
for (const auto& neighbor : adjList[currNode]) {
int nextNode = neighbor.first;
int edgeCost = neighbor.second;
if (currDist + edgeCost < dist[nextNode]) {
dist[nextNode] = currDist + edgeCost;
pq.push({dist[nextNode], nextNode});
}
}
}
return -1;
}
private:
int n;
unordered_map<int, vector<pair<int, int>>> adjList;
};
虽然这道题很难说是Hrad的难度,但1A真的太吓人了。。。
0x5. 总结+预测
虽然一次周赛的几个题目说明不了太多问题,比如这个周赛的Hard题目就是板子题,算不上Hard,也许把第三题和第四题的顺序换一下比较合适。但是,GPT4的表现已经严重超出了我的预期。
对于这次周赛的四个题目,GPT4的表现如下:
题目1: 错了一次,简单提示后修正了错误,2A了。
题目2: 1A
题目3: 无法通过提示的方法让GPT4做对,WA。
题目4: 1A。
不得不说,GPT4在模拟,模板题方面已经具备了不错的理解和处理能力,感觉在更强大的数据和更大模型的加持下以后大语言模型的做题能力能赶上一大半人类。| 从提升算法能力的角度来说,我不建议任何读者使用GPT4来做Leetcode。