Ich brauche eine UUID. Ihre Aufgabe ist es, eine zu generieren.
Die kanonische UUID (Universally Unique IDentifier) ist eine 32-stellige Hexadezimalzahl mit Bindestrichen an bestimmten Stellen. Das Programm sollte 32 Hexadezimalziffern (128 Bit) in Form von xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
( 8-4-4-4-12
Ziffern) ausgeben , wobei x
es sich um eine zufällige Hexadezimalzahl handelt. Vorausgesetzt, das PRNG Ihrer Sprache ist perfekt, müssen alle gültigen Ausgaben die gleiche Wahrscheinlichkeit haben, generiert zu werden.
TL; DR
Generieren Sie 32 zufällige hexadezimale Ziffern in den Formularziffern 8-4-4-4-12
. Kürzester Code gewinnt.
EDIT: Muss hexadezimal sein. Es ist ungültig, immer nur eine Dezimalzahl zu generieren. EDIT 2: Keine eingebauten. Dies sind keine GUIDs, nur generische Hex-Ziffern.
Beispielausgabe:
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
Eingabe- und Standardlücken sind nicht zulässig.
Das ist Code-Golf , also gewinnt der kürzeste Code. Fragen Sie auch gerne nach.
12345678-1234-1234-1234-123456789012
eine gültige UUID sein (oder ist eine Hex-Ziffer erforderlich?). Halten Sie das für eine Lücke?xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
demy
eines stammt[89AB]
. Zum Zeitpunkt dieses Kommentars wird garantiert, dass keine der Antworten (mit Ausnahme von C # unter Verwendung einer eingebauten Bibliothek) eine gültige zufällige UUID erzeugt (und es ist sehr wahrscheinlich, dass tatsächlich keine erzeugt wird).Antworten:
Pyth, 20 Bytes
Demonstration.
Codiert
[1, 0, 0, 0, 2]
als 83 in Basis 3, addiert dann eins und multipliziert mit vier, um die Länge jedes Segments zu erhalten. Dann werden hexadezimale Ziffern und Bindestriche hinzugefügt.quelle
Julia, 80 Bytes
Generieren Sie eine zufällige 128-Bit-Ganzzahl, erhalten Sie ihre hexadezimale Darstellung als Zeichenfolge, die mit 32 Ziffern aufgefüllt ist, und unterteilen Sie diese in Segmente, die durch Bindestriche verbunden sind.
Vielen Dank an ConfusedMr_C und kvill für ihre Hilfe!
quelle
CJam,
2625 BytesProbieren Sie es online im CJam-Interpreter aus .
Wie es funktioniert
quelle
PowerShell,
776967 Bytebearbeiten: fremde Eltern:
edit: konnte das nachfolgende .Trim ("-") aus dem Original entfernen:
Je nach Art der Flags (-f und -Join) kann es mit Leerzeichen klarer sein. Ich möchte immer noch den letzten Trim ("-") verlieren:
Oder mit der eingebauten Funktionalität (ua die obige C # -Antwort)
Es scheint jedoch eine kleine Abkürzung zu sein, selbst wenn es bei 31 Bytes ankommt.
quelle
(8,4,4,4,12|%{-join(1..$_|%{'{0:X}'-f(random(16))})})-join'-'
Python 2,
8684 BytesDiese Verkettung von Zeichenfolgenformatierungen bewirkt, dass Python die Hexadezimalzahlen für jedes Segment eindeutig formatiert.
Ungolfed:
Dies könnte eine Verbesserung gebrauchen, aber ich bin stolz.
quelle
Perl 5 , 43 Bytes
2 Bytes gespart dank @Xcali !
Probieren Sie es online!
quelle
PHP, 69
7275BytesDies gibt keine hexadezimalen Ziffern (
a
, ...f
) aus. Sie sind erlaubt, aber vom Fragetext nicht verlangt.Keine Zifferngruppe beginnt mit
0
(auch nicht erforderlich).edit: 3 Bytes gespart dank @IsmaelMiguel
quelle
join()
stattdessen verwenden.C #, 65 Bytes
bearbeiten: Ja! C # ist kürzer als eine andere Sprache (außer Java) :)
quelle
CreateUUID[]
!Gawk, 86
Sie können dies einmal pro Sekunde verwenden, um eine eindeutige zufällige "UUID" zu generieren. Dies liegt daran, dass
srand()
die Systemzeit in Sekunden seit der Epoche als Argument verwendet wird, wenn kein Argument angegeben ist.Ich finde den awk-Teil ziemlich elegant.
Wenn Sie es öfter als einmal pro Sekunde verwenden möchten, können Sie es in bash wie folgt aufrufen. Beachten Sie, dass auch der awk-Teil geändert wird.
Das
echo
wird dort hinzugefügt, um jedes Mal eine neue Zeile zu drucken.quelle
K5, 35 Bytes
Um ein Hex-Alphabet zu generieren, generiere ich eine Zeichenkette (
`c$
) aus einer Liste von Ziffern (48+!10
) und den ersten 6 Großbuchstaben (65+!6
). Eine alternative Methode zur Erzeugung von Ziffern gleicher Länge ist,/$!10
.Mit der generierten Zeichenfolge "0123456789ABCDEF" ist der Rest einfach. Wählen Sie 32 zufällige Werte aus dieser Menge (
32?
) aus, schneiden Sie (_
) den resultierenden String bei der0 8 12 16 20
Berechnung über(0,8+4*!4)
und verbinden Sie die resultierenden String-Fragmente mit Bindestrichen ("-"/
).In Aktion:
quelle
R , 63 Bytes
Probieren Sie es online!
Der Code erstellt zuerst eine zufällige Zeichenfolge mit 36 Zeichen und platziert dann die vier Bindestriche. Es gibt eine UUID an stdout aus.
quelle
c
Anrufsprintf("%x",0:15)
durch -1.JavaScript, ES6, 106 Bytes
Verwendet Regex ersetzen. Behandelt die Formatzeichenfolge als Anzahl zum Generieren eines Hex-Zeichens. Heben wo ich kann; Wenn möglich, werden Semikolons weggelassen.
quelle
'8-4-4-4-12'.replace(/\d+/g,n=>Math.floor(16**n*Math.random()).toString(16).padStart(n,0))
Perl 6 , 53 Bytes
Das Offensichtliche:
Das Übersetzen des Perl 5-Beispiels mit
printf
ergibt einen etwas kürzeren Code.quelle
(0..16⁴)
?! Kann man das in Perl machen?1,2,4,8,16 ... *
dem , was eine faule unendliche Liste der Potenzen von 2 erzeugt ({2**$++} ... *
funktioniert auch)Kotlin , 175 Bytes
Probieren Sie es online!
Mein allererstes Kotlin Programm & PPCG Einreichung
quelle
APL (Dyalog Unicode) ,
11578 BytesProbieren Sie es online!
Dies ist meine erste APL-Einreichung. Ein großes Dankeschön an @ Adám für das Gespräch mit mir im APL-Chat des PPCG und für die hexadezimale Konvertierungsfunktion.
Vielen Dank an @ Zacharý für 1 Byte
Bearbeitet, um die Anzahl der Bytes zu korrigieren.
quelle
⎕IO←0
, dass dies keine Byte-Kosten verursacht. Außerdem können die meisten Bytes (IIRC, alle hier vorhandenen) in APL als eins gezählt werden.a(H 12?16)
uma H 12?16
ein Byte zu speichern.'-'@(+\9,3⍴5)⊢(⎕D,819⌶⎕A)[?36⍴16]
oder'-'@(+\9,3⍴5)∊⌂hex?18⍴256
Japt , 32 Bytes
Probieren Sie es online!
quelle
m@
-£
) vertraut zu machen und Ihnen den Einstieg zu erleichtern, finden Sie hier eine 24-Byte-Version Ihrer Lösung, die Sie in aller Eile herunterladen können:MATLAB / Octave, 95 Bytes
quelle
Perl , 51 Bytes
Benötigt perl5> = 5.10 denke ich. Für den Modifizierer / r und für say ().
quelle
s//xx-x-x-x-xxx/;s/x/sprintf"%04x",rand 65536/eg
mit-p
Flagge, würde auch bedeuten , funktioniert sich auf ältere Versionen ohne-E
.-p
), aber immer noch ziemlich gut und ich hätte diesen Ansatz nicht in Betracht gezogen, ohne Ihre Antwort zu sehen!J ,
42 39 3727 BytesProbieren Sie es online!
quelle
C ++,
194193221210201 Bytes+7 Bytes dank Zacharý (erkannt ein
-
, das nicht am Ende sein sollte)Wenn jemand die Möglichkeit hat, bei jeder Ausführung einen anderen Wert zu erhalten, ohne ihn zu ändern
srand
und ohne ihn einzuschließen<ctime>
, wäre das großartigquelle
#define L(a) for
... sein#define L(a)for...
? ("0123456789abcdef"[rand()%16]
und dann entfernenf
?Befunge-93 , 97 Bytes
Probieren Sie es online!
Ich bin sicher, das kann geschrumpft werden, aber das ist mein erster Versuch :)
quelle
Bash, 67 Bytes
quelle
JavaScript REPL, 79 Bytes
Probieren Sie es online!
Math.random
kann zurückkehren0
. Addiert man 5 Nullen, erhält das Schneiden 40
Sekundenquelle
Forth (Gforth) ,
9189 BytesProbieren Sie es online!
Erläuterung
Ändert die Basis in hexadezimal und gibt dann Zahlen / Segmente der entsprechenden Länge in festgelegten Intervallen mit Bindestrichen aus
Code-Erklärung
quelle
C (GCC) ,
949186 BytesProbieren Sie es online!
Ich hätte diese Version gerne in einem Kommentar zu Max Yekhlakov ( seiner Antwort ) vorgeschlagen, aber leider habe ich noch nicht die 50 benötigten Reputationspunkte. Deshalb hier meine Antwort.
803912
istC4448
in hexadezimal, beschreibt es , wie sollte die Ausgabe (formatiert werden12-4-4-4-8
), ist es umgekehrt ist , weil am wenigsten signifikanten Stellen zuerst gelesen werden.Bearbeitungen:
srand(time(0))
durchsrand(&i)
quelle
main(){...;int i=
kann seinmain(i){...;i=
.srand()
akzeptiertunsigned int
. In tio.rununsigned int
ist an 4 Byte lang, aber die UUID ist 16 Byte lang. Dies bedeutet, dass nur ein winziger Bruchteil der gültigen Ausgaben (1/2 ^ 12) generiert wird, daher ist meine Lösung (wie auch die vorherige mittime(0)
) nicht gültig. Was denkst du ?Assuming that your language's PRNG is perfect, all valid outputs must have the same probability of being generated.
. Die Seed-Entropie bestimmt nicht notwendigerweise die RNG-Entropie, obwohl dies wahrscheinlich der Fall ist (hat diesrand()
Implementierung nicht überprüft ). Allerdingssrand()
ist mein Wissen ziemlich einheitlich, so dass , wenn die RNG war perfekt, es noch einheitlich sein würde. Ich denke daher, dass Ihre Antwort gültig ist.srand()
bereits geschehen ist, und in diesem Fall wird es keinen Zweifel geben. Aber ich bin nicht sicher, ob dies erlaubt ist, andere C / C ++ - Einreichungen scheinen allesrand()
int die Antwort zu enthalten (es sei denn, es wird nicht verwendetrand()
)C (gcc)
1431101039694 BytesDank Ceilingcat und Jonathan Frech auf 94 Bytes reduziert.
Probieren Sie es online!
Erläuterung:
quelle
*z=L"\27\23\17\vz"
anstelle von*z=L"\10\4\4\4\14"
undfor(n=32;n--;z+=printf("-%x"+(n!=*z),P()&15)-1)
anstelle von vorfor(;*z;*++z&&putchar(45))for(n=*z;n--;printf("%x",P()&15))
Java mit zehn Fuß Laser Pole v. 1.06, 126 Bytes
Getestet mit Version 1.06 der Bibliothek, dies sollte jedoch mit jeder Version 1.04 oder neuer funktionieren.
quelle
Gelee , 17 Bytes
Probieren Sie es online!
quelle
SmileBASIC,
6562 BytesIch habe eine Funktion 4 zufällige hexadezimale Ziffern drucken:
DEF H?HEX$(RND(65536),4);:END
sowie 4 Stellen mit einem-
nach ihnenDEF G:H?"-";:END
. Dann muss es diese Funktionen nur ein paar Mal aufrufen.quelle
Chip , 109 + 6 = 115 Bytes
Benötigt Flags
-wc36
, die +6 Bytes verursachenProbieren Sie es online!
Erzeugt 4 zufällige Bits (die vier
?
) und wandelt sie in hexadezimale Ziffern um:0x0
-0x9
=>0
-9
0xa
-0xe
=>b
-f
0xf
=>a
... ein bisschen unkonventionell, aber es hat mir ein paar Bytes erspart, und zwar ohne Kosten für die Verteilung der Ergebnisse.
quelle