À propos de la série
Tout d'abord, vous pouvez traiter cela comme n'importe quel autre défi de golf de code et y répondre sans vous soucier de la série. Cependant, il existe un classement pour tous les défis. Vous pouvez trouver le classement avec plus d'informations sur la série dans le premier post .
Bien que j'ai un tas d'idées alignées pour la série, les défis futurs ne sont pas encore gravés dans le marbre. Si vous avez des suggestions, faites-le moi savoir sur le post sandbox correspondant .
Trou 3: partitions entières
Il est temps d'augmenter un peu la difficulté.
Une partition d'un entier positif n
est définie comme un ensemble multiple d'entiers positifs qui se résument à n
. Par exemple, si n = 5
, les partitions suivantes existent:
{1,1,1,1,1}
{2,1,1,1}
{2,2,1}
{3,1,1}
{3,2}
{4,1}
{5}
Notez que ce sont des multisets, donc il n'y a pas d'ordre {3,1,1}
, {1,3,1}
et ils {1,1,3}
sont tous considérés comme identiques.
Votre tâche est, étant donné n
, de générer une partition aléatoire de n
. Voici les règles détaillées:
La répartition des cloisons produites doit être uniforme . Autrement dit, dans l'exemple ci-dessus, chaque partition doit être renvoyée avec une probabilité 1/7.
Bien sûr, en raison des limites techniques des PRNG, une uniformité parfaite sera impossible. Aux fins d'évaluer l'uniformité de votre soumission, les opérations suivantes seront considérées comme produisant des distributions parfaitement uniformes:
- Obtention d'un numéro à partir d'un PRNG (sur n'importe quelle plage), qui est documenté comme étant (approximativement) uniforme.
- Mapper une distribution uniforme sur un ensemble de nombres plus grand sur un ensemble plus petit via modulo ou multiplication (ou une autre opération qui distribue les valeurs uniformément). L'ensemble plus grand doit contenir au moins 1024 fois autant de valeurs possibles que l'ensemble plus petit.
Étant donné que les partitions sont des ensembles multiples, vous pouvez les renvoyer dans n'importe quel ordre, et cet ordre n'a pas à être cohérent. Cependant, aux fins de la distribution aléatoire, l'ordre est ignoré. Autrement dit, dans l'exemple ci-dessus
{3,1,1}
,{1,3,1}
et{1,1,3}
ensemble doivent avoir une probabilité de 1/7 d'être retourné.- Votre algorithme doit avoir un runtime déterministe. En particulier, vous ne pouvez pas générer de multisets aléatoires et les rejeter s'ils ne correspondent pas
n
. - La complexité temporelle de votre algorithme doit être polynomiale
n
. En particulier, vous ne pouvez pas simplement générer toutes les partitions et en sélectionner une au hasard (car le nombre de partitions croît de façon exponentielle avecn
). Vous pouvez supposer que le PRNG que vous utilisez peut renvoyer des valeurs uniformément réparties en O (1) par valeur. - Vous ne devez utiliser aucune fonction intégrée qui résout cette tâche.
Vous pouvez écrire un programme complet ou une fonction et prendre une entrée via STDIN ou l'alternative la plus proche, l'argument de ligne de commande ou l'argument de fonction et produire une sortie via la valeur de retour ou en imprimant vers STDOUT (ou l'alternative la plus proche).
Vous pouvez supposer que n ≤ 65
(tel que le nombre de partitions est inférieur à 2 21 ). La sortie peut être dans n'importe quelle liste ou format de chaîne pratique et sans ambiguïté.
Si vous soumettez une fonction, veuillez également envisager de fournir un petit programme de test qui appelle la fonction plusieurs fois et imprime les résultats. Ce n'est pas grave si les paramètres doivent être modifiés dans le code. C'est juste pour que les gens puissent vérifier que la solution est au moins approximativement uniforme.
Il s'agit du code golf, donc la soumission la plus courte (en octets) l'emporte. Et bien sûr, la soumission la plus courte par utilisateur entrera également dans le classement général de la série.
Classement
Le premier post de la série génère un classement.
Pour vous assurer que vos réponses s'affichent, veuillez commencer chaque réponse par un titre, en utilisant le modèle Markdown suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(La langue n'est pas actuellement affichée, mais l'extrait de code l'exige et l'analyse, et je pourrai ajouter un classement par langue à l'avenir.)