Sobre la serie
En primer lugar, puede tratar esto como cualquier otro desafío de golf de código y responderlo sin preocuparse por la serie. Sin embargo, hay una tabla de clasificación en todos los desafíos. Puede encontrar la tabla de clasificación junto con más información sobre la serie en la primera publicación .
Aunque tengo un montón de ideas para la serie, los desafíos futuros aún no están establecidos en piedra. Si tiene alguna sugerencia, hágamelo saber en la publicación de sandbox relevante .
Hoyo 3: Particiones enteras
Es hora de aumentar un poco la dificultad.
Una partición de un entero positivo n
se define como un conjunto múltiple de enteros positivos que suman n
. Como ejemplo si n = 5
, existen las siguientes particiones:
{1,1,1,1,1}
{2,1,1,1}
{2,2,1}
{3,1,1}
{3,2}
{4,1}
{5}
Tenga en cuenta que estos son conjuntos múltiples, por lo que no hay un orden para ellos {3,1,1}
, {1,3,1}
y {1,1,3}
todos se consideran idénticos.
Su tarea es, dada n
, generar una partición aleatoria de n
. Aquí están las reglas detalladas:
La distribución de las particiones producidas debe ser uniforme . Es decir, en el ejemplo anterior, cada partición debe devolverse con probabilidad 1/7.
Por supuesto, debido a las limitaciones técnicas de los PRNG, será imposible una uniformidad perfecta. Para evaluar la uniformidad de su envío, se considerará que las siguientes operaciones producen distribuciones perfectamente uniformes:
- Obtener un número de un PRNG (sobre cualquier rango), que está documentado como (aproximadamente) uniforme.
- Mapear una distribución uniforme sobre un conjunto más grande de números en un conjunto más pequeño mediante módulo o multiplicación (o alguna otra operación que distribuya valores de manera uniforme). El conjunto más grande tiene que contener al menos 1024 veces tantos valores posibles como el conjunto más pequeño.
Dado que las particiones son multisets, puede devolverlas en cualquier orden, y este orden no tiene que ser coherente. Sin embargo, para el propósito de la distribución aleatoria, el orden se ignora. Es decir, en el ejemplo anterior
{3,1,1}
,{1,3,1}
y{1,1,3}
juntos deben tener una probabilidad de 1/7 de ser devueltos.- Su algoritmo debe tener un tiempo de ejecución determinista. En particular, no puede generar múltiples conjuntos aleatorios y rechazarlos si no suman
n
. - La complejidad del tiempo de su algoritmo debe ser polinómica
n
. En particular, no puede simplemente generar todas las particiones y seleccionar una aleatoria (ya que el número de particiones crece exponencialmente conn
). Puede suponer que el PRNG que está utilizando puede devolver valores distribuidos uniformemente en O (1) por valor. - No debe utilizar ninguna función integrada que resuelva esta tarea.
Puede escribir un programa completo o una función y tomar la entrada a través de STDIN o la alternativa más cercana, argumento de línea de comando o argumento de función y producir salida a través del valor de retorno o imprimiendo en STDOUT (o la alternativa más cercana).
Puede suponer eso n ≤ 65
(de modo que el número de particiones sea menor que 2 21 ). La salida puede estar en cualquier formato de lista o cadena conveniente y sin ambigüedades.
Si envía una función, considere también proporcionar un pequeño programa de prueba que llame a la función varias veces e imprima los resultados. Está bien si los parámetros tienen que ser modificados en el código. Esto es solo para que la gente pueda verificar que la solución sea al menos aproximadamente uniforme.
Este es el código de golf, por lo que gana el envío más corto (en bytes). Y, por supuesto, la presentación más corta por usuario también entrará en la tabla de clasificación general de la serie.
Tabla de clasificación
La primera publicación de la serie genera una tabla de clasificación.
Para asegurarse de que sus respuestas aparezcan, comience cada respuesta con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntuación, se puede mantener viejas cuentas en el título, golpeándolos a través. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(El idioma no se muestra actualmente, pero el fragmento requiere y analiza, y puedo agregar una tabla de clasificación por idioma en el futuro).