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