Necesito un UUID Tu trabajo es generar uno.
El UUID canónico (Universal Unique IDentifier) es un número hexadecimal de 32 dígitos con guiones insertados en ciertos puntos. El programa debe generar 32 dígitos hexadecimales (128 bits), en forma de xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
(8-4-4-4-12
dígitos), donde x
hay un número hexadecimal aleatorio. Suponiendo que el PRNG de su idioma es perfecto, todas las salidas válidas deben tener la misma probabilidad de ser generadas.
TL; DR
Genere 32 dígitos hexadecimales aleatorios en el formulario 8-4-4-4-12
dígitos del . El código más corto gana.
EDITAR: debe ser hexadecimal. Generar siempre decimal solo no es válido. EDIT 2: sin incorporados. Estos no son GUID, solo dígitos hexadecimales genéricos.
Salida de ejemplo:
ab13901d-5e93-1c7d-49c7-f1d67ef09198
7f7314ca-3504-3860-236b-cface7891277
dbf88932-70c7-9ae7-b9a4-f3df1740fc9c
c3f5e449-6d8c-afe3-acc9-47ef50e7e7ae
e9a77b51-6e20-79bd-3ee9-1566a95d9ef7
7b10e43c-3c57-48ed-a72a-f2b838d8374b
La entrada y las lagunas estándar no están permitidas.
Este es el código de golf , por lo que gana el código más corto. Además, siéntase libre de pedir aclaraciones.
12345678-1234-1234-1234-123456789012
debería ser un UUID válido (¿o es necesario algún dígito hexadecimal?). ¿Consideras esto una escapatoria?xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
dóndey
es uno de[89AB]
. En el momento de este comentario, ninguna de las respuestas (excepto C # que utiliza una biblioteca incorporada) está garantizada para producir un UUID aleatorio válido (y en realidad, es muy probable que no produzca uno).Respuestas:
Pyth, 20 bytes
Demostración.
Codifica
[1, 0, 0, 0, 2]
como 83 en la base 3, luego agrega uno y se multiplica por cuatro para obtener la longitud de cada segmento. Luego crea dígitos hexadecimales y se une en guiones.fuente
Julia, 80 bytes
Genere un entero aleatorio de 128 bits, obtenga su representación hexadecimal como una cadena rellenada con 32 dígitos y divídala en segmentos unidos con guiones.
¡Gracias a ConfusedMr_C y kvill por su ayuda!
fuente
CJam,
2625 bytesPruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
PowerShell,
776967 byteseditar: parens extraños:
editar: fue capaz de eliminar el .Trim final ("-") del original:
Puede ser más claro con algo de espacio en blanco dada la naturaleza de las banderas (-f y -Join). Todavía me gustaría perder el Trim final ("-"):
O, usando la funcionalidad incorporada (ala la respuesta C # anterior)
Sin embargo, parece un pequeño atajo, incluso si viene en 31 bytes.
fuente
(8,4,4,4,12|%{-join(1..$_|%{'{0:X}'-f(random(16))})})-join'-'
Python 2,
8684 bytesEsto encadena los formateadores de cadenas para hacer que Python formatee los números hexadecimales de forma exclusiva para cada segmento.
Sin golf:
Esto podría mejorar, pero estoy orgulloso.
fuente
Perl 5 , 43 bytes
¡ Ahorré 2 bytes gracias a @Xcali !
Pruébalo en línea!
fuente
PHP, 69
7275bytesEsto no genera dígitos hexadecimales (
a
, ...f
). Están permitidos, pero no son requeridos por el cuerpo de la pregunta.Ningún grupo de dígitos comienza con
0
(tampoco es obligatorio).editar: guardado 3 bytes gracias a @IsmaelMiguel
fuente
join()
en su lugar.C #, 65 bytes
editar: ¡Sí! C # es más corto que otro lenguaje (además de Java) :)
fuente
CreateUUID[]
!gawk, 86
Puede usar esto una vez cada segundo para generar un "UUID" aleatorio único. Esto se debe a que
srand()
utiliza el tiempo del sistema en segundos desde epoch como argumento si no se proporciona ningún argumento.Creo que la parte awk es bastante elegante.
Si desea usarlo más de una vez por segundo, puede llamarlo en bash de esta manera. Tenga en cuenta que la parte awk también cambia.
Se
echo
agrega allí para imprimir una nueva línea cada vez.fuente
K5, 35 bytes
Para generar un alfabeto hexadecimal, genero una cadena de caracteres (
`c$
) a partir de una lista de dígitos (48+!10
) y las primeras 6 letras mayúsculas (65+!6
). Una forma alternativa de generar los dígitos que tiene la misma longitud es,/$!10
.Con la cadena "0123456789ABCDEF" generada, el resto es simple. Seleccione 32 valores aleatorios de este conjunto (
32?
), corte (_
) la cadena resultante en la0 8 12 16 20
vía calculada(0,8+4*!4)
y luego una los fragmentos de cadena resultantes con guiones ("-"/
).En acción:
fuente
R , 63 bytes
Pruébalo en línea!
El código primero crea una cadena aleatoria de 36 caracteres y luego coloca los cuatro guiones. Produce un UUID a stdout.
fuente
c
llamadasprintf("%x",0:15)
por -1.JavaScript, ES6, 106 bytes
Utiliza Regex reemplazar. Trata la cadena de formato como un recuento para generar un carácter hexadecimal. Levantando donde puedo; omitiendo punto y coma cuando sea posible.
fuente
'8-4-4-4-12'.replace(/\d+/g,n=>Math.floor(16**n*Math.random()).toString(16).padStart(n,0))
Perl 6 , 53 bytes
El obvio:
Al traducir el ejemplo de Perl 5 usando
printf
, se obtiene un código que es un poco más corto.fuente
(0..16⁴)
?! ¿Puedes hacer eso en Perl?1,2,4,8,16 ... *
que genera una lista infinita perezosa de los poderes de 2. ({2**$++} ... *
también funciona)Kotlin , 175 bytes
Pruébalo en línea!
Mi primer programa de Kotlin y presentación de PPCG
fuente
APL (Dyalog Unicode) ,
11578 bytesPruébalo en línea!
Esta es mi primera presentación APL. Muchas gracias a @ Adám por ayudarme en el chat APL de PPCG y por la función de conversión hexadecimal.
Gracias a @ Zacharý por 1 byte
Editado para arreglar el conteo de bytes.
fuente
⎕IO←0
sin costo alguno, Adám hace mucho. Además, la mayoría de los bytes (IIRC, todos los que tiene aquí) se pueden contar como uno en APL.a(H 12?16)
aa H 12?16
para guardar un byte.'-'@(+\9,3⍴5)⊢(⎕D,819⌶⎕A)[?36⍴16]
o'-'@(+\9,3⍴5)∊⌂hex?18⍴256
Japt , 32 bytes
Pruébalo en línea!
fuente
m@
-£
, por ejemplo) y, para ayudarlo a comenzar, aquí hay una versión de 24 bytes de su solución: ethproductions.github.io/japt/… Acceda a la sala de chat de Japt si tiene alguna pregunta.MATLAB / Octave, 95 bytes
fuente
Perl , 51 bytes
Requiere perl5> = 5.10, creo. Para el modificador / r y para say ().
fuente
s//xx-x-x-x-xxx/;s/x/sprintf"%04x",rand 65536/eg
uso de-p
flag, también significaría que funciona sin versiones anteriores-E
.-p
) pero aún así bastante bueno y no hubiera considerado ese enfoque sin ver su respuesta.J ,
42 39 3727 bytesPruébalo en línea!
fuente
C ++,
194193221210201 bytes+7 bytes gracias a Zacharý (detectado un
-
que no debería estar al final)Si alguien tiene una manera de obtener un valor diferente en cada ejecución sin cambiar
srand
y sin incluir<ctime>
, sería genialfuente
#define L(a) for
... ser#define L(a)for...
? (Podría haber preguntado eso)"0123456789abcdef"[rand()%16]
, y luego eliminarf
?Befunge-93 , 97 bytes
Pruébalo en línea!
Estoy seguro de que esto puede reducirse, pero este es mi primer intento :)
fuente
Bash, 67 bytes
fuente
JavaScript REPL, 79 bytes
Pruébalo en línea!
Math.random
puede devolver0
. Agregar 5 ceros hace que el corte sea de 40
sfuente
Adelante (adelante) ,
9189 bytesPruébalo en línea!
Explicación
Cambia la base a hexadecimal, luego genera números / segmentos de la longitud apropiada con guiones a intervalos específicos
Explicación del código
fuente
C (gcc) ,
949186 bytesPruébalo en línea!
Me hubiera gustado sugerir esta versión en un comentario a Max Yekhlakov ( su respuesta ), pero desafortunadamente todavía no tengo los 50 puntos de reputación necesarios, así que aquí está mi respuesta.
803912
estáC4448
en hexadecimal, describe cómo se debe formatear la salida (12-4-4-4-8
), se invierte porque los dígitos menos significativos se leerán primero.Ediciones:
srand(time(0))
consrand(&i)
fuente
main(){...;int i=
puede sermain(i){...;i=
.srand()
acepto ununsigned int
como su parámetro semilla. En tio.run, anunsigned int
tiene 4 bytes de longitud pero el UUID tiene 16 bytes de longitud. Esto significa que solo se generará una pequeña fracción de las salidas válidas (1/2 ^ 12), por lo que mi solución (así como la anterior contime(0)
) no es válida. Qué piensas ?Assuming that your language's PRNG is perfect, all valid outputs must have the same probability of being generated.
. La entropía inicial no necesariamente determina la entropía RNG, aunque probablemente sí (no verificó lasrand()
implementación). Sin embargo,srand()
que yo sepa , es razonablemente uniforme, por lo que si el RNG fuera perfecto, aún sería uniforme. Por lo tanto, creo que su respuesta es válida.srand()
ya se haya hecho, y en este caso no habrá dudas. Pero no estoy seguro de si esto está permitido, otras presentaciones C / C ++ parecen incluirsrand()
int la respuesta (a menos que no se userand()
)C (gcc),
1431101039694 bytesGolfed hasta 94 bytes gracias a ceilingcat y Jonathan Frech.
Pruébalo en línea!
Explicación:
fuente
*z=L"\27\23\17\vz"
lugar de*z=L"\10\4\4\4\14"
y enfor(n=32;n--;z+=printf("-%x"+(n!=*z),P()&15)-1)
lugar defor(;*z;*++z&&putchar(45))for(n=*z;n--;printf("%x",P()&15))
Java con Ten Foot Laser Pole v. 1.06, 126 bytes
Probado con la versión 1.06 de la biblioteca, pero esto debería funcionar con cualquier versión 1.04 o posterior.
fuente
Jalea , 17 bytes
Pruébalo en línea!
fuente
SmileBASIC,
6562 bytesHe creado una función para imprimir 4 dígitos hexadecimales aleatorios:
DEF H?HEX$(RND(65536),4);:END
así como 4 dígitos con una-
después de ellosDEF G:H?"-";:END
. Entonces solo tiene que llamar a estas funciones muchas veces.fuente
Chip , 109 + 6 = 115 bytes
Requiere banderas
-wc36
, causando +6 bytesPruébalo en línea!
Genera 4 bits aleatorios (los cuatro
?
) y los convierte en dígitos hexadecimales:0x0
-0x9
=>0
-9
0xa
-0xe
=>b
-f
0xf
=>a
... un poco poco convencional, pero me ahorró algunos bytes sin costo para la distribución de resultados.
fuente