Python技术迷

英伟达同事圈,有员工表示,今天在找bug中再次输给了 claude,以后只能去当电工了

英伟达员工都开始被 Claude 打到怀疑人生了,这乐子一下就大了。帖子里那句“找 bug 又输给 Claude,以后只能去当电工了”,看着像玩笑,其实一股子班味都飘出来了:以前是同事卷你,现在是模型顺手把你也卷了。

Image

但这事扎心就扎心在这儿。程序员以前最硬的那点本事,现在被 AI 拿来当基础功能展示了。你还在吭哧吭哧翻日志,人家已经把可能原因列三条,顺手给你补个 patch。HR 看完这种帖子,估计眼皮都跳一下:以后招人是不是得先看你会不会跟模型配合干活。

嘴上说去当电工,真到下班点,大家八成还是默默把 Claude 打开。

算法题:倒水

两个杯子摆在那儿,看着像小学题,真写代码时最容易犯的错反而不是不会做,是一上来就开始手搓倒水过程,写着写着把自己绕进去。这个题我第一眼一般不先算公式,先看状态。因为“倒水”本质不是倒了几次,而是当前两个杯子里各有多少水。

假设有两个水壶,容量分别是 x 和 y,目标是量出 target。那一个状态其实就是 (a, b),表示当前两个壶里的水量。接下来能做的动作无非 6 个:装满 A、装满 B、清空 A、清空 B、A 倒给 B、B 倒给 A。

这题最稳的写法是 BFS。原因很直接:每次扩展一层,就是多操作一步。你第一次碰到目标状态时,那条路天然就是最少步数。现场里这种题我一般不太信 DFS,尤其一堆分支还会重复绕回去,不加剪枝很容易跑偏。

代码我自己一般会这么写,短一点,够用:

from collections import deque

defmin_steps(x: int, y: int, target: int) -> int:
if target > x + y:
return-1
if target == 0:
return0

    q = deque([(0, 0, 0)])  # a, b, step
    visited = {(0, 0)}

while q:
        a, b, step = q.popleft()
if a == target or b == target or a + b == target:
return step

        nxt = [
            (x, b),                  # 装满A
            (a, y),                  # 装满B
            (0, b),                  # 清空A
            (a, 0),                  # 清空B
        ]

        move = min(a, y - b)         # A -> B
        nxt.append((a - move, b + move))

        move = min(b, x - a)         # B -> A
        nxt.append((a + move, b - move))

for state in nxt:
if state notin visited:
                visited.add(state)
                q.append((state[0], state[1], step + 1))

return-1

拿经典例子试一下,3 升和 5 升,目标 4 升:

print(min_steps(3, 5, 4))  # 6

这 6 步不难还原:装满 5,倒给 3,清空 3,再倒,继续装满 5……最后能得到 4。过程不用硬背,程序自己会搜出来。

这题还有个常见优化判断:如果 target % gcd(x, y) != 0,那一定无解。这个结论很硬,因为你每次操作本质上都在做容量之间的线性组合,凑不出最大公约数的倍数,后面怎么倒都白搭。

from math import gcd

defcan_measure(x: int, y: int, target: int) -> bool:
if target > x + y:
returnFalse
return target == 0or target % gcd(x, y) == 0

面试里如果只问“能不能量出来”,直接上最大公约数就行,快得很。要是继续追问“最少几步”,那还是老老实实 BFS。这个题不复杂,但很适合看一个人有没有把问题先压成状态,再去写代码。很多题卡的不是算法,是下手顺序。