El principio del casillero establece que
Si N elementos se colocan en cuadros M , con N > M , entonces al menos un cuadro debe contener más de un elemento.
Para muchos, este principio tiene un estado especial en comparación con otros enunciados matemáticos. Como EW Dijkstra escribió :
Está rodeado de alguna mística. Las pruebas que lo utilizan a menudo se consideran algo especial, algo particularmente ingenioso.
El reto
El propósito de este desafío es ilustrar el principio del casillero utilizando representaciones artísticas ASCII. Específicamente:
- Tomar como entrada
N
(número de elementos) yM
(número de cuadros), conN
no negativo yM
positivo.N
puede ser menor queM
(incluso si el principio no se aplica en ese caso). - Seleccione aleatoriamente una de las posibles asignaciones de elementos a cuadros. Cada tarea debe tener una probabilidad distinta de cero de ser elegida.
Produzca una representación artística ASCII de la tarea de la siguiente manera:
- Hay
M
líneas, cada una correspondiente a un cuadro. - Cada línea comienza con un carácter que no es un espacio en blanco, como
|
. - Después de ese carácter hay otro carácter que no es un espacio en blanco, por ejemplo
#
, repetido tantas veces como haya elementos en ese cuadro.
- Hay
Consideremos, por ejemplo N = 8
, M = 5
. Si el assigment seleccionada de artículos a las cajas se 4
, 1
, 0
, 3
, 0
, la representación es
|####
|#
|
|###
|
Una ejecución diferente (que resulta en una asignación diferente) del mismo programa podría dar
|#
|##
|#
|#
|###
Hay cierta flexibilidad con respecto a la representación; vea abajo.
Reglas específicas
El código debería ejecutarse teóricamente para cualquier valor de N
y M
. En la práctica, puede estar restringido por el tamaño de la memoria o las limitaciones del tipo de datos.
Dado que observar el resultado no es suficiente para determinar si todas las asignaciones tienen una probabilidad distinta de cero , cada envío debe explicar cómo el código logra eso, si no es obvio.
Se permiten las siguientes variaciones de representación :
- Se puede elegir cualquier par de caracteres diferentes que no sean espacios en blanco. Deben ser consistentes en todas las ejecuciones del programa.
- Las rotaciones de 90 grados de la representación son aceptables. Nuevamente, la elección debe ser consistente.
- Se permite el espacio en blanco al final o al final.
Como ejemplo con un formato de representación diferente, para N = 15
, M = 6
los resultados de dos ejecuciones del programa podrían ser
VVVVVV
@@@@@@
@@ @@@
@ @@
@
o
VVVVV
@@@ @
@@@ @
@ @ @
@ @ @
@
Del mismo modo, N = 5
, M = 7
podría dar, utilizando otra variación de la representación,
*
* * * *
UUUUUUU
o
*** **
UUUUUUU
o
*
* *
* *
UUUUUUU
Tenga en cuenta que el principio no es aplicable en este caso, porque N
< M
.
Reglas generales
Se permiten programas o funciones , en cualquier lenguaje de programación . Las lagunas estándar están prohibidas.
La entrada puede tomarse por cualquier medio razonable ; y con cualquier formato, como una matriz de dos números o dos cadenas diferentes.
Los medios de salida y el formato también son flexibles. Por ejemplo, la salida puede ser una lista de cadenas o una cadena con líneas nuevas; devuelto como argumento de salida de función o mostrado en STDOUT. En este último caso, no es necesario preocuparse por el ajuste de línea causado por el ancho limitado de la pantalla.
El código más corto en bytes gana.