该鸽巢原理指出,
如果将N个项目放入M盒中,且N > M,则至少一个盒子必须包含一个以上的项目。
对于许多人来说,与其他数学运算相比,该原理具有特殊的地位。正如EW Dijkstra 写道,
它被一些神秘感所包围。使用它的证明通常被认为是特殊的东西,特别是巧妙的东西。
挑战
这项挑战的目的是使用ASCII艺术表示法来说明鸽洞原理。特别:
- 以输入
N
(项目数)和M
(框数)N
为正和非负M
。N
可能小于M
(即使该原则在这种情况下不适用)。 - 随机选择可能的项目分配到框之一。每个分配都应具有非零的被选概率。
生成分配的ASCII艺术作品表示,如下所示:
- 有几
M
行,每行对应一个框。 - 每行以非空白字符开头,例如
|
。 - 在该字符之后是另一个非空白字符,例如
#
,与该框中的项目重复的次数很多。
- 有几
例如考虑N = 8
,M = 5
。如果项盒中的所选赋值是4
,1
,0
,3
,0
,表示是
|####
|#
|
|###
|
相同程序的不同运行(导致不同的分配)可能会导致
|#
|##
|#
|#
|###
表示有一些灵活性;见下文。
具体规则
该代码应理论上任何值运行的N
和M
。实际上,它可能受内存大小或数据类型限制的限制。
由于观察输出不足以确定所有赋值是否具有非零概率,因此每个提交都应说明代码如何实现(如果不是很明显)。
允许以下表示形式的变化:
- 可以选择任何一对不同的非空白字符。它们在程序执行之间必须保持一致。
- 表示形式可以旋转90度。同样,选择必须是一致的。
- 允许尾随空格或前导空格。
以具有不同表示形式的示例为例,对于N = 15
,M = 6
该程序两次执行的结果可能是
VVVVVV
@@@@@@
@@ @@@
@ @@
@
要么
VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@
同样,N = 5
,M = 7
可以给,使用这种表示的另一种变体,
*
* * * *
UUUUUUU
要么
*** **
UUUUUUU
要么
*
* *
* *
UUUUUUU
请注意该原理在这种情况下不适用,因为N
< M
。
一般规则
可以通过任何合理的方式进行输入;并采用任何格式,例如两个数字或两个不同字符串的数组。
输出方式和格式也很灵活。例如,输出可以是字符串列表或带换行符的字符串。作为函数输出参数返回或显示在STDOUT中。在后一种情况下,不必担心由有限的显示宽度引起的换行。
以字节为单位的最短代码获胜。