Reto
Dado un entero positivo (K)
Produce un entero uniformemente aleatorio (Y)
entre [0, K)
.
Si Y > 0
asume K = Y
y repite el proceso hasta Y = 0
.
Reglas
- La entrada debe imprimirse al principio
- Formato de salida como desee
- Tu programa debe terminar.
0
debe ser la salida final, opcionalmente una línea vacía en su lugar0
Respuestas:
Pyth ,
6 54 bytesPruébalo aquí!
Cómo funciona
fuente
C (gcc) , 42 bytes
Pruébalo en línea!
Utiliza lógica y cortocircuito.
C (gcc) , 40 bytes (sin imprimir el valor inicial)
Pruébalo en línea!
Utiliza lógica y cortocircuito.
fuente
rand()%_
no es uniformeR ,
66 60 56 4341 bytesPruébalo en línea!
fuente
>0
ycat(n,"")
(cadena vacía) también funcionará.print
es más eficiente aquí, ya que devuelve su argumento: 56 bytesk=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 bytes
Pruébalo en línea!
Explicación
fuente
Pepe , 25 bytes
Pepe es un lenguaje de programación creado por el usuario Soaku .
Pruébalo en línea!
Explicación:
fuente
Perl 6 , 18 bytes
Pruébalo en línea!
Bloque de código anónimo que devuelve una lista de valores. Si no le importa que los números sean rangos, puede hacer:
por 17 bytes. Curiosamente, otra función aleatoria incorporada
roll
, tiene el mismo comportamiento en esta instancia para la misma cantidad de bytes.fuente
Perl 5 .10.0
-pl
, 26 bytesPruébalo en línea!
fuente
Gelatina ,
43 bytesEste es un enlace monádico (función) que imprime una matriz y devuelve 0 .
Pruébalo en línea!
Cómo funciona
fuente
Brachylog , 8 bytes
Pruébalo en línea!
Explicación
La recursión se detendrá una vez que
?ℕ₁
falle, es decir, cuando la entrada sea0
.fuente
05AB1E ,
87 bytesPruébalo en línea!
Explicación
fuente
Δ=ݨΩ0M
es equivalente.J, 13 bytes
En el metro, disculpas por falta de TIO (espero que no haya falta de corrección).
Emite una lista de valores.
Presumiblemente, el enfoque APL será más corto, pero esto es lo que pensé.
Cómo funciona
^:a:
aplicar repetidamente hasta la convergencia, almacenando resultados intermedios en una matriz.?
entero aleatorio en el rango[0, K)
deK
mayor que 0. Para 0, da un entero aleatorio en el rango(0,1)
. Para un número de coma flotante, errores.::]
detectar un error para una entrada?
y, en lugar de generar un error , generar la entrada que causó el error.}:
deshacerse del último valor en la matriz (esto es para que no se genere un número de coma flotante).Pruébalo en línea!
fuente
?.
, pero no creo que esté usando eso.JavaScript (ES6),
3837 bytes-1 byte gracias a @Arnauld
Mostrar fragmento de código
fuente
new Date%n
realmente no funciona aquí, ya que no cambia lo suficientemente rápido como para ser útil para generar múltiples números aleatoriosC, 38 bytes
Pruébalo en línea
Sin golf
fuente
&&
; Además, puede considerar sembrar el RNG en sumain
función: ¡ Pruébelo en línea!Pyth , 4 bytes
Pruébalo en línea!
Básicamente, esto implementa el algoritmo:
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. ComoO
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++
deC
. Puede saber quex++
será como usarlox
como valor actual, pero a partir de entoncesx
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
~
esO
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 variableQ
.Q
tiene un significado especial en Pyth: cada vez que está presente en un programa, el programa Pyth comienza con la asignaciónQ
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í:
Y una muestra de "ejecución" podría verse así:
O
devuelve 3,~
devuelve 5,\n
devuelve e imprime 5, lo cual es ciertoO
devuelve 0,~
devuelve 3,\n
devuelve e imprime 3, lo cual es ciertoO
devuelve algo irrelevante,~
devuelve 0,\n
devuelve e imprime 0 que es falsofuente
APL (Dyalog Unicode) ,
129 bytesFunción de prefijo tácito anónimo. Asume
⎕IO
( I ndex O rigin) para ser0
, que es predeterminado en muchos sistemas. Devuelve el valor final (0) además de imprimir mientras se ejecuta.Pruébalo en línea!
{
...}⍣=
aplique la siguiente función hasta que sea estable:⎕←⍵
dar salida al argumento?
devuelve un número aleatorio distribuido uniformemente en el rango de 0 a ese – 1⌊
redondear hacia abajo (porque?0
da un flotador (0,1))fuente
C (gcc) ,
4042 bytesSome idiot ™ olvidó imprimir primero el valor inicial.
No entres en pánico.
fuente
f(K){while(K)printf("%d\n",K),K=rand()%K;}
. ¡Aún tienes mi +1 para una solución igual!f(K){while(K)printf("%d\n",K,K=rand()%K);}
x86 + rdrand, 19 bytes
Implementación directa. Toma la entrada K
ecx
y las salidas a una memoria intermediaebx
.fuente
Python 3 , 39 bytes
Probablemente no sea el generador de números aleatorios más seguro criptográficamente, pero para el ojo humano parece lo suficientemente aleatorio ...
Pruébalo en línea!
fuente
k=0
es aceptable.hash()
intenta mantener pero no garantiza esta propiedad. Para esa tarea, debe usar elrandom
módulo.random.randrange()
:from random import*;f=lambda k:print(k)or f(randrange(k))
TI-Basic (TI-84 Plus CE),
1713 bytes-4 bytes de Misha Lavrov
Toma entrada
Ans
como50:prgmNAME
.TI-Basic es un lenguaje tokenizado . Todas las fichas utilizadas aquí son de un byte.
Explicación:
Una solución de 11 bytes sugerida por Misha Lavrov que requiere presionar
enter
después de cada línea que sigue a la primera.fuente
int(Ansrand
Es más corto. Además, usando enPause
lugar deDisp
, puede hacer que la única instrucción en el bucle seaPause int(Ansrand
, que también se actualizaAns
.Python 2 ,
646260 bytesPruébalo en línea!
Salvado
fuente
while 1:print k;k=randint(0,~-k)
debería funcionar (con un error al final)while 1:print k;k=randrange(k)
salva dos.C ++ (gcc), 98 bytes
Pruébalo aquí!
Uso
Este es mi primer intento de código de golf. Cualquier comentario o comentario son bienvenidos.
Editar: se eliminó la función principal como se sugiere para que sea válida.
fuente
-Dd='printf("%i,",x'
lugar de#define
ahorraría algunos bytes (-4), y se permite siempre que cuente los bytes hacia su resultado (porque es una directiva de preprocesador no estándar. También puede omitir las importaciones (en menos con-std=c++98
y-w
, que no cuentan para bytes), y los tipos de variables. Entonces, tendríap(x){d);while(x>0)d=rand()%x;}
y-Dd='printf("%i,",x'
.> <>, 92 + 2 bytes
+ 2B para la bandera -v
Pruébalo en línea!
La única fuente de aleatoriedad de> <> proviene de la instrucción 'x', que establece la dirección del puntero de la instrucción en un valor aleatorio. Como tal, generar un número aleatorio de 0 a n no es trivial.
Primero calculo cuántos bits se requieren para representar un número en el rango [0, n), luego genero bits aleatorios para generar un número aleatorio. Esto deja la posibilidad de que genere un número ligeramente mayor que n, en cuyo caso simplemente lo descartamos e intentamos nuevamente.
Explicación:
fuente
MATLAB (
4946 bytes)Salida de muestra:
fuente
k=randi(k)-1
por unos pocos bytes menos.Retina , 21 bytes
Pruébalo en línea! Explicación:
Repita hasta que el valor deje de cambiar (es decir, 0).
Imprima el valor antes de cada pasada a través del bucle.
Convierte a unario.
Crea el rango y convierte a decimal.
Elige un elemento aleatorio.
fuente
Pyth ,
67 bytesPruébalo en línea!
+1 para imprimir el valor de entrada inicial.
Si bien Q es verdadero, configure Q para que sea un entero aleatorio entre 0 y Q e imprima Q.
No es la respuesta más corta de Pyth, pero solo estoy aprendiendo y solo publicando debido a la reciente discusión sobre que ya nadie usa Pyth :)
fuente
=
y~
utilizar la primera variable de una expresión como la variable que se asignará si no se especifica. Por ejemplo,~hT
se estableceráT
en 11 mientras devuelve 10. El único otro truco elegante es que el carácter de nueva línea imprime su entrada y luego devuelve ese valor sin modificar, para que podamos tener un cuerpo de bucle vacío. Avísame si hay algo más confuso :)Haskell ,
7471 bytes-3 bytes haciendo realmente lo que las especificaciones dicen que debería hacer.
Pruébalo en línea!
fuente
Fórmula IBM / Lotus Notes, 48 bytes
Fórmula de campo que toma datos de otro campo
i
.No hay TIO para la fórmula, así que aquí hay una captura de pantalla de una salida de muestra:
fuente
Powershell,
3632 bytes-4 bytes gracias AdmBorkBork
Testscript:
Salida:
fuente
Get-
está implícito , por lo que puede eliminarlo por -4 bytes. ¡ Pruébelo en línea!PowerShell , 35 bytes
Pruébalo en línea!
Programa completo Toma datos
$args
, los almacena$a
y entra en unfor
bucle. Cada iteración que estamos verificando si$a
sigue siendo positiva (como lo0
es falsey en PowerShell). Luego lo dejamos$a
en la tubería y pasamos a la siguiente iteración, donde establecemos$a
el resultadoGet-Random $a
, que devuelve un número entero en el rango0..($a-1)
.(Ab) utiliza el hecho de que PowerShell genera una nueva línea final adicional en lugar de generar el cero final (permitido por las reglas tal como están escritas actualmente).
fuente
"$args"
- bonito. Estaba atrapado$args[0]
en este casoLua , 58 bytes
Pruébalo en línea!
Para más amor Lua aquí :)
fuente
r
declaración y moverlo a lar
instrucción while, al hacerlo, usarás 1 byte menos para el espacio (p,r=print,...p(r)while
).