Pyth , 4 bytes
W
~O
Pruébalo en línea!
Básicamente, esto implementa el algoritmo:
Q ← entradaR 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
Para traducir Pyth al algoritmo, podemos examinar principalmente lo que significa cada personaje. Dado que Pyth está escrito en notación de prefijo ( * + 1 2 3
es decir, es (1 + 2) * 3
), podemos comenzar desde la izquierda y completar los argumentos a medida que avanzamos.
W
comienza un ciclo while tradicional. La primera declaración después es la condición del bucle y la segunda declaración después es el cuerpo del bucle. Si la segunda declaración está vacía, se convierte en un no-op . Esto funciona exactamente igual que Python while, por lo que evaluará enteros distintos de cero como Verdadero y cero como falso.
La primera declaración después del tiempo comienza con el carácter de nueva línea. Esto corresponde a la función "imprimir y volver con una nueva línea" de Pyth. Esto requiere un argumento, que luego se imprime y también se devuelve sin modificar. Esto nos permite imprimir los pasos intermedios mientras realizamos las operaciones necesarias.
El argumento pasado a esta función de impresión comienza con lo ~
que es un poco especial. Si el carácter inmediatamente posterior ~
es una variable, toma dos argumentos; de lo contrario, toma uno. Como O
no es una variable ~
, solo se consumirá un argumento. ~
funciones un poco como +=
lo hace en muchos lenguajes convencionales, aunque el operador más cercano sería el operador de incremento ++
de C
. Puede saber que x++
será como usarlo x
como valor actual, pero a partir de entonces x
lo será x+1
. ~
es la misma idea, pero generalizada a cualquiera que sea el resultado del primer argumento. La forma en que elige a qué variable asignar se abordará más adelante.
El argumento de ~
es O
que es muy simple. Cuando su único argumento es un entero, O
devuelve un valor de 0 a uno menos que ese entero de manera uniforme al azar.
Ahora puede haber notado O
que no tiene un argumento. Aquí el intérprete de Pyth rellena amablemente una suposición, que aquí es la variable Q
. Q
tiene un significado especial en Pyth: cada vez que está presente en un programa, el programa Pyth comienza con la asignación Q
a la entrada del programa. Como esta es la primera variable que ocurre en ~
el argumento de '', Q
ahora también es la variable a la que se ~
le asignará un valor.
En resumen, nuestro programa "legible" podría verse así:
while print_and_return( assign_variable( Q, unif(0, Q-1) ) ):
pass
Y una muestra de "ejecución" podría verse así:
- Q = 5
O
devuelve 3, ~
devuelve 5,\n
devuelve e imprime 5, lo cual es cierto
- Q = 3
O
devuelve 0, ~
devuelve 3, \n
devuelve e imprime 3, lo cual es cierto
- Q = 0
O
devuelve algo irrelevante, ~
devuelve 0, \n
devuelve e imprime 0 que es falso
- Q = algo irrelevante
- Terminar