# findings.md · 对拍记录（lab 0015）

这份记录是这一课的产物之一：**对拍到的东西要留证据**。判分第 4 层会读它。

## 1 · 原始反例

对拍抓到的那一组（`stress` 交回来的那一组，没缩过）：

    原始反例: a = [0, 0, 0, 0, 0], x = 0

## 2 · 最小反例

`shrink` 缩到底之后的那一组：

    最小反例: a = [0, 0, 0], x = 0

判分自己也会跑一遍 `shrink`，把它的结果和这里写的对照——两边一致才算对。
（它还会查这一组**再删一个元素就缩不动了**：缩不到底会被判成「还没缩到最小」。）

## 3 · 出错的行

`buggy.py` 里是哪一行导致的：

    出错的行: buggy.py 第 23 行

    为什么错: `lo` 与 `hi` 用的是闭区间 `[lo, hi]`，循环条件却写成 `while lo < hi`，
    于是区间只剩一格（`lo == hi`）时循环已经退出，那一格从没被检查过；
    循环之后又直接 `return -1`，连补救都没有。改成 `while lo <= hi`，
    或者把 `hi` 的初值写成 `len(a)`（左闭右开）配 `while lo < hi`，两种都行——
    错的是「闭区间」与「lo < hi」这两件事配在了一起。

（这就是第 14 课那三种错法里的第一种。别把 `buggy.py` 改掉，改完就对拍不出东西了。）

## 4 · 一句话

这次对拍里，是哪一个数据形态让 `buggy.py` 暴露出来的？

    全相同。

四个候选里，这一组 `[0, 0, 0, 0, 0] x=0` 属于「全相同」：值域压到一个数，
每一次比较都走「相等就交回」那一支，`mid` 一路被算到下标 2，而答案在下标 0 上；
区间缩到只剩一格时循环退出，那一格从没被检查。`gen_boundary` 的 `kind == 2` 那一支
（`v` 重复若干次、`x = v`）就是专门造它的——判分第 3 层那个「只在单元素 / 重复值上
出错」的假候选能被我这份生成器抓到，也是同一支的功劳。
