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 3es decir, es (1 + 2) * 3), podemos comenzar desde la izquierda y completar los argumentos a medida que avanzamos.
Wcomienza 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 Ono 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 xcomo valor actual, pero a partir de entonces xlo 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 Oque es muy simple. Cuando su único argumento es un entero, Odevuelve un valor de 0 a uno menos que ese entero de manera uniforme al azar.
Ahora puede haber notado Oque no tiene un argumento. Aquí el intérprete de Pyth rellena amablemente una suposición, que aquí es la variable Q. Qtiene un significado especial en Pyth: cada vez que está presente en un programa, el programa Pyth comienza con la asignación Qa la entrada del programa. Como esta es la primera variable que ocurre en ~el argumento de '', Qahora 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
Odevuelve 3, ~devuelve 5,\n devuelve e imprime 5, lo cual es cierto
- Q = 3
Odevuelve 0, ~devuelve 3, \ndevuelve e imprime 3, lo cual es cierto
- Q = 0
Odevuelve algo irrelevante, ~devuelve 0, \ndevuelve e imprime 0 que es falso
- Q = algo irrelevante
- Terminar