**雪莉的生日**（英語：）是一個数学问题的非正式名稱，是新加坡及亞洲中學數學奧林比克競賽的題目，在2015年4月10日由江堅文（Kenneth Kong）貼上Facebook，之後在網路上爆紅，已獲得《紐約時報》、《衛報》、英国广播公司（BBC）的報導，出題者也相當意外。

在題目中，名叫雪莉（Cheryl）的女生給了她剛認識的朋友艾伯特（Albert）和柏納（Bernard）一些有關她生日的資訊，讀者要根據這些資訊及她朋友的回覆判斷雪莉的生日。

起源
--

此問題是由新加坡《獅城有約》的电视主持人江堅文貼上Facebook，之後有數千個回覆，包括一些有趣的回覆，例如認為雪莉根本不希望艾伯特和柏納知道她的生日，這一題引發了江堅文和他妻子的爭論，江堅文誤以為這是小學數學考試的一部份，且是針對5至6歲的儿童。江堅文後來更正這是2015新加坡及亞洲學校數學奧林匹克（SASMO）的題目，是針對14歲的學生設計。比賽在2015年4月8日舉行，有二萬八千名來自新加坡、泰國、越南、中國及英國的學生參加。SASMO的主辦人員表示，此問題是針對參賽者中的前40%，目的是為了「篩選出更好的學生」。SASMO的執行董事告訴BBC：「這樣的邏輯及分析思考可以用在生活上及工作中。」。

問題
--

此問題是在25個問題中的第24個，問題如下：

> 
> 艾伯特和柏納剛認識雪莉，想要知道雪莉的生日，雪莉列出了十個可能的日期：  
> 
> 5月15日、5月16日、5月19日、6月17日  
> 
> 6月18日、7月14日、7月16日、8月14日  
> 
> 8月15日、8月17日
> 
> 
> 接著雪莉分別告訴艾伯特及柏納她生日的月及日，以下是艾伯特和柏納的回應。
> 
> 
> * 艾伯特：我不知道雪莉的生日是哪一天，但我知道柏納也不知道
> * 柏納：一開始我不知道雪莉的生日，但現在我知道了
> * 艾伯特：那我也知道雪莉的生日了
> 
> 
> 請問谢丽尔的生日是那一天？
> 
> 
>

答案和解法
-----

谢丽尔的生日是7月16日。
其解法是推理的方式，刪去不可能的日期，這也是Alex Bellos在英國的《衛報》解出此題的方式：

可能的生日用表格方式條列如下，將同月的放在同一列，同日的放在同一欄：

| 5月 |  | 15 | 16 |  |  | 19 |
| --- | --- | --- | --- | --- | --- | --- |
| 6月 |  |  |  | 17 | 18 |  |
| 7月 | 14 |  | 16 |  |  |  |
| 8月 | 14 | 15 |  | 17 |  |  |

（第一句話）艾伯特：我不知道雪莉的生日是哪一天，但我知道柏納也不知道。
艾伯特知道的是月份，而每一個月都有一個以上的可能日期，不論艾伯特知道的月份是哪一個月，都不可能會知道雪莉的生日，第一句話的前半沒有提供有關生日的資訊。

柏納若要知道明確的生日日期，唯一的可能是生日日期的日在十個可能日期中只出現過一次，十個可能日期中，只有18日和19日各出現過一次，例如若柏納知道生日的日是18或是19，就可以立刻推理得到生日是6月18日或5月19日。

但艾伯特說他知道柏納也不知道生日是哪一天，因此可以推測他知道的月份是5月或6月以外的月份（即7月或8月），因為若是5月或6月，柏納有可能知道生日是哪一天。

（第二句話）柏納：一開始我不知道雪莉的生日，但現在我知道了
根據第一句話柏納可以推測月份是7月或8月，而他已經知道生日是哪一天，表示他知道的日是在7月或8月中只出現過一次的日，因此可以排除7月及8月可能生日中都有出現的14日，柏納知道的日可能是15日、16日或17日。

（第三句話）艾伯特：那我也知道雪莉的生日了
目前還有可能的生日是7月16日、8月15日及8月17日，而艾伯特在聽完第二句話就可以知道生日是哪一天，表示他知道的月份在7月16日、8月15日及8月17日中只出現一次。因此他知道的月份是7月，生日是7月16日。

答案是7月16日。

对题意的另一种理解
---------

除了上述答案外，有些人認為8月17日也是一個可能的答案。但新加坡及亞洲學校數學奧林匹克認為此答案無效。

### 存在争议之处

造成对题意存在不同理解的原因是题目的表述不够准确，至少在避免歧义方面做得不够完善。"但我**知道**柏纳也不知道"这一句的英文原文"but I **know** that Bernard doesn't know too"就存在此问题。所以这是一个英文语言表达与理解的问题。一些人觉得此处的"**知道**柏纳也不知道"是指"能很有把握地**猜测**柏纳也不知道"，而另一些人则认为应该是指"已经由某种方式**准确地知晓**柏纳确实不知道的**事实**"。其实**联系上下文就可以发现，出题人在文中此处所指（或暗示）的应该是前一种意思**，即艾伯特只是在进行"猜测"，而非已知晓部分事实。

一般来说，数理内容的叙述要尽量措辞准确，避免引起可能的歧义，但以此題來說，艾伯特是否事先知道有关柏纳所知的部分事实，会干扰他自己第一步的思路，从而将这个推理过程最终引向完全不同的方向，如下所示。

### 另一种理解的推理过程（版本1）

**（第一句话）艾伯特：我不知道谢丽尔的生日是哪一天，但我知道柏纳也不知道。**

艾伯特知道的是月份，而每一个月都有一个以上的可能日期，不论艾伯特知道的月份是哪一个月，都不可能会知道谢丽尔的生日，第一句话的前半没有提供有关生日的资讯。

柏纳若要知道明确的生日日期，唯一的可能是生日日期的日在十个可能日期中只出现过一次，十个可能日期中，只有18日和19日各出现过一次，例如若柏纳知道生日的日是18或是19，就可以立刻推理得到生日是6月18日或5月19日。因此，首先排除6月18日和5月19日这两天。

注意到，这时6月只剩下17日这一天。如果艾伯特知道的月份是6月，那么这时他已经知道了谢丽尔的生日。但艾伯特并不知道，所以又排除6月17日这一天。

**（第二句话）柏纳：一开始我不知道谢丽尔的生日，但现在我知道了。**

根据第一句，剩余的日期中，14日、15日和16日分别出现在两个月中，只有17日只出现在8月。现在柏纳知道了谢丽尔的生日，这表明柏纳知道的日期是17日，所以谢丽尔的生日是8月17日。

**（第三句话）艾伯特：那我也知道谢丽尔的生日了。**

艾伯特也知道只有17日是唯一的，因此在听到第二句话之后，艾伯特也知道了谢丽尔的生日是8月17日。

答案是8月17日。

### 另一种理解的推理过程（版本2）

下面假设"艾伯特在说第1句话时已经由某种方式**准确地知晓**柏纳确实不知道的**事实**"，并指出此情形下的解法以及与前一种情形的步骤差异。

如果艾伯特在第1次讲话前事先被人明确告知柏纳根据自己所知的日期推不出生日，则第1步可排除18日与19日。但是此情形下柏纳得知的日期是仍有可能属于5月或6月的，只不过不可能是在18日或19日。（与在第1步就可排除掉2行的上1种情况相比，区别在于在此情形的第1步只能排除2个可能选项。换句话说，这一种情形下在第1步排除的选项要少很多。）而在排除18日与19日后，在剩下的选项中，仅有6月17日可由月份数唯一确定。但此时艾伯特作出了"我还不知道"的判断。说明生日也不可能在6月17日。

足够聪明的柏纳也是这么想的。而且在听到艾伯特还推不出生日时，表示自己已经推出了答案。说明在上一步所剩的各个选项中，已经能由日期唯一地确定出生日，但尚不能仅月份确定。也就是说，在剩下来的选项中，生日的月份数一定出现了不只一次，但日期数一定只出现了一次。唯一符合这条件的选项只有8月17日。（14日、15日、16日都在不同月份中出现了2次，仅17日出现了1次（出现在8月）；另外，8月此时也确实有3个不同的候选日期。故生日应为8月17日。）

### 2种情形的解法步骤比较

对比**7月16日**和**8月17日**两种答案的推理过程，可以知道：

* 根据**第一句话**首先排除的是5月和6月这两个月份，而不仅仅是5月19日和6月18日这两天。
* **8月17日**的推理过程隐含了对**第一句话**的错误理解，即理解成了"因为艾伯特知道柏纳不知道谢丽尔的生日是哪一天，所以艾伯特也不知道"。6月17日就因为这种理解被排除的。而第一句话的正确理解是"艾伯特不知道谢丽尔的生日是哪一天，**并且**柏纳也不知道"。
* 由于对**第一句话**内在逻辑的不同理解，出现了版本1；又由于对**"知道（know）"**一词的不同理解，出现了版本2。

以下各表中以"×"号表示因被排除而被划去的日期。为美观起见，实际操作时，各表还可以简写为数阵的形式。

| 步骤 | 情形1 | 情形2（不同的题意理解） |
| --- | --- | --- |
| 第一步结果 | 

| 5月 |  | \times | \times |  |  | \times |
| --- | --- | --- | --- | --- | --- | --- |
| 6月 |  |  |  | \times | \times |  |
| 7月 | 14 |  | 16 |  |  |  |
| 8月 | 14 | 15 |  | 17 |  |  |

这一步如果用矩阵语言表述，就是找出独占一列的元素"18日"与"19日"，并根据题意排除它们及其所在行，即划去它们的所在行。 | 

| 5月 |  | 15 | 16 |  |  | \times |
| --- | --- | --- | --- | --- | --- | --- |
| 6月 |  |  |  | 17 | \times |  |
| 7月 | 14 |  | 16 |  |  |  |
| 8月 | 14 | 15 |  | 17 |  |  |

这一步如果用矩阵语言表述，就是找出独占一列的元素"18日"与"19日"，并根据题意排除它们，即划去这2个元素。（不划去所在行的其它元素。） |
| 第二步结果 | 

| 5月 |  | \times | \times |  |  | \times |
| --- | --- | --- | --- | --- | --- | --- |
| 6月 |  |  |  | \times | \times |  |
| 7月 | \times |  | 16 |  |  |  |
| 8月 | \times | 15 |  | 17 |  |  |

上一步完成后，现在只剩下7月和8月这2个可选的月份，即余下的矩阵的行秩为2。这一步的做法用矩阵语言表述就是在余下的矩阵中找出并划去行满秩的列（向量），即划去同时出现在7月和8月的"14日"。因为此时的行满秩向量不能仅由日期做出判断，与题意中"柏纳已经在这一步可由日期唯一推知生日"这一事实不符，故被整列地排除掉。 | 

| 5月 |  | 15 | 16 |  |  | \times |
| --- | --- | --- | --- | --- | --- | --- |
| 6月 |  |  |  | \times | \times |  |
| 7月 | 14 |  | 16 |  |  |  |
| 8月 | 14 | 15 |  | 17 |  |  |

这一步仍是对艾伯特所说的第1句话的推断。因在上一步操作后，剩下了一个"6月17日"可由月份唯一确定，但艾伯特又肯定说自己还推不出日期，所以"6月17日"可以排除。这一步的做法用矩阵语言表述就是在余下矩阵中找出只在各行出现一次的日期（此例中是"17日"，它是6月里唯一出现的日期），并划其所在行。 |
| 第三步结果 | 

| 5月 |  | \times | \times |  |  | \times |
| --- | --- | --- | --- | --- | --- | --- |
| 6月 |  |  |  | \times | \times |  |
| 7月 | \times |  | 16 |  |  |  |
| 8月 | \times | \times |  | \times |  |  |

艾伯特在第2次发言时已表示自己也可推出生日，说明在余下的选项中，已经可以由月份唯一确定出生日。这一步的做法用矩阵语言表述就是在余下的矩阵中找出只在各行出现一次的日期（此例中是"16日"，它是7月里唯一出现的日期），并划去其余的行。 | 

| 5月 |  | \times | \times |  |  | \times |
| --- | --- | --- | --- | --- | --- | --- |
| 6月 |  |  |  | \times | \times |  |
| 7月 | \times |  | \times |  |  |  |
| 8月 | \times | \times |  | 17 |  |  |

柏纳发言时已表示自己也可推出生日，说明在余下的选项中，已经可以由日期唯一确定出生日。这一步的做法用矩阵语言表述就是在余下的矩阵中找出只在各列出现一次的日期（此例中是"17日"，它只在8月出现），并划去其余的列。
注意**在这种情形中，艾伯特的第2次发言是多余条件**。但艾伯特的第1次发言在推断中应用了2次。 |

### 由此引申出的矛盾

通过以上推理，可以总结出：如果艾伯特是"猜测"到柏纳不知道谢丽尔的生日，那么不论日期为15日、16日还是17日，柏纳在听到第一句话后都能"猜测"出谢丽尔的生日；而如果艾伯特"已经由某种方式准确地知晓柏纳确实不知道的事实"，那么只有当日期为17日时，柏纳才能在听到第一句话之后知道谢丽尔的生日。

于是有了这样一种可能，先假定以下三点：

* 艾伯特确实"已经由某种方式准确地知晓柏纳确实不知道的事实"，因此说了第一句话；
* 柏纳却把第一句话理解成了艾伯特"能很有把握地猜测柏纳也不知道"；
* 谢丽尔的生日是8月15日，告诉了艾伯特8月，又告诉了柏纳15日。

然后，柏纳听到第一句话之后"猜测"出谢丽尔的生日是8月15日，因此说了第二句话。艾伯特按自己的理解说了第三句话，但其实他以为谢丽尔的生日是8月17日。这便是矛盾之处。

实际上，艾伯特在知道8月的情况下，即使不存在"某种方式"，他也可以知道柏纳也不知道。然而，由于"某种方式"的存在，使得艾伯特忽略了这一点。另一方面，柏纳或许没有想到"某种方式"的存在，因而与艾伯特产生误会。

最后，柏纳甚至可能对艾伯特说第四句话："你怎么知道是15日还是17日的？"

推广
--

本题可抽象和推广为一类在层层递进的限制条件下，从高维向量空间的有限点集中筛选特定点的问题。为保证问题可解且有唯一的解，作为猜测范围的有限点集必须是精心选取的。

这里以4维情况为例作一个说明。X先生从4维欧几里德空间\mathbb{R}^4中精心挑选出一个点集A作为参考范围（要保证谜题可解），再从A中挑选出一个特定的点x作为猜测对象。X先生取\mathbb{R}^4的标准基（英语：）作为参考基底，从而A中各点都有了唯一的坐标数值。设点x在标准基下的坐标表示为{\displaystyle x=(x\_{1},x\_{2},x\_{3},x\_{4})}。X先生将x\_1写在纸片上递给了甲，将x\_2写在纸片上递给了乙，将x\_{3}写在纸片上递给了丙，将x\_4写在纸片上递给了丁。然后由4人轮流或自由发言，但只能谈及自己是否能准确推知x的所有坐标值，或者是否能有把握地预测另一人的推断结果。这里还需要假定这4个参与者都足够聪明，且都在积极思考答案。当所有人都确信自己已可推出答案时（即此问题可解时），再由读者来推断x的坐标。

上例所示的4维点集筛选问题可自然地推广至n维。当n=2时，此类问题可用列出数表的方法（先列出一个包含所有参考选项的2维数表，再根据题设条件一步一步划去不符合题意的选项）求解。n≥3时，考察集合已难以用简洁的数表描述，但可视作n维数组或n阶张量（考察集合是点集，点集的坐标当然符合张量变换规律，所以可视作张量），并易于利用计算机编程求解。以2维点集的筛选为例，其算法大体上就是先根据说话人的描述对象（是自己的猜测还是对别人的猜测）所属的组别确定是筛选行向量还是列向量，并根据说话人的判断情况选择是划去选出的子向量组还是划去未选中的向量组。然后根据说话人的发言顺序逐步循环筛选下去。因为对话数量是有限的，所以只要题目所设条件信息充分，在有限步骤内一定可以完成筛选循环。求解答案的算法实际上也是判断可解性的算法，如果到最后一个条件用完后还算不出答案，那么原题一定无解。

除参考集合可以推广至高维向量空间外，求解的对象也可由一个点推广为多个点。即求解A的某个元素变为求解A的某个子集。当求解的点数增多时，与直接靠脑力思考的方法相比，代数方法仍具有判断速度快和可程序化处理的优势。

另见
--

* 和與積的問題

参考资料与脚注
-------

1. ↑  又譯雪莉、雪露、雪瑞兒、謝麗爾等。

1. 1 2 . CBC News. 14 April 2015  [15 April 2015]. （原始内容存档于2015-04-18）.
2. ↑ .  [2015-04-21]. （原始内容存档于2015-04-17）.
3. ↑ .  [2015-04-23]. （原始内容存档于2015-04-22）.
4. 1 2  Bellos, Alex.. The Guardian. 13 April 2015  [15 April 2015].
5. ↑  Withnall, Adam.. The Independent. 13 April 2015  [15 April 2015]. （原始内容存档于2015-04-15）.
6. ↑  Carter, Claire; Gray, Richard; Harding, Eleanor.. Mail Online. 15 April 2015  [15 April 2015]. （原始内容存档于2015-04-21）.
7. ↑ .  [2015-04-21]. （原始内容存档于2015-04-21）.
8. ↑  Dua, Ruchi.. India Today. 15 April 2015  [15 April 2015]. （原始内容存档于2015-04-17）.
9. ↑  Chang, Kenneth.. The New York Times. 14 April 2015  [15 April 2015]. （原始内容存档于2015-04-20）.
10. ↑  Bellos, Alex.. The Guardian. 13 April 2015  [15 April 2015]. （原始内容存档于2015-04-21）.
11. ↑ . 聯合新聞網. 15  [2015-04-27]. （原始内容存档于2015-04-18）.  请检查`|date=`中的日期值 (帮助)
12. ↑  Grime, James.. The Guardian. 15 April 2015  [15 April 2015]. （原始内容存档于2015-04-21）.