Принцип голуби говорить, що
Якщо 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. В останньому випадку не варто турбуватися про обертання рядків, викликане обмеженою шириною дисплея.
Найкоротший код у байтах виграє.