L'aléatoire est amusant. Les défis sans intérêt sont amusants.
Écrivez une fonction qui, étant donnée une entrée entière n
, produira un ensemble (non ordonné, unique) d' n
entiers exactement aléatoires entre 1
et n^2
(inclus) de telle sorte que la somme de tous les entiers soit égale à n^2
.
L'aléatoire ne doit pas être uniforme, à condition que chaque ensemble valide ait une chance non nulle de se produire.
La réponse la plus courte en octets (pour chaque langue) l'emporte.
Exemples
Input (n) = 1, Target (n^2) = 1
Sample of possible outputs:
1
Input = 2, Target = 4
Sample of possible outputs:
3, 1
1, 3
Input = 3, Target = 9
Sample of possible outputs:
6, 1, 2
3, 5, 1
4, 3, 2
Input = 4, Target = 16
Sample of possible outputs:
1, 3, 5, 7
2, 4, 1, 9
8, 3, 1, 4
Input = 5, Target = 25
Sample of possible outputs:
11, 4, 7, 1, 2
2, 3, 1, 11, 8
6, 1, 3, 7, 8
Input = 8, Target = 64
Sample of possible outputs:
10, 3, 9, 7, 6, 19, 8, 2
7, 16, 2, 3, 9, 4, 13, 10
7, 9, 21, 2, 5, 13, 6, 1
Tâche bonus: existe-t-il une formule pour calculer le nombre de permutations valides pour une donnée n
?
code-golf
random
combinatorics
Skidsdev
la source
la source
Réponses:
Brachylog (v2), 15 octets (aléatoire) ou 13 octets (toutes les possibilités)
au hasard
Essayez-le en ligne!
Soumission de fonction (vu dans TIO avec un wrapper en faisant un programme complet).
Explication
Toutes les possibilités
Essayez-le en ligne!
Soumission de fonction, qui génère toutes les sorties possibles.
Explication
Je suis assez surpris que cela
∧≜
fonctionne (vous devriez normalement écrire∧~≜
pour forcer la sortie plutôt que l'entrée), mais il se trouve que cela≜
a une hypothèse d'entrée = sortie, donc peu importe le chemin autour de vous exécuter.Tâche bonus
Afin d'avoir un aperçu de la séquence du nombre de possibilités, j'ai créé un wrapper TIO différent qui exécute le programme sur des entiers successifs pour donner la séquence des nombres de sortie:
Un voyage à OEIS découvre qu'il s'agit déjà d'une séquence connue, A107379 , décrite à peu près comme dans la question (apparemment, vous obtenez la même séquence si vous la limitez à des nombres impairs). La page répertorie plusieurs formules pour la séquence (bien qu'aucune ne soit particulièrement simple; la seconde ressemble à une formule directe pour la valeur mais je ne comprends pas la notation).
la source
x^(n*(n-1)/2)
expansion de la série deProduct_{k=1..n} 1/(1 - x^k)
" (pas direct du tout, malheureusement)A≠≜₁ᵐ
) accélère en moyenne le temps d'exécution.05AB1E , 11 octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Python (2 ou 3), 85 octets
Essayez-le en ligne!
la source
R ,
68, 7548 octets (aléatoires) et 70 octets (déterministes)@ Méthode d'échantillonnage par rejet de Giuseppe:
Essayez-le en ligne!
Golf original:
Essayez-le en ligne!
L'
*!!1:2
activité consiste à éviter la façon étrange d'sample
agir lorsque le premier argument a une longueur de 1.la source
p
directement comme index au lieu de le calculer et le réutiliser devrait économiser quelques octets.function(n){while(sum(F)!=n^2)F=sample(n^2,n);F}
pour 48 aussi ...sample(2,1)
ce qui se passe avecn=2
. Garantit doncrep
simplement que cela ne se produira jamais. Il pourrait y avoir une meilleure façon mais c'était rapide et j'étais en colèresample
.x*!!1:2
plusrep(x,2)
si votre méta-question obtient un non.Gelée , 9 octets
Essayez-le en ligne!
Générez toutes les n-combinaisons de la liste [1..n²], filtrez pour garder celles avec la somme n², puis choisissez-en une au hasard.
la source
Java 10,
250242222 octets-20 octets grâce à @nwellnhof .
Attention, Java passe à travers .. C'est "seulement" cinq fois plus longtemps que les quatre autres réponses combinées, donc pas trop mal je suppose ... rofl.
Il ne fonctionne
n=1
parn=25
(combiné) en moins de 2 secondes, alors je vais probablement poster une version modifiée à la version de la vitesse de ce défi (qui est actuellement encore dans le bac à sable) ainsi.Essayez-le en ligne.
Explication:
En pseudo-code, nous faisons ce qui suit:
1) Générer un tableau de taille
n+1
contenant:0
,n
carré, etn-1
nombre d'entiers aléatoires dans l'intervalle[0, n squared)
2) Trier ce tableau
3) créer un second tableau de taille
n
contenant les différences avant des pairesCes trois premières étapes nous donneront un tableau contenant
n
aléatoire entiers (dans la plage de[0, n squared)
somme aun
carré.4a) Si toutes les valeurs aléatoires ne sont pas uniques, ou si l'une d'elles est 0: réessayez à partir de l'étape 1
4b) Sinon: renvoyez ce tableau de différences comme résultat
Quant au code réel:
la source
n=25
en moins de 2 secondes c'est impressionnant! Je vais devoir lire l'explication et voir comment ça se passe. Est-ce toujours une méthode bruteforce?[0, n squared)
premier, puis calcule les différences entre ces valeurs aléatoires triées (y compris les valeurs de début0
et de finn squared
. Je suis donc presque sûr que ces différences sont également uniformes. Mais encore une fois , Je ne sais pas trop comment le prouver. L'uniformité dans le hasard n'est pas vraiment mon expertise tbhd
ou est-ce que je manque quelque chose?Perl 6 , 41 octets
Essayez-le en ligne!
(1 .. $_²)
est la plage de nombres de 1 au carré du nombre d'entrée.pick($_)
choisit au hasard un sous-ensemble distinct de cette plagexx *
reproduit à l'infini l'expression précédentefirst *.sum == $_²
sélectionne le premier de ces ensembles de nombres qui correspond au carré du nombre d'entréela source
Pyth,
1312 octetsEssayez-le en ligne ici . Notez que l'interpréteur en ligne s'exécute dans une erreur MemoryError pour les entrées supérieures à 5.
Modifier: enregistré un octet en adoptant une approche alternative. La version précédente:
Of&qQlT{IT./*
la source
Python 3 ,
136 134 127 127 121114 octetsEssayez-le en ligne!
Un commentateur m'a corrigé, et cela atteint maintenant la profondeur maximale de récursivité à f (5) au lieu de f (1). Beaucoup plus près d'être une vraie réponse concurrente.
Je l'ai vu faire f (5) une fois , et je travaille à essayer de l'implémenter avec shuffle.
J'ai essayé de créer des expressions lambda pour
s=...
, mais cela n'a pas aidé sur les octets. Peut-être que quelqu'un d'autre peut faire quelque chose avec ça:s=(lambda n:{randint(1,n*n)for _ in range(n)})(n)
Merci à Kevin d'avoir rasé encore 7 octets.
la source
f(1)
, le seul tableau possible qui devrait être générable àn=1
est[1]
également il y a beaucoup d'espace blanc à supprimer ici. Rappelez-vous que c'est un défi de code-golf, donc l'objectif est d'atteindre le plus petit nombre de sousrange(1,n)
->range(n)
Je crois que devrait résoudre le bug.return len(s)==n and sum(s)==n*n and s or f(n)
( Essayez-le en ligne 114 octets ).APL (Dyalog Unicode) , 20 octets SBCS
Préfixe anonyme lambda.
Essayez-le en ligne!
{
…}
"Dfn";⍵
est l'argument⍵*2
mettre l'argument au carrés←
assigner às
(pour s quare)⍵?
trouvern
des indices aléatoires de 1…s
sans remplacementc←
assigner àc
(pour c andidate)+/
les résumers=
comparer auxs
:
si égalc
retourner le candidat⋄
autre∇⍵
recurse sur l'argumentla source
APL (Dyalog Classic) , 18 octets
Essayez-le en ligne!
les usages
⎕io←1
⍳
génère les nombres1 2 ... n
(
...)⍣(
...)
continuez d'appliquer la fonction à gauche jusqu'à ce que la fonction à droite renvoie true≢
longueur, c.-à-d.n
≢?≢×≢
choisirn
des entiers distincts au hasard entre 1 etn
2+.-∘≢
soustraire la longueur de chaque nombre et somme0=
si la somme est 0, arrêtez la boucle, sinon essayez à nouveaula source
MATL ,
1813 octetsEssayez-le en ligne!
la source
Japt, 12 octets
Essayez-le
la source
à
devrait aller.Java (JDK) , 127 octets
Essayez-le en ligne!
Boucle infinie jusqu'à ce qu'un ensemble avec les critères corresponde.
J'espère que vous avez le temps, car c'est très lent! Il ne peut même pas passer à 10 sans expiration.
la source
if(r.size()==n&s==0)
pourif(r.size()+s==n)
.s>0
la taille peut être supérieure àn
. Ok, dans ce cas, cela ne fonctionne pas.n
est une constante, mais malheureusement les deuxs
etr.size()
sont des variables qui peuvent être à la fois inférieures ou supérieures0
etn
respectivement.Lot,
182145octetsExplication: calcule la sélection minimale et maximale autorisée, étant donné que les nombres doivent être sélectionnés dans l'ordre décroissant, et choisit une valeur aléatoire dans la plage. Exemple pour une entrée de
4
:la source
JavaScript,
647291261260259251239 octetsMerci à @Veskah pour -10 octets dans la version originale et "Oh oui, vous sortez tous les ensembles alors que le défi demande d'en renvoyer un au hasard"
Essayez-le en ligne!
Créez un tableau d'
n^2
index basés sur 1, triez le tableau au hasard, découpez lesn
éléments du tableau. Alors que la somme des éléments aléatoires n'est pas égale aun^2
tableau de boucles d'éléments aléatoires; si la somme des éléments du tableau est supérieure àn^2
et que l'élément actuel-1
n'est pas égal à zéro ou que l'élément actuel-1
n'est pas dans le tableau actuel, soustrayez1
; si la somme du tableau est inférieure àn^2
et que l'élément actuel+1
n'est pas dans le tableau, ajoutez1
à l'élément. Si la somme du tableau est égale à lan^2
boucle de rupture, sortez le tableau.la source
k++
while
boucles pourraient probablement aussi être réduites au corps d'une seule fonction qui accepte des paramètres; et pourrait substituer des opérateurs conditionnels (ternaires) auxif..else
instructions; entre autres parties du code qui pourraient très probablement être ajustées pour le golf; ieg, suppression deslet
instructions.if..else
n
?" . tester si l'algorithme est retourné régulièrement résultat attendu pour lesn^2
tableaux de sortie générés dans un seul appel à la fonction, et en considérant simultanément les similitudes avec cette question à N dimensions N ^ N tableau rempli de N .Japt , 20 octets
Essayez-le en ligne!
Profite extrêmement fortement du caractère aléatoire "non uniforme", produit presque toujours les premiers
n
nombres impairs, ce qui arrive à additionnern^2
. En théorie, il peut produire n'importe quel autre ensemble valide, même si je n'ai pu le confirmer que pour les petitsn
.Explication:
la source
Rubis , 46 octets
Essayez-le en ligne!
la source
C (gcc) ,
128125 octetsEssayez-le en ligne!
-3 octets grâce au plafond
REMARQUE: La probabilité est très très loin d'être uniforme. Voir l'explication de ce que je veux dire et un meilleur moyen de tester que cela fonctionne (en rendant la distribution plus proche de l'uniforme [mais toujours loin de là]).
Comment?
L'idée de base est de choisir uniquement des nombres croissants afin de ne pas se soucier des doublons. Chaque fois que nous choisissons un nombre, nous avons une chance non nulle de le «sauter» si cela est permis.
x
k
y
x
Néanmoins, la logique est d'avoir une chance de rejeter tout ce
y
qui satisfait l'équation ci-dessus.Le code
L'astuce que j'ai mentionnée pour mieux tester le code consiste à le remplacer
rand()&&
parrand()%2&&
afin qu'il y ait 50 à 50 chances que tout y donné soit ignoré, plutôt qu'un 1 deRAND_MAX
chance que tout y soit utilisé.la source
p(y),x-=y++)while(rand()&&(i-n)*((~n+i)/2+~y)+y<x)y++;
place de){while(rand()&&(n-i)*(n-i+1)/2+(n-i)*(y+1)+y<x)y++;p(y);x-=y++;}
Nettoyer , 172 octets
Essayez-le en ligne!
la source
Python (2 ou 3), 84 octets
Essayez-le en ligne!
Atteint la profondeur de récursivité maximale à environ l (5)
la source
Kotlin , 32 octets
Essayez-le en ligne!
la source
Mathematica 40 octets
la source
RandomChoice@IntegerPartitions[#^2,{#}]&
Wolfram Language (Mathematica) , 49 octets
Essayez-le en ligne!
Version golfée par @ J42161217.
Wolfram Language (Mathematica) , 62 octets
Essayez-le en ligne!
Comment ça marche
La réponse à la tâche bonus
qui est, dans Mathematica:
Essayez-le en ligne!
la source
(While[Tr[s=RandomSample[Range[#^2],#]]!=#^2];s)&