Aperçu
Dans ce défi, votre tâche consiste à générer au hasard une fonction mathématique monotone entre deux ensembles.
Contribution
Vos entrées sont deux entiers positifs s
et n
.
Après avoir obtenu ces entrées, votre programme doit générer une fonction mathématique aléatoiref
de l'ensemble à . En d'autres termes, est une "règle" qui prend un -tuple d'entiers entre et , et renvoie un tel entier. De plus, doit être monotone dans le sens suivant. Si et sont deux -tuples tels que cela vaut pour chaque coordonnée , alors .{0,1,...,s-1}n
{0,1,...,s-1}
f
n
0
s-1
f
A
B
n
A[i] ≥ B[i]
i
f(A) ≥ f(B)
La distribution exacte des fonctions monotones f
n'a pas d'importance, tant que chacune de ces fonctions a une probabilité positive d'être générée (en supposant un RNG parfait).
Production
Votre sortie doit être une énumération des entrées et sorties de f
. Il doit contenir tous les n
-tuples d'entiers entre 0
et s-1
dans un certain ordre, chacun étant suivi de la sortie correspondante de f
. Le format de sortie exact est flexible (dans des limites raisonnables).
Exemples
Les entrées s = 3
et n = 2
pourraient produire la sortie
(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 0
(1, 1) 1
(1, 2) 2
(2, 0) 1
(2, 1) 1
(2, 2) 2
Il contient toutes les paires sur l'ensemble {0, 1, 2}
exactement une fois, et chacune est suivie de sa valeur f
. La condition de monotonie est également satisfaite. Les tuples sont donnés ici dans l'ordre lexicographique, mais ce n'est pas nécessaire.
Comme autre exemple, s = 2
et n = 4
pourrait produire
(0, 0, 0, 0) 0
(0, 0, 0, 1) 0
(0, 0, 1, 0) 0
(0, 0, 1, 1) 0
(0, 1, 0, 0) 1
(0, 1, 0, 1) 1
(0, 1, 1, 0) 1
(0, 1, 1, 1) 1
(1, 0, 0, 0) 0
(1, 0, 0, 1) 1
(1, 0, 1, 0) 0
(1, 0, 1, 1) 1
(1, 1, 0, 0) 1
(1, 1, 0, 1) 1
(1, 1, 1, 0) 1
(1, 1, 1, 1) 1
Voici toutes les sorties possibles pour s = 2
et n = 2
(jusqu'à la réorganisation des tuples); votre programme devrait en sortir un au hasard:
(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 0
-------
(0,0) 0
(0,1) 0
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 0
(1,0) 1
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 0
(1,1) 1
-------
(0,0) 0
(0,1) 1
(1,0) 1
(1,1) 1
-------
(0,0) 1
(0,1) 1
(1,0) 1
(1,1) 1
Règles et notation
Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus bas gagne et les failles standard sont interdites. Un code avec explication est préférable.
Il n'y a pas de restrictions sur la complexité du temps, mais je donnerai un bonus de -15% si votre solution est toujours garantie de finir dans un certain laps de temps (en fonction des entrées, et en supposant un RNG parfait qui fonctionne en temps constant) .