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.
Respuestas:
Gelatina ,
98 bytesEste es un enlace diádico que toma M como su argumento izquierdo y N como su argumento derecho. La salida es una matriz de enteros, donde 0 representa palomas y 1 representa agujeros.
Pruébalo en línea!
Cómo funciona
fuente
Mathematica, 68 bytes
Una función sin nombre que toma dos argumentos enteros, el número de cuadros, seguido del número de elementos.
Primero calcula todas las particiones posibles
N+M
enM
partes exactamente positivas, y luego resta1
de cada partición. Esto nos da todas las particiones posiblesN
enM
partes no negativas (que deIntegerPartitions
otro modo no se generarían). Luego elige una partición aleatoria y barajala. Esto garantiza que todas las particiones ordenadas posibles con ceros estén permitidas. Finalmente, convierta cada bin de la partición en una línea de salida elevando 10 a la potencia correspondiente (de modo que cada línea se convierta1000...
enk
ceros). Un resultado de ejemplo podría verse así:fuente
PadRight
que no rellenaría aM
ceros siN
<M
.PadRight
la falta de lista la haría mucho más larga.PadRight
seríaIntegerPartitions[#,{#2},0~Range~#]
.Python 2,
7786 bytesGenera un número en [0, n], imprime esa cantidad de elementos y lo resta de n. Hace esto m veces.
Esto hace que sea muy poco probable que algo llegue al último cuadro, pero la pregunta solo pedía que cada salida fuera posible , no igualmente probable .
fuente
Lote, 164 bytes
¡Creo que 7
%
signos consecutivos podrían ser una nueva mejor marca personal! Nota: esto produce resultados impares si alguna vez asigna más de 9 elementos al mismo cuadro; si eso es un problema, entonces para 180 bytes:Sí, eso es 28
%
s en total en la segunda línea.fuente
C, 102 bytes
Toma entrada en stdin, por ejemplo:
No generará cada salida con la misma probabilidad, pero es capaz de generar todas las combinaciones posibles.
Descompostura:
Se basa en el manejo de GCC del comportamiento indefinido de
%0s
: normalmente%0
rellenará a cero un número entero o flotante, pero solo puede rellenar (nunca truncar), por lo que no es posible imprimir un espacio en blanco. Pero el comportamiento de las cadenas no está definido, y GCC decidió convertirlo en cero-pad de la misma manera, por lo que este cero-rellena una cadena vacía para poder escribir cero o más0
s.fuente
a(b,c){...}
lugar demain
yscanf
.Python 2,
102999790 bytesm-1
veces, elija una cantidad aleatoriax
entre0
en
, inclusive y reste de n. A continuación, imprimir una1
y'0'*x
.Finalmente, imprimir
1
y el resto del0
s. No todas las posibilidades, pero todas las configuraciones son posibles.(Código reutilizado de la respuesta rota de Python).
fuente
Haskell,
11494 bytesUn enfoque de fuerza bruta: genera una lista infinita de números aleatorios, toma n números del comienzo de la lista, los resume y comprueba si son iguales a m. Si no, quite el primer elemento de la lista y repita.
Pruébalo en línea!
Nota: 73 bytes sin importar
EDITAR: guardó algunos bytes con el truco 10 ^ (¡ Pruebe la nueva versión en línea! )
fuente
REXX, 74 bytes
Salida (8 5):
Salida (8 5):
fuente
C,
175138 bytes¡Gracias a @Dave por guardar 37 bytes!
Pruébalo en línea!
fuente
calloc
le dará memoria inicializada en 0 (no es necesario establecer todos los 0s usted mismo),strchr
puede encontrar el final de una cadena, las operaciones de cadena de comas pueden evitar la necesidad de{}
yx[0] == *x
. También ten cuidado; no tienemalloc
suficiente memoria si todos los elementos están en la misma caja.AHK, 66 bytes
Seguí el mismo principio que orlp usando números aleatorios de 0 a N y luego restando de N. Desafortunadamente, no pude guardar bytes usando 10 ^ r debido a la forma en que funciona la función Enviar. Por desgracia y flojo. Aquí hay algunas salidas para n = 8, m = 5:
fuente
CJam,
303121 bytesLa entrada es dos números
n m
en la pila. Usos1
para el carácter de columna y0
para el carácter repetido.Explicación:
fuente
Röda , 79 bytes
Pruébalo en línea!
Esto crea una matriz de ceros y los incrementa en lugares aleatorios.
fuente
PHP, 100 bytes
Descompostura :
Salidas para
m=7
yn=5
:Primera ejecución:
Segunda ejecución:
Pruébalo en línea!
fuente
[,$m,$n]=$argv;
desde PHP 7.1 para guardar algunos caracteres. Puede reemplazar\n
con un salto de línea real para guardar 1 byte. puede usarfor(;$m-->0;)$a[rand(0,$n-1)].=a;
para guardar los descansos,$m
ay un punto y coma.[,$m,$n]=$argv;$a=array_fill(0,$n,z);for(;$m-->0;)$a[rand()%$n].=a;echo join("\n",$a);
85 byte[,$m,$n]=$argv;for(;$m--;)${rand()%$n}.=a;for(;$n--;)echo"z${$n}\n";
67 bytes.[,$m,$n]=$argv;
en otros campos de golf, pero no pude hacer que funcionara ni en mi entorno de desarrollo ni en eval.inJavaScript, 105 bytes
Pruébalo en línea!
Debido al método de asignación de las filas, esto tenderá a colocar más hacia abajo, aunque existe una pequeña posibilidad de que la parte superior obtenga algo.
fuente
Ruby, 52 bytes
Crea una función anónima que toma dos enteros como argumentos y devuelve una matriz de cadenas:
fuente
Python 2, 81 bytes
Devuelve una lista de cadenas.
fuente
Javascript (ES7), 75 bytes
Pensé que era inteligente para proponer los poderes de la idea 10 solo para darme cuenta de que la mayoría de las respuestas ya estaban usando eso.
fuente
AWK, 78 bytes
Toma 2 argumentos, primero el número de elementos, luego el número de cajas. Comienza por sembrar el generador de números aleatorios para que cada ejecución sea diferente. Luego, simplemente crea cadenas en una matriz, Ejemplo de uso:
fuente
MATLAB,
10394 bytesCon formato
Salida de muestra
Hay espacios en blanco finales ya que cada entrada de matriz se muestra con una pestaña entre ellos, pero esto debería ser aceptable según las especificaciones.
Esto me parece una implementación muy simplista, así que estoy seguro de que esto podría mejorarse.
Gracias a @Luis Mendo por sus sugerencias.
fuente
d=@(p)disp(char([1,~(1:p)]+48));for i=1:m-1;p=randi([0,n]);d(p);n=n-p;end;d(n)
a=
. En este caso, no puede hacer eso, en principio, porque las funciones anónimas no pueden contener bucles. Pero podrías usar el truco de poner todo dentroeval('...')
. Por cierto, eso normalmente se considera feo y una mala práctica en Matlab, pero aquí nos gusta abusar de los idiomas :-)Octava ,
6254 bytesFunción anónima que toma dos números y genera una matriz 2D de caracteres con
>
cuadros y*
objetos. Todos los resultados son igualmente probables.Pruébalo en línea!
fuente
TI-Basic,
6362 bytesEste criterio hizo que este programa fuera mucho más fácil de escribir.
Ejemplo de E / S:
Explicación:
fuente
MATLAB,
736458 bytesActualización n. ° 3
Parece que necesito la clasificación, ya que de lo contrario obtengo enteros negativos. Sin embargo, reemplacé
disp(sprintf(...))
confprintf(...)
ahora, por lo que la respuesta sigue siendo 58 bytes.Actualización n. ° 2:
Me di cuenta de que no necesitaba ordenar la matriz, y de hecho la clasificación reduciría el promedio de números en la matriz. Entonces borré la
sort(...)
parte. Tenga en cuenta que la salida sigue siendo la misma, por lo que no estoy actualizando la "salida de muestra".¡Finalmente acercándome a la respuesta de Octave de Luis! :RE
Actualización n. ° 1:
En lugar de convertir a cadena, solo visualizo números directamente. Podría reducir a 58 bytes, quitando el
disp(...)
, pero luego obtengo el extraans =
con solo sprintf, y no sé si eso es aceptable.Código inicial:
Gracias a algunas sugerencias de Luis , me libré del bucle en mi respuesta anterior . Ahora primero creo una matriz vertical de
m
números aleatorios que sumann
(diff([0;sort(randi(n,m-1,1));n])
), luego los uso como exponentes de 10, los convierto en una cadena, los justifico a la izquierda y los visualizo.Técnicamente podría deshacerme del disp (...) para guardar otros 6 bytes, pero luego se imprime un "ans" que puede violar las especificaciones. También puede haber una forma de cambiarlos a cadena y justificar a la izquierda para obtener el formato final deseado, por lo que estoy abierto a sugerencias.
Salida de muestra:
Nota : He cambiado mi función a una función anónima aquí, basada en sugerencias. En el resultado de la muestra, lo he asignado a
a
fin de demostrar. Espero que esto no viole las especificaciones, pero si lo hace, hágamelo saber y lo cambiaré.fuente
m
enteros aleatorios que sumenn
, ya que estuve atrapado en esa parte durante mucho tiempo ... (Todavía no puedo agregar más de 2 enlaces en mis respuestas, por lo que incluirlo en un comentario)Apilado , 29 bytes
Pruébalo en línea!
Se comporta construyendo una matriz de
M
singletons que contienen'|'
, y luego sumando'#'
a una matriz elegida aleatoriamenteN
.fuente
randin
utiliza el algoritmo de Fisher-Yates internamente. (Este es el mismo algoritmo que la respuesta de CJam usa FWIW)Python 2 ,
80 95 8988 bytesPruébalo en línea!
fuente
Carbón , 19 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
fuente