Принцип голубиной дыры гласит, что
Если 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. В последнем случае не нужно беспокоиться о переносе строк, вызванном ограниченной шириной экрана.
Самый короткий код в байтах побеждает.