This is what I do after the kids go to bed and before Forensic Files.
I casually write code.
Claude vs ChatGPT: A Coder's Perspective on LLM Performance
Get link
Facebook
X
Pinterest
Email
Other Apps
-
In the rapidly evolving world of Large Language Models (LLMs), recent releases from OpenAI's ChatGPT have garnered significant attention. However, when it comes to coding tasks, Anthropic's Claude.ai continues to impress me with its speed and quality of output.
Benchmarking with LeetCode
While LeetCode problems aren't the definitive measure of an AI's coding capabilities (they're pre-designed puzzles, after all), they offer an interesting playground for comparison. Let's dive into a recent example:
3319. K-th Largest Perfect Subtree Size in Binary Tree
Medium
You are given the root of a binary tree and an integer k.
Return an integer denoting the size of the kthlargestperfect binarysubtree, or -1 if it doesn't exist.
A perfect binary tree is a tree where all leaves are on the same level, and every parent has two children.
Example 1:
Input:root = [5,3,6,5,2,5,7,1,8,null,null,6,8], k = 2
Output:3
Explanation:
The roots of the perfect binary subtrees are highlighted in black. Their sizes, in decreasing order are [3, 3, 1, 1, 1, 1, 1, 1]. The 2nd largest size is 3.
Example 2:
Input:root = [1,2,3,4,5,6,7], k = 1
Output:7
Explanation:
The sizes of the perfect binary subtrees in decreasing order are [7, 3, 3, 1, 1, 1, 1]. The size of the largest perfect binary subtree is 7.
Example 3:
Input:root = [1,2,3,null,4], k = 3
Output:-1
Explanation:
The sizes of the perfect binary subtrees in decreasing order are [1, 1]. There are fewer than 3 perfect binary subtrees.
Constraints:
The number of nodes in the tree is in the range [1, 2000].
1 <= Node.val <= 2000
1 <= k <= 1024
My Solution
I tackled this problem using a combination of Post-Order Depth-First Search (PO-DFS) and a Priority Queue. Here are the performance stats:
Runtime: 197 ms
Memory Usage: 103.6 MB
``` Marcelo's Solution:
public class Solution {
public int KthLargestPerfectSubtree(TreeNode root, int k)
{
PriorityQueue pQueue = new PriorityQueue(false, 2500);
Claude.ai consistently outperforms ChatGPT in this and other examples I've tested. Its approach:
Pruned version of PO-DFS
K-min Priority Queue
Performance:
Runtime: 164 ms
Memory Usage: 71.1 MB
``` Claude.ai Solution:
public class Solution
{
private PriorityQueue<int, int> topK;
private int k;
public int KthLargestPerfectSubtree(TreeNode root, int k)
{
this.k = k;
this.topK = new PriorityQueue<int, int>(k, Comparer<int>.Create((a, b) => a - b));
DFS(root);
return topK.Count == k ? topK.Peek() : -1;
}
private int DFS(TreeNode node)
{
if (node == null)
return 0;
int left = DFS(node.left);
int right = DFS(node.right);
if (left == right && IsPowerOfTwoMinusOne(left + right + 1))
{
int size = left + right + 1;
if (topK.Count < k)
{
topK.Enqueue(size, size);
}
else if (size > topK.Peek())
{
topK.Dequeue();
topK.Enqueue(size, size);
}
return size;
}
return -1;
}
private bool IsPowerOfTwoMinusOne(int n)
{
return (n & (n + 1)) == 0;
}
}
```
The Future of AI and Coding
It's astounding to think that we're only in the first decade of LLMs since the groundbreaking "Attention is All You Need" paper. The rapid progress we've seen raises exciting questions:
How will these models evolve in the coming decades?
What impact will they have on software development practices?
How can we best leverage AI assistants in our coding workflows?
As we continue to explore these questions, one thing is clear: the synergy between human creativity and AI capabilities is reshaping the landscape of software development.
Here's another one from the Google 30 Days challenge on LeetCode — 934. Shortest Bridge . The goal? Given a 2D binary grid where two islands (groups of 1s) are separated by water (0s), flip the fewest number of 0s to 1s to connect them. Easy to describe. Sneaky to implement well. 🧭 My Approach My solution follows a two-phase Breadth-First Search (BFS) strategy: Find and mark one island : I start by scanning the grid until I find the first 1 , then use BFS to mark all connected land cells as 2 . I store their positions for later use. Bridge-building BFS : For each cell in the marked island, I run a BFS looking for the second island. Each BFS stops as soon as it hits a cell with value 1 . The minimum distance across all these searches gives the shortest bridge. 🔍 Code Snippet Here's the core logic simplified: public int ShortestBridge(int[][] grid) { // 1. Mark one island as '2' and gather its coordinates List<int> island = FindAndMark...
A bit of vibe code together with OpenAI O3. I asked O3 to just generate the sieve due to laziness. Sieve is used to calculate the first M primes (when I was using Miller-Rabin, was giving me TLE). The DP follows from that in a straightforward way: calculate the numbers from i..n-1, then n follows by calculating the min over all M primes. Notice that I made use of Goldbach's Conjecture as a way to optimize the code too. Goldbach's Conjecture estates that any even number greater than 2 is the sum of 2 primes. The conjecture is applied in the highlighted line. Cheers, ACC. PS: the prompt for the sieve was the following, again using Open AI O3 Advanced Reasoning: " give me a sieve to find the first M prime numbers in C#. The code should produce a List<int> with the first M primes " Minimum Number of Primes to Sum to Target - LeetCode You are given two integers n and m . You have to select a multiset of prime numbers from the first m pri...
Not really an FSM problem since the state isn't changing, it is just defined by the current input. Simply following the instructions should do it. Using VSCode IDE you can also engage the help of Cline or Copilot for a combo of coding and vibe coding, see below screenshot. Cheers, ACC. Process String with Special Operations I - LeetCode You are given a string s consisting of lowercase English letters and the special characters: * , # , and % . Build a new string result by processing s according to the following rules from left to right: If the letter is a lowercase English letter append it to result . A '*' removes the last character from result , if it exists. A '#' duplicates the current result and appends it to itself. A '%' reverses the current result . Return the final string result after processing all char...
Comments
Post a Comment