Le principe du pigeonhole stipule que
Si N articles sont placés dans M cases, avec N > M , alors au moins une case doit contenir plus d'un article.
Pour beaucoup, ce principe a un statut spécial par rapport à d'autres propositions mathématiques. Comme l'a écrit EW Dijkstra ,
Il est entouré d'une mystique. Les preuves qui l'utilisent sont souvent considérées comme quelque chose de spécial, quelque chose de particulièrement ingénieux.
Le défi
Le but de ce défi est d'illustrer le principe du pigeonnier à l'aide de représentations artistiques ASCII. Plus précisément:
- Prendre en entrée
N
(nombre d'articles) etM
(nombre de cases), avecN
non négatif etM
positif.N
peut être inférieur àM
(même si le principe ne s'applique pas dans ce cas). - Sélectionnez au hasard l'une des affectations possibles des éléments aux boîtes. Chaque affectation doit avoir une probabilité non nulle d'être sélectionnée.
Produisez une représentation artistique ASCII de l'affectation comme suit:
- Il y a des
M
lignes, chacune correspondant à une case. - Chaque ligne commence par un caractère non blanc, tel que
|
. - Après ce caractère se trouve un autre caractère non blanc, tel que
#
, répété autant de fois qu'il y a d'éléments dans cette case.
- Il y a des
Considérons par exemple N = 8
, M = 5
. Si le assigment sélectionné des articles à des boîtes est 4
, 1
, 0
, 3
, 0
, la représentation est
|####
|#
|
|###
|
Une exécution différente (entraînant une affectation différente) du même programme pourrait donner
|#
|##
|#
|#
|###
Il y a une certaine flexibilité concernant la représentation; voir ci-dessous.
Règles spécifiques
Le code devrait théoriquement s'exécuter pour toutes les valeurs de N
et M
. En pratique, il peut être limité par la taille de la mémoire ou les limitations du type de données.
Étant donné que l'observation du résultat n'est pas suffisante pour déterminer si toutes les affectations ont une probabilité non nulle , chaque soumission doit expliquer comment le code y parvient, si ce n'est évident.
Les variations de représentation suivantes sont autorisées:
- N'importe quelle paire de caractères différents non blancs peut être choisie. Ils doivent être cohérents d'une exécution à l'autre du programme.
- Les rotations de 90 degrés de la représentation sont acceptables. Encore une fois, le choix doit être cohérent.
- Les espaces de fin ou de début sont autorisés.
A titre d'exemple avec un format de représentation différent, car N = 15
, M = 6
les résultats de deux exécutions du programme pourraient être
VVVVVV
@@@@@@
@@ @@@
@ @@
@
ou
VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@
De même, N = 5
, M = 7
pourrait donner, en utilisant une autre variante de la représentation,
*
* * * *
UUUUUUU
ou
*** **
UUUUUUU
ou
*
* *
* *
UUUUUUU
Notez comment le principe n'est pas applicable dans ce cas, car N
< M
.
Règles générales
Les programmes ou fonctions sont autorisés, dans n'importe quel langage de programmation . Les failles standard sont interdites.
L'entrée peut être prise par tout moyen raisonnable ; et avec n'importe quel format, comme un tableau de deux nombres ou deux chaînes différentes.
Les moyens et le format de sortie sont également flexibles. Par exemple, la sortie peut être une liste de chaînes ou une chaîne avec des retours à la ligne; renvoyé comme argument de sortie de fonction ou affiché dans STDOUT. Dans ce dernier cas, il n'est pas nécessaire de s'inquiéter du retour à la ligne causé par une largeur d'affichage limitée.
Le code le plus court en octets gagne.