Pyth , 4 octets
W
~O
Essayez-le en ligne!
Cela implémente essentiellement l'algorithme:
Q ← entréeR e p e a t1.2.3.t e m p ← QQ ← unif { 0 , Q - 1 }P r i n t (temp)U n t i lt e m p = 0
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. Puisque O
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 ++
de C
. Vous savez peut-être que ce x++
sera comme utiliser x
comme valeur actuelle, mais ce x
sera le cas par la suite x+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 -ce O
qui est très simple. Lorsque son seul argument est un entier O
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 variable Q
. Q
a une signification particulière en Pyth: chaque fois qu'il est présent dans un programme, le programme Pyth commence par l'affectation Q
à 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:
while print_and_return( assign_variable( Q, unif(0, Q-1) ) ):
pass
Et un échantillon "run-through" pourrait ressembler à:
- Q = 5
O
renvoie 3, ~
renvoie 5,\n
retourne et imprime 5, ce qui est vrai
- Q = 3
O
retourne 0, ~
retourne 3, \n
retourne et imprime 3 ce qui est vrai
- Q = 0
O
renvoie quelque chose de non pertinent, ~
retourne 0, \n
retourne et imprime 0 ce qui est faux
- Q = quelque chose de non pertinent
- Mettre fin