Il principio del buco del piccione afferma che
Se N articoli vengono inseriti in caselle M , con N > M , almeno una casella deve contenere più di un articolo.
Per molti, questo principio ha uno status speciale rispetto ad altri enunciati matematici. Come ha scritto EW Dijkstra ,
È circondato da un po 'di mistica. Le prove che lo utilizzano sono spesso considerate qualcosa di speciale, qualcosa di particolarmente geniale.
La sfida
Lo scopo di questa sfida è di illustrare il principio del buco del piccione usando rappresentazioni d'arte ASCII. In particolare:
- Prendi come input
N
(numero di elementi) eM
(numero di caselle), conN
valori non negativi eM
positivi.N
può essere inferiore aM
(anche se il principio non si applica in quel caso). - Seleziona casualmente una delle possibili assegnazioni di elementi alle caselle. Ogni incarico dovrebbe avere una probabilità diversa da zero di essere scelto.
Produrre una rappresentazione in arte ASCII dell'incarico come segue:
- Ci sono
M
linee, ognuna corrispondente a una casella. - Ogni riga inizia con un carattere non bianco, ad esempio
|
. - A seguire quel personaggio c'è un altro personaggio non bianco, come
#
, ripetuto tante volte quante sono le voci in quella casella.
- Ci sono
Si consideri, per esempio N = 8
, M = 5
. Se l'assigment selezionato di elementi a scatole è 4
, 1
, 0
, 3
, 0
, la rappresentazione è
|####
|#
|
|###
|
Potrebbe dare una corsa diversa (risultante in una diversa assegnazione) dello stesso programma
|#
|##
|#
|#
|###
C'è una certa flessibilità riguardo alla rappresentazione; vedi sotto.
Regole specifiche
Il codice dovrebbe teoricamente essere eseguito per qualsiasi valore di N
e M
. In pratica, potrebbe essere limitato dalle dimensioni della memoria o dalle limitazioni del tipo di dati.
Dal momento che osservare l'output non è sufficiente per determinare se tutte le assegnazioni hanno probabilità diverse da zero , ogni invio dovrebbe spiegare come il codice lo raggiunge, se non ovvio.
Sono consentite le seguenti variazioni di rappresentazione :
- È possibile scegliere qualsiasi coppia di caratteri diversi da quelli non bianchi. Devono essere coerenti tra le esecuzioni del programma.
- Sono accettabili rotazioni di 90 gradi della rappresentazione. Ancora una volta, la scelta deve essere coerente.
- È consentito lo spazio bianco finale o iniziale.
Ad esempio con un diverso formato di rappresentazione, perché N = 15
, M = 6
i risultati di due esecuzioni del programma potrebbero essere
VVVVVV
@@@@@@
@@ @@@
@ @@
@
o
VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@
Analogamente, N = 5
, M = 7
potrebbe dare, utilizzando un'altra variante della rappresentazione,
*
* * * *
UUUUUUU
o
*** **
UUUUUUU
o
*
* *
* *
UUUUUUU
Nota come il principio non è applicabile in questo caso, perché N
< M
.
Regole generali
Programmi o funzioni sono consentiti, in qualsiasi linguaggio di programmazione . Sono vietate le scappatoie standard .
L'input può essere preso con qualsiasi mezzo ragionevole ; e con qualsiasi formato, come una matrice di due numeri o due stringhe diverse.
Anche i mezzi e il formato di output sono flessibili. Ad esempio, l'output può essere un elenco di stringhe o una stringa con newline; restituito come argomento di output della funzione o visualizzato in STDOUT. In quest'ultimo caso non è necessario preoccuparsi dell'avvolgimento della linea causato dalla larghezza del display limitata.
Vince il codice più breve in byte.