>_ 谬误台 // wondrous.top

首页 : /zh/t/puzzle/ : poisoned-wine

INKWIRE(7) reasoning puzzles INKWIRE(7)

poisoned-wine

一千瓶酒

十名囚犯,二十四小时,一瓶毒酒。

解题法
二进制编码:每位被试承载一个比特
发布
署名
阅读
3 分钟
归入
information

名称

题目

一场宴会需要 1000 瓶酒。其中恰好有一瓶被下了毒。毒药是无声的:在致命的一口之前没有任何症状,而且必定在摄入后整整 24 小时发作致死。

你有十名愿意参与的囚犯,以及一个 24 小时的窗口。没有人可以被喂第二次,也没有时间做第二轮测试。你必须确定地找出那瓶毒酒。

最直白的方案要用 999 名囚犯,违反约束。可行方案只用十名,它能成立,是因为答案不必靠「一个人一个人地读」来获得。

信号

条件与每个条件所强制的结论

# 条件 它强制了什么
1 1000 瓶中恰好一瓶有毒 答案是一个 1..1000 的下标,需要 10 个比特来编码(2^10 = 1024 ≥ 1000)
2 毒药在摄入后恰好 24 小时致死 所有试喝必须在同一时刻完成;窗口内不可能安排轮次先后
3 可动用十名囚犯 十个独立的「是/否」结果给出 2^10 = 1024 种可区分图案,刚好够用
4 一名囚犯可以喝很多瓶 允许混合,所以一名囚犯可以代表瓶子编号的一个比特:该位为 1 的每一瓶他都喝一口
5 死亡是明确的,且在 24 小时这个时点被观察到 死亡者的集合直接用二进制拼出编号,不需要进一步推断

例子

解题法

给每位试喝者一个比特。谁死谁活的集合不是需要解读的线索——它就是答案本身,用十名囚犯唯一能提供的字母表写成的答案。

[+] 完整解法 4

把瓶子编号为 0 到 999,用十位二进制写出每个编号。第 237 号瓶是 0011101101。

为每个比特位指派一名囚犯。囚犯 1 管 512 位,囚犯 2 管 256 位,依此类推到囚犯 10 管 1 位。对每一瓶酒,凡是在该瓶编号中对应比特为 1 的囚犯,都从这瓶喝一口。第 237 号瓶会交给囚犯 3、4、5、7、8、10。

等待 24 小时。把死亡情况读成一个二进制数:死的囚犯记 1,活的记 0。如果囚犯 3、4、5、7、8、10 死亡而其余存活,图案就是 0011101101,毒酒是第 237 号。

这个方案是精确的,因为「瓶子编号到死亡图案」的映射就是二进制表示本身,每一瓶都产生独一无二的图案。它只用到 1024 个图案中的 1000 个,所以编号 1000 到 1023 根本不会被用到。

近亲条目

[+] 补充与常见疑问 3
为什么恰好是十个人而不是九个?
九个人只有 2^9 = 512 种图案,少于 1000 瓶。十个人给出 1024 种,覆盖范围之外还剩 24 个空位。囚犯的人数就是所需的二进制位数。
如果有两瓶被下毒呢?
二进制方案会失效,因为死亡图案会变成两个编号的按位或,无法拆分。这时需要另一套编码——存在若干纠错码或组合设计方案,但它们都需要更多囚犯或更多轮次。
喝得越多死得越快吗?
本题假定剂量不影响时间。若毒药有时间-剂量效应,方案依然成立,因为每位试喝者平均喝下的口数相同,而时点仍然是同一个 24 小时。

适用范围 — 本题用于推理练习;上面的编码是信息上限的经典示例。