Défi
Étant donné un entier positif, (K)
affichez un entier uniformément aléatoire (Y)
entre [0, K)
.
Si Y > 0
supposez K = Y
et répétez le processus jusqu'à Y = 0
.
Règles
- L'entrée doit être imprimée au début
- Format de sortie comme vous le souhaitez
- Votre programme doit se terminer.
0
doit être la sortie finale, éventuellement une ligne vide à la place0
Réponses:
Pyth ,
6 54 octetsEssayez-le ici!
Comment ça marche
la source
C (gcc) , 42 octets
Essayez-le en ligne!
Utilise les circuits logique et court-circuités.
C (gcc) , 40 octets (sans impression de la valeur initiale)
Essayez-le en ligne!
Utilise les circuits logique et court-circuités.
la source
rand()%_
n'est pas uniformeR ,
66 60 56 4341 octetsEssayez-le en ligne!
la source
>0
etcat(n,"")
(chaîne vide) fonctionnera également.print
c'est plus efficace ici, car il renvoie son argument: 56 octetsk=scan();while(x<-sample(1:k-1,1))k=c(x,k);cat(rev(k),0)
n=scan();while(print(n))n=sample(n,1)-1
MATL , 6 octets
Essayez-le en ligne!
Explication
la source
Pepe , 25 octets
Pepe est un langage de programmation créé par l'utilisateur Soaku .
Essayez-le en ligne!
Explication:
la source
Perl 6 , 18 octets
Essayez-le en ligne!
Bloc de code anonyme qui renvoie une liste de valeurs. Si cela ne vous dérange pas que les nombres soient des plages, vous pouvez faire:
pour 17 octets. Curieusement, une autre fonction aléatoire intégrée,,
roll
a le même comportement dans ce cas pour la même quantité d'octets.la source
Perl 5 .10.0
-pl
, 26 octetsEssayez-le en ligne!
la source
Gelée ,
43 octetsIl s'agit d'un lien monadique (fonction) qui imprime un tableau et renvoie 0 .
Essayez-le en ligne!
Comment ça marche
la source
Brachylog , 8 octets
Essayez-le en ligne!
Explication
La récursivité s'arrêtera en cas d'
?ℕ₁
échec, c'est-à-dire lorsque l'entrée est0
.la source
05AB1E ,
87 octetsEssayez-le en ligne!
Explication
la source
Δ=ݨΩ0M
est équivalent.J, 13 octets
Dans le métro, donc excuses pour le manque de TIO (j'espère qu'il n'y a pas de manque de justesse).
Affiche une liste de valeurs.
On peut supposer que l'approche APL sera plus courte, mais c'est ce à quoi j'ai pensé.
Comment ça marche
^:a:
appliquer à plusieurs reprises jusqu'à la convergence, en stockant les résultats intermédiaires dans un tableau.?
entier aléatoire dans la plage[0, K)
pourK
supérieure à 0. Pour 0, il donne un nombre entier aléatoire dans la gamme(0,1)
. Pour un nombre à virgule flottante, il génère des erreurs.::]
attraper une erreur pour une entrée?
et au lieu de l'erreur, sortir l'entrée qui a causé l'erreur.}:
se débarrasser de la dernière valeur du tableau (c'est pour qu'un nombre à virgule flottante ne soit pas affiché).Essayez-le en ligne!
la source
?.
, mais je ne pense pas que j'utilise ça.JavaScript (ES6),
3837 octets-1 octet grâce à @Arnauld
Afficher l'extrait de code
la source
new Date%n
ne fonctionne pas vraiment ici, car elle ne change pas assez rapidement pour être utile pour générer plusieurs nombres aléatoiresC, 38 octets
Essayez-le en ligne
Non golfé
la source
&&
; aussi, vous voudrez peut-être envisager d'amorcer le RNG dans votremain
fonction: Essayez-le en ligne!Pyth , 4 octets
Essayez-le en ligne!
Cela implémente essentiellement l'algorithme:
Pour traduire le Pyth dans l'algorithme, nous pouvons principalement examiner ce que signifie chaque caractère. Puisque Pyth est écrit en notation préfixe (c'est-à
* + 1 2 3
- dire est(1 + 2) * 3
), nous pouvons commencer par la gauche et remplir les arguments au fur et à mesure.W
commence une boucle while traditionnelle. La première instruction après c'est la condition de boucle et la deuxième instruction après c'est le corps de boucle. Si la deuxième instruction est vide, elle devient un no-op . Cela tandis que fonctionne exactement comme le tout Python, il évaluera donc les entiers non nuls comme Vrai et zéro comme faux.La première instruction après le moment commence par le caractère de nouvelle ligne. Cela correspond à la fonction "imprimer et retourner avec une nouvelle ligne" de Pyth. Cela prend un argument, qui est ensuite imprimé et retourné non modifié. Cela nous permet d'imprimer les étapes intermédiaires tout en effectuant les opérations nécessaires.
L'argument passé à cette fonction d'impression commence par
~
ce qui est un peu spécial. Si le caractère immédiatement après~
est une variable, il prend deux arguments, sinon il en prend un. PuisqueO
n'est pas une variable~
ne consommera qu'un seul argument.~
fonctions un peu comme le+=
fait dans de nombreuses langues classiques, bien que l'opérateur le plus proche serait l'opérateur de post-incrémentation++
deC
. Vous savez peut-être que cex++
sera comme utiliserx
comme valeur actuelle, mais cex
sera le cas par la suitex+1
.~
est la même idée, mais généralisée à quelque soit le résultat du premier argument. La façon dont il choisit la variable à attribuer sera traitée ultérieurement.L'argument de
~
est -ceO
qui est très simple. Lorsque son seul argument est un entierO
retourne une valeur de 0 à un de moins que cet entier uniformément au hasard.Maintenant, vous avez peut-être remarqué qu'il
O
n'a pas d'argument. Ici, l'interpréteur Pyth remplit gentiment une supposition, qui est ici la variableQ
.Q
a une signification particulière en Pyth: chaque fois qu'il est présent dans un programme, le programme Pyth commence par l'affectationQ
à l'entrée du programme. Puisque c'est la première variable apparaissant dans~
l'argument de,Q
c'est aussi maintenant la variable qui~
assignera une valeur à.En résumé, notre programme "lisible" pourrait ressembler à ceci:
Et un échantillon "run-through" pourrait ressembler à:
O
renvoie 3,~
renvoie 5,\n
retourne et imprime 5, ce qui est vraiO
retourne 0,~
retourne 3,\n
retourne et imprime 3 ce qui est vraiO
renvoie quelque chose de non pertinent,~
retourne 0,\n
retourne et imprime 0 ce qui est fauxla source
APL (Dyalog Unicode) ,
129 octetsFonction de préfixe tacite anonyme. Suppose que
⎕IO
( I ndex O rigin) est0
, ce qui est le cas par défaut sur de nombreux systèmes. Renvoie la valeur finale (0) en plus de l'impression pendant l'exécution.Essayez-le en ligne!
{
…}⍣=
Appliquez la fonction suivante jusqu'à ce qu'elle soit stable:⎕←⍵
sortir l'argument?
retourner un nombre aléatoire uniformément distribué dans la plage de 0 à ce – 1⌊
arrondi (car?0
donne un flottant (0,1))la source
C (gcc) ,
4042 octetsCertains idiots ont oublié d'imprimer la valeur initiale en premier.
Pas de panique.
la source
f(K){while(K)printf("%d\n",K),K=rand()%K;}
. Vous avez toujours mon +1 pour une solution égale!f(K){while(K)printf("%d\n",K,K=rand()%K);}
x86 + rdrand, 19 octets
Mise en œuvre simple. Prend l'entrée K
ecx
et les sorties dans un tamponebx
.la source
Python 3 , 39 octets
Probably not the most cryptographically secure random number generator but to the human eye it looks random enough...
Try it online!
la source
k=0
is acceptable.hash()
tries to maintain but doesn't guarantee this property. For that task you should use therandom
module.random.randrange()
:from random import*;f=lambda k:print(k)or f(randrange(k))
TI-Basic (TI-84 Plus CE),
1713 bytes-4 bytes from Misha Lavrov
Takes input in
Ans
as50:prgmNAME
.TI-Basic is a tokenized language. All tokens used here are one byte.
Explanation:
An 11-byte solution suggested by Misha Lavrov that requires pressing
enter
after each line following the first.la source
int(Ansrand
is shorter. Also, usingPause
instead ofDisp
, you can make the only statement in the loop bePause int(Ansrand
, which also updatesAns
.Python 2,
646260 bytesTry it online!
Saved
la source
while 1:print k;k=randint(0,~-k)
should work (with an error at the end)while 1:print k;k=randrange(k)
saves two.C++ (gcc), 98 bytes
Try it here!
Usage
This is my first code golf attempt. Any feedback or remarks are welcome.
Edit: Removed the main function as suggested to make it valid.
la source
-Dd='printf("%i,",x'
instead of the#define
would save you some bytes (-4), and is allowed as long as you count the bytes towards your result (because it is a non-standard preprocessor directive. You can also leave out the imports (at least with-std=c++98
and-w
, which don't count for bytes), and the variable types. So, you'd havep(x){d);while(x>0)d=rand()%x;}
and-Dd='printf("%i,",x'
.><>, 92+2 Bytes
+2B for -v flag
Try it online!
><>'s only source of randomness comes from the 'x' instruction, which sets the instruction pointer's direction to a random value. As such, generating a random number from 0 to n isn't trivial.
I first calculate how many bits are required to represent a number in the range [0,n), then generate random bits to generate a random number. This leaves the possibility that it'll generate a number slightly larger than n, in which case we just discard it and try again.
Explanation:
la source
MATLAB (
4946 bytes)Sample output:
la source
k=randi(k)-1
for a few bytes less.Retina, 21 bytes
Try it online! Explanation:
Repeat until the value stops changing (i.e. 0).
Print the value before each pass through the loop.
Convert to unary.
Create the range and convert to decimal.
Pick a random element.
la source
Pyth,
67 bytesTry it online!
+1 to print the initial input value.
While Q is truthy, set Q to be a random integer between 0 and Q and print Q.
Not the shortest Pyth answer but I'm just learning and only posting because of the recent discussion about no-one using Pyth any more :)
la source
=
and~
use the first variable of an expression as the variable that will be assigned if one isn't specified. For example~hT
will setT
to 11 while returning 10. The only other fancy trick is that the newline character prints its input and then returns that value unmodified, so we can have an empty loop body. Let me know if something else is confusing :)Haskell,
7471 bytes-3 bytes by actually doing what the specs say it should do.
Try it online!
la source
IBM/Lotus Notes Formula, 48 bytes
Field formula that takes input from another field
i
.There's no TIO for formula so here's a screenshot of a sample output:
la source
Powershell,
3632 bytes-4 bytes thanks AdmBorkBork
Testscript:
Output:
la source
Get-
is implied, so you can remove it for -4 bytes Try it online!PowerShell, 35 bytes
Try it online!
Full program. Takes input
$args
, stores it into$a
, and enters afor
loop. Each iteration we're checking whether$a
is still positive (as0
is falsey in PowerShell). Then we leave$a
on the pipeline and move to the next iteration, where we set$a
to be the result ofGet-Random $a
, which returns an integer in the range0..($a-1)
.(Ab)uses the fact that PowerShell outputs an additional trailing newline in lieu of outputting the final zero (allowed by the rules as currently written).
la source
"$args"
- nice. I was stuck on$args[0]
in this caseLua, 58 bytes
Try it online!
For some more Lua love here :)
la source
r
declaration and move it to ther
on the while statement, by doing so you'll use 1 less byte for the space (p,r=print,...p(r)while
).