¿Cuál es la forma más corta de generar una cadena aleatoria con una longitud dada y con solo caracteres alfanuméricos permitidos?
- ejemplo de una cadena aleatoria: con N = 9 la salida sería
aZua7I0Lk
- se puede suponer que la longitud dada N siempre es mayor que 0
- si es necesario, puede asumir 256 como un valor máximo para N, pero se prefieren las soluciones con límites más altos para N y que todavía tienen un tiempo de cálculo rápido
- caracteres permitidos: 0-9, az y AZ
- un carácter puede aparecer más de una vez en la cadena de salida
- cada posible cadena debería ser igualmente probable (para la precisión del generador de números aleatorios de su idioma)
Respuestas:
Jalea , 4 bytes
Pruébalo en línea!
Explicación
El poder cartesiano básicamente genera toda la lista de una longitud dada que se puede formar a partir de un conjunto dado de elementos; eso es exactamente lo que necesitamos aquí.
fuente
Taxi , 2577 bytes
Pruébalo en línea!
El taxi es súper no se hizo para esto, pero usted puede hacerlo! Trataré de explicar lo que está sucediendo debajo de la versión sin golf.
Inicio: Obtener stdin
Seleccione el valor de stdin como texto, conviértalo en un número y péguelo en algún lugar para esperar.
Plan A Parte 1: Obtenga un número entero aleatorio 1-62
Obtenga un número entero aleatorio y luego obtenga
62
un número. Duplique tanto el entero aleatorio como el62
porque los necesitaremos más adelante. Sólo se puede llevar a 3 pasajeros a la vez por lo que terminamos conrand
,rand
y62
. (El otro62
esperará hasta que regresemos.) Ve a dividirrand
por62
y trunca el resultado para obtener un número entero. Regrese para obtener la otra copia62
y multiplíquela por el entero truncado de la división. Finalmente, reste el producto de la primera copia derand
. Esto nos da un número 0-61. Ahora tenemos que volver a recoger a1
y agregarlo al resultado para obtener un número 1-62. Sí, todas esas líneas de texto son justasmod(rand(),62)+1
.Plan A Parte 2: Cree una matriz de caracteres entre los que elegir Elija
una cadena con todos los caracteres válidos y también uno al final que no queremos (más sobre eso más adelante). El
63
que recogimos anteriormente coincide con esta longitud de cadena. Llévelo a Chop Suey para dividirlo en pasajeros individuales.Plan B: Mueva la matriz para que podamos seleccionar un personaje
Uno por uno, mueva cada personaje al Parque Narrow Path. Es la única pila disponible y la única forma de no tener pasajeros sobrantes en el camino. Todo lo demás en Townsburg es FIFO, por lo que tendría que regresar y despejar a todos los pasajeros en cada iteración del circuito general. De esta manera, puedo dejarlos en el parque y los 63 nuevos personajes los apartarán del camino cada vez.
A
Es probable que el primero nunca escape .Plan C: Prepárese para seleccionar un personaje.
Esto es realmente solo unas pocas paradas que no necesitaban estar en el Plan D. Reubique el taxi en preparación.
Plan D: Obtenga todos los caracteres que no deseamos
Comenzando con el primer carácter en la "matriz" invertida (este es el 63º carácter que no queremos), continúe recogiendo y concatenando caracteres a medida que hacemos la cuenta regresiva del resultado de la
mod
función en el Plan A. Una vez que llegue a cero, el siguiente personaje es el que desea.Plan E: Ahogar a los que no quieres y devolver el elegido.
"[P] los pasajeros que cayeron en el puente Riverview parecen caer siempre por el costado y caer al río ..." Bueno, eso elimina esa cadena de perdedores concatenados. Ve a buscar el siguiente personaje y envíalo a stdout. Finalmente, verifiquemos cuántos caracteres hemos impreso hasta ahora. Volvamos a Sunny Skies para recoger el valor estándar que dejamos hace tanto tiempo. Reste uno y, si el resultado es más de cero, envíelo de nuevo a esperar y comience nuevamente en el Plan A.
fuente
code-bowling
y fue revisada a la baja. Lacode-golf
respuesta más larga que pude encontrar es la presentación original de Brain-Flak sobre el desafío básico de quine. Viene en 9.5 * 10 ^ 580 bytes. La respuesta actual más larga que encontré fue un probador principal en Unary : 1.65 * 10 ^ 56 bytes.C (gcc) ,
575552 bytesGracias a 2501 por los punteros ...
Pruébalo en línea!
fuente
rand()%74
debería serrand()%75
&&putchar(i)
lugar del operador ternario.Jalea , 5 bytes
Se perdió un truco: vea el byter de ais523
Pruébalo en línea!
¿Cómo?
fuente
Shell + pwgen , 13 bytes
Salida de muestra
fuente
Java 8,
1831499788 bytesPruébalo en línea.
-9 bytes portando la respuesta C de @ 2501 , ¡así que asegúrese de votarlo también!
Respuesta anterior, 97 bytes
Pruébalo en línea.
Explicación:
fuente
C, 60 bytes
Véalo funcionar aquí .
Vea la distribución aquí .
Se distribuye uniformemente, suponiendo que
rand() % 62
produce una distribución uniforme. Como 62 generalmente no divide equitativamente RAND_MAX, hay un sesgo muy pequeño.fuente
Muñeco de nieve , 58 bytes
Pruébalo en línea!
Esta es una subrutina que toma un entero como entrada y devuelve la cadena aleatoria.
fuente
((}#`""*:48vn58nR|65vn91nR,aC|97vn123nR,aCAsH1AaL#aC*;bR))
.PowerShell,
5854 bytes-4 gracias a Andrei Odegov: envío a una matriz de caracteres en lugar de bucle para crear una matriz de caracteres.
genera un rango
1..2+4..5 = 1,2,4,5
de todos los códigos de caracteres aceptables, luego selecciona el$args
número de elementos al azar usandorandom -Count
- los elementos resultantesse enlazanse|%{}
y se convierten en[char]
s,convierten enuna variedad de caracteres usando[char[]]
- luego todo se encapsula entre paréntesis y se-join
juntan.No funciona para una entrada de 0, ya que
Get-Random
solo acepta números superiores a 1 para el-Count
parámetro.fuente
-join[char[]](65..90+97..122+48..57|random -C "$args")
PHP, 56 bytes
Versión en línea
ctype_alnum
fuente
05AB1E , 6 bytes
Pruébalo en línea!
Explicación
fuente
Perl 5 , 41 bytes
40 bytes de código +
-p
bandera.Pruébalo en línea!
(a..z,A..Z,0..9)
crea una matriz que contiene todas las letras y números,[rand 62]
devuelve un elemento aleatorio de esta matriz, que es append (.=
)$\
, que se imprime implícitamente al final gracias a la-p
marca con}{
.O, para el mismo bytecount, pero usando los parámetros en lugar de la entrada estándar:
Pruébalo en línea!
fuente
R, 51 bytes
Misma longitud que la otra respuesta R, pero un enfoque diferente.
letters
yLETTERS
ambas son variables integradas que contienen todas las letras mayúsculas y minúsculas, respectivamente. Además0:9
de eso, tenemos todo el conjunto de caracteres alfanuméricos.fuente
R,
54525149 bytesExplicación:
scan()
c(65:90,97:122,48:57)
sample(c(65:90,97:122,48:57),scan(),T)
intToUtf8
fuente
JavaScript (ES6),
6154395264 bytes¡Esto es casi como el golf inverso! Tuvo un gran éxito en el conteo de bytes asegurando que se usaría la gama completa de personajes de los tres grupos.
Intentalo
fuente
[0-5w-z]
exclusivamente.btoa(String.fromCharCode(Math.random()*248))[0]
cubrir todo el rango de manera uniforme.toString
y luego codificar) para garantizar que se pueda devolver una gama completa de caracteres de los 3 grupos.014589ABEFIJMNQRUVYZcdghklopstwx
(y no uniforme).Alice , 24 bytes
Pruébalo en línea!
Este diseño ya es mucho mejor que el que tenía originalmente (32 bytes), pero estoy seguro de que aún no es óptimo ...
Explicación
fuente
Python + exrex , 81 bytes
fuente
Python 2,
798379 bytes+4 bytes (no tuvo en cuenta la repetición)
-4 bytes (Gracias a @Rod por la sugerencia de uso
printable[:62]
)fuente
(s.letters+s.digits)*x
lugars.letters+s.digits
`r.sample(...)`[2::5]
en su lugar''.join(r.sample(...))
para guardar un byte (solo python 2) y(s.letters+s.digits)*x
puede cambiarlos.printable[:62]*x
para guardar 4 bytesprintable
, no pude hacer[2::5]
que funcionara (¿tal vez lo estaba haciendo mal?)r.sample()
con``
información de fondoBrachylog , 14 bytes
Pruébalo en línea!
Explicación
fuente
MATL , 8 bytes
Pruébalo en línea!
fuente
Lote, 175 bytes
s
realiza doble tarea aquí ya que contiene tanto la lista alfanumérica como los caracteres seleccionados al azar. Después de imprimir el resultado, el código pasa a la subrutina cuyo resultado se ignora.fuente
Pyke , 4 bytes
Pruébalo en línea!
fuente
MemoryError
Pyth,
711 bytesPruébalo en línea
Explicación
fuente
C # - 121 bytes
fuente
APL (Dyalog) con AGL , 17 bytes
Pruébalo en línea!
(
...)[
...]
indice en⎕A,∆a,⎕D
alfabeto en mayúscula seguido de alfabeto en minúscula seguido de dígitosutilizando
62
(el número de símbolos posibles⍴
remodelado por⎕
entrada evaluada ( n )?
cambie cada 62 en un número aleatorio en el rango 1 ... 62APL (APLX) , 17 bytes
fuente
Bash , 43 bytes
Pruébalo en línea!
fuente
Pip , 13 bytes
Pruébalo en línea!
Explicación
fuente
Sinclair ZX81 / Timex TS1000 / 1500 BASIC, ~ 63 bytes BASIC tokenizados
No hay caracteres en minúscula en ZX81 sin usar el ensamblado o tener algún tipo de ROM UDG o algo así, y por el momento, solo sale
A-Z
. Si se ingresa cero, el programa se detiene y vuelve al modo directo.fuente
Japt ,
128 bytesIntentalo
fuente
Apilado , 33 bytes
Pruébalo en línea! Toma información desde la parte superior de la pila y deja la salida en la parte superior de la pila.
fuente