J'ai besoin d'un UUID. Votre travail consiste à en générer un.
L'UUID canonique (Universally Unique IDentifier) est un nombre hexadécimal à 32 chiffres avec des tirets insérés à certains points.Le programme devrait produire 32 chiffres hexadécimaux (128 bits), sous la forme de xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
( 8-4-4-4-12
chiffres), où x
est un nombre hexadécimal aléatoire. En supposant que le PRNG de votre langue est parfait, toutes les sorties valides doivent avoir la même probabilité d'être générées.
TL; DR
Générez 32 chiffres hexadécimaux aléatoires dans les 8-4-4-4-12
chiffres du formulaire . Le code le plus court gagne.
EDIT: Doit être hexadécimal. Toujours générer uniquement des décimales n'est pas valide. EDIT 2: Aucun intégré. Ce ne sont pas des GUID, juste des chiffres hexadécimaux génériques.
Exemple de sortie:
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
L'entrée et les failles standard sont interdites.
C'est le code-golf , donc le code le plus court l'emporte. N'hésitez pas non plus à demander des clarifications.
12345678-1234-1234-1234-123456789012
devrait être un UUID valide (ou un chiffre hexadécimal est-il nécessaire?). Considérez-vous cela comme une échappatoire?xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
oùy
est l'un[89AB]
. Au moment de ce commentaire, aucune des réponses (à l'exception de C # utilisant une bibliothèque intégrée) n'est garantie de produire un UUID aléatoire valide (et en fait, il est fort probable qu'il n'en produise pas).Réponses:
Pyth, 20 octets
Manifestation.
Encode
[1, 0, 0, 0, 2]
83 en base 3, puis en ajoute un et multiplie par quatre pour obtenir la longueur de chaque segment. Fait ensuite des chiffres hexadécimaux et joint les traits d'union.la source
Julia, 80 octets
Générez un entier aléatoire de 128 bits, obtenez sa représentation hexidécimale sous la forme d'une chaîne complétée à 32 chiffres et divisez-la en segments joints avec des tirets.
Merci à ConfusedMr_C et kvill pour leur aide!
la source
CJam,
2625 octetsEssayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
la source
PowerShell,
776967 octetsmodifier: parens étrangers:
edit: a pu supprimer le .Trim ("-") de fin de l'original:
Cela peut être plus clair avec certains espaces étant donné la nature des drapeaux (-f et -Join). J'aimerais toujours perdre le Trim final ("-"):
Ou, en utilisant la fonctionnalité intégrée (ala la réponse C # ci-dessus)
Cependant, il semble un petit raccourci-y même s'il arrive à 31 octets.
la source
(8,4,4,4,12|%{-join(1..$_|%{'{0:X}'-f(random(16))})})-join'-'
Python 2,
8684 octetsCela enchaîne les formateurs de chaînes pour que Python formate les nombres hexadécimaux uniquement pour chaque segment.
Non golfé:
Cela pourrait nécessiter quelques améliorations, mais je suis fier.
la source
Perl 5 , 43 octets
Sauvegardé 2 octets grâce à @Xcali !
Essayez-le en ligne!
la source
PHP, 69
7275octetsCela ne produit pas de chiffres hexadécimaux (
a
, ...f
). Ils sont autorisés, mais pas requis par le corps de la question.Aucun groupe de chiffres ne commence par
0
(également non requis).edit: sauvé 3 octets grâce à @IsmaelMiguel
la source
join()
place.C #, 65 octets
modifier: Oui! C # est plus court qu'un autre langage (à part Java) :)
la source
CreateUUID[]
!gawk, 86
Vous pouvez l'utiliser une fois par seconde pour générer un "UUID" aléatoire unique. En effet,
srand()
utilise le temps système en secondes depuis epoch comme argument s'il n'y a pas d'argument donné.Je pense que la partie awk est plutôt élégante.
Si vous souhaitez l'utiliser plus d'une fois par seconde, vous pouvez l'appeler en bash comme ceci. Notez que la partie awk est également modifiée.
Le
echo
est ajouté pour imprimer une nouvelle ligne à chaque fois.la source
K5, 35 octets
Pour générer un alphabet hexadécimal, je génère une chaîne de caractères (
`c$
) à partir d'une liste de chiffres (48+!10
) et des 6 premières lettres majuscules (65+!6
). Une autre manière de générer des chiffres de même longueur est,/$!10
.Avec la chaîne "0123456789ABCDEF" générée, le reste est simple. Sélectionnez 32 valeurs aléatoires dans cet ensemble (
32?
), coupez (_
) la chaîne résultante à0 8 12 16 20
calculée via(0,8+4*!4)
, puis joignez les fragments de chaîne résultants avec des tirets ("-"/
).En action:
la source
R , 63 octets
Essayez-le en ligne!
Le code crée d'abord une chaîne aléatoire de 36 caractères, puis place les quatre tirets. Il envoie un UUID à stdout.
la source
c
appel parsprintf("%x",0:15)
-1.JavaScript, ES6, 106 octets
Utilise Regex remplacer. Traite la chaîne de format comme un décompte pour générer un caractère hexadécimal. Hisser partout où je peux; en omettant les points-virgules si possible.
la source
'8-4-4-4-12'.replace(/\d+/g,n=>Math.floor(16**n*Math.random()).toString(16).padStart(n,0))
Perl 6 , 53 octets
L'évident:
La traduction de l'exemple Perl 5 en utilisant un
printf
code un peu plus court.la source
(0..16⁴)
?! Vous pouvez faire ça en Perl?1,2,4,8,16 ... *
ce qui génère une liste infinie paresseuse des puissances de 2. ({2**$++} ... *
fonctionne également)Kotlin , 175 octets
Essayez-le en ligne!
Mon tout premier programme Kotlin et soumission PPCG
la source
APL (Dyalog Unicode) ,
11578 octetsEssayez-le en ligne!
Ceci est ma première soumission APL. Un grand merci à @ Adám pour m'avoir accompagné lors du chat APL du PPCG et pour la fonction de conversion hexadécimale.
Merci à @ Zacharý pour 1 octet
Modifié pour corriger le nombre d'octets.
la source
⎕IO←0
sans frais d'octet, Adám fait beaucoup. De plus, la plupart des octets (IIRC, tous ceux que vous avez ici) peuvent être comptés comme un dans APL.a(H 12?16)
poura H 12?16
sauver un octet.'-'@(+\9,3⍴5)⊢(⎕D,819⌶⎕A)[?36⍴16]
ou'-'@(+\9,3⍴5)∊⌂hex?18⍴256
Japt , 32 octets
Essayez-le en ligne!
la source
m@
-£
, par exemple) et, pour vous aider à démarrer, voici une version de 24 octets de votre solution golfée à la hâte : ethproductions.github.io/japt/… Placez -vous dans le salon de discussion Japt si vous avez des questions.MATLAB / Octave, 95 octets
la source
Perl , 51 octets
Nécessite perl5> = 5.10 je pense. Pour le modificateur / r et pour say ().
la source
s//xx-x-x-x-xxx/;s/x/sprintf"%04x",rand 65536/eg
utilisation de l'-p
indicateur, cela signifierait également qu'elle fonctionne sur les anciennes versions sans-E
.-p
) mais toujours assez bon et je n'aurais pas envisagé cette approche sans voir votre réponse!J ,
42 39 3727 octetsEssayez-le en ligne!
la source
C ++,
194193222210 210201 octets+7 octets grâce à Zacharý (détecté un
-
qui ne devrait pas être à la fin)Si quelqu'un a un moyen d'obtenir une valeur différente à chaque exécution sans changer
srand
et sans inclure<ctime>
, ce serait bienla source
#define L(a) for
... être#define L(a)for...
? (Pourrait avoir déjà demandé cela)"0123456789abcdef"[rand()%16]
, puis supprimerf
?Befunge-93 , 97 octets
Essayez-le en ligne!
Je suis sûr que cela peut être réduit, mais c'est mon premier essai :)
la source
Bash, 67 octets
la source
JavaScript REPL, 79 octets
Essayez-le en ligne!
Math.random
peut revenir0
. L'ajout de 5 zéros permet au découpage d'obtenir 40
sla source
Forth (gforth) ,
9189 octetsEssayez-le en ligne!
Explication
Change la base en hexadécimal, puis sort des nombres / segments de la longueur appropriée avec des tirets à intervalles spécifiés
Explication du code
la source
C (gcc) ,
949186 octetsEssayez-le en ligne!
J'aurais aimé proposer cette version dans un commentaire à Max Yekhlakov ( sa réponse ), mais malheureusement je n'ai pas encore les 50 points de réputation nécessaires, alors voici ma réponse.
803912
estC4448
en hexadécimal, il décrit comment la sortie doit être formatée (12-4-4-4-8
), elle est inversée car les chiffres les moins significatifs seront lus en premier.Modifications:
srand(time(0))
parsrand(&i)
la source
main(){...;int i=
peut êtremain(i){...;i=
.srand()
j'accepte apparemment ununsigned int
comme paramètre de départ. Sur tio.run, anunsigned int
fait 4 octets mais l'UUID fait 16 octets. Cela signifie que seule une infime fraction des sorties valides (1/2 ^ 12) sera générée, donc ma solution (ainsi que la précédente avectime(0)
) n'est pas valide. Qu'est-ce que tu penses ?Assuming that your language's PRNG is perfect, all valid outputs must have the same probability of being generated.
. L'entropie de la graine ne détermine pas nécessairement l'entropie du RNG, bien qu'elle le fasse probablement (n'a pas vérifié lasrand()
mise en œuvre). Cependant,srand()
est à ma connaissance raisonnablement uniforme, donc si le RNG était parfait, il serait toujours uniforme. Je pense donc que votre réponse est valable.srand()
a déjà été fait, et dans ce cas il n'y aura aucun doute. Mais je ne sais pas si cela est autorisé, d'autres soumissions C / C ++ semblent toutes incluresrand()
la réponse (à moins qu'elle n'utilise pasrand()
)C (gcc),
1431101039694 octetsGolfé à 94 octets grâce à plafondcat et Jonathan Frech.
Essayez-le en ligne!
Explication:
la source
*z=L"\27\23\17\vz"
place de*z=L"\10\4\4\4\14"
etfor(n=32;n--;z+=printf("-%x"+(n!=*z),P()&15)-1)
au lieu defor(;*z;*++z&&putchar(45))for(n=*z;n--;printf("%x",P()&15))
Java avec Ten Foot Laser Pole v. 1.06, 126 octets
Testé avec la version 1.06 de la bibliothèque, mais cela devrait fonctionner avec n'importe quelle version 1.04 ou plus récente.
la source
Gelée , 17 octets
Essayez-le en ligne!
la source
SmileBASIC,
6562 octetsJ'ai créé une fonction pour imprimer 4 chiffres hexadécimaux aléatoires:
DEF H?HEX$(RND(65536),4);:END
ainsi que 4 chiffres avec un-
après euxDEF G:H?"-";:END
. Ensuite, il suffit d'appeler ces fonctions plusieurs fois.la source
Puce , 109 + 6 = 115 octets
Nécessite des drapeaux
-wc36
, provoquant +6 octetsEssayez-le en ligne!
Génère 4 bits aléatoires (les quatre
?
) et convertit en chiffres hexadécimaux:0x0
-0x9
=>0
-9
0xa
-0xe
=>b
-f
0xf
=>a
... un peu non conventionnel, mais cela m'a fait économiser quelques octets sans frais pour la distribution des résultats.
la source