Potrzebuję UUID. Twoim zadaniem jest wygenerowanie jednego.
Kanoniczny UUID (Universally Unique IDentifier) to 32-cyfrowy numer szesnastkowy z myślnikami wstawionymi w niektórych punktach. Program powinien wypisywać 32 cyfry szesnastkowe (128 bitów) w postaci xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
( 8-4-4-4-12
cyfr), gdzie x
jest losową liczbą szesnastkową. Zakładając, że PRNG w Twoim języku jest doskonały, wszystkie prawidłowe dane wyjściowe muszą mieć takie samo prawdopodobieństwo wygenerowania.
TL; DR
Wygeneruj 32 losowe cyfry szesnastkowe w postaci 8-4-4-4-12
cyfr. Najkrótszy kod wygrywa.
EDYCJA: Musi być szesnastkowy. Zawsze generowanie tylko miejsc po przecinku jest nieprawidłowe. EDYCJA 2: Brak wbudowanych. To nie są identyfikatory GUID, tylko ogólne cyfry szesnastkowe.
Przykładowe dane wyjściowe:
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
Dane wejściowe i standardowe luki są niedozwolone.
To jest golf golfowy , więc wygrywa najkrótszy kod. Prosimy również o wyjaśnienia.
12345678-1234-1234-1234-123456789012
powinien być prawidłowym UUID (czy jest potrzebna jakaś cyfra szesnastkowa?). Czy uważasz to za lukę?xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
gdziey
jest jeden[89AB]
. W momencie tego komentarza nie ma gwarancji, że żadna z odpowiedzi (oprócz C # przy użyciu wbudowanej biblioteki) wygeneruje prawidłowy losowy identyfikator UUID (i faktycznie prawdopodobnie nie wygeneruje żadnego).Odpowiedzi:
Pyth, 20 bajtów
Demonstracja.
Koduje
[1, 0, 0, 0, 2]
jako 83 w bazie 3, a następnie dodaje jeden i mnoży przez cztery, aby uzyskać długość każdego segmentu. Następnie tworzy cyfry szesnastkowe i łączy na łącznikach.źródło
Julia, 80 bajtów
Wygeneruj losową 128-bitową liczbę całkowitą, uzyskaj jej szesnastkową reprezentację jako ciąg dopełniany do 32 cyfr i podziel ją na segmenty połączone myślnikami.
Dzięki ConfusedMr_C i kvill za pomoc!
źródło
CJam,
2625 bajtówWypróbuj online w interpretatorze CJam .
Jak to działa
źródło
PowerShell,
776967 bajtówedycja: obce pareny:
edit: udało się usunąć końcowe .Trim („-”) z oryginału:
Może być wyraźniejszy z pewnymi białymi znakami, biorąc pod uwagę naturę flag (-f i -Join). Nadal chciałbym zgubić ostateczne przycięcie („-”):
Lub przy użyciu wbudowanej funkcjonalności (ala odpowiedź C # powyżej)
Wydaje się to jednak trochę skrót-y, nawet jeśli ma 31 bajtów.
źródło
(8,4,4,4,12|%{-join(1..$_|%{'{0:X}'-f(random(16))})})-join'-'
Python 2,
8684 bajtówŁańcuch formatuje formaty ciągów, aby Python sformatował liczby szesnastkowe niepowtarzalnie dla każdego segmentu.
Nie golfowany:
Przydałoby się to trochę ulepszenia, ale jestem dumny.
źródło
Perl 5 , 43 bajtów
Zaoszczędź 2 bajty dzięki @Xcali !
Wypróbuj online!
źródło
PHP, 69
7275bajtówNie wyświetla to cyfr szesnastkowych (
a
, ...f
). Są dozwolone, ale nie są wymagane przez treść pytania.Żadna grupa cyfr nie zaczyna się od
0
(również nie jest wymagana).edycja: zapisane 3 bajty dzięki @IsmaelMiguel
źródło
join()
.C #, 65 bajtów
edycja: Tak! C # jest krótszy niż inny język (oprócz Java) :)
źródło
CreateUUID[]
!gawk, 86
Możesz użyć tego raz na sekundę, aby wygenerować unikalny losowy „UUID”. Jest tak, ponieważ
srand()
używa czasu systemowego w sekundach od epoki jako argumentu, jeśli nie podano argumentu.Myślę, że część awk jest raczej elegancka.
Jeśli chcesz go używać częściej niż raz na sekundę, możesz wywołać go w skrócie w ten sposób. Zauważ, że część awk również się zmieniła.
echo
Dodaje tam wydrukować nową linię za każdym razem.źródło
K5, 35 bajtów
Aby wygenerować alfabet szesnastkowy, generuję ciąg znaków (
`c$
) z listy cyfr (48+!10
) i pierwszych 6 wielkich liter (65+!6
). Alternatywnym sposobem generowania cyfr o tej samej długości jest,/$!10
.Po wygenerowaniu ciągu „0123456789ABCDEF” reszta jest prosta. Wybierz 32 losowe wartości z tego zestawu (
32?
), pokrój (_
) wynikowy ciąg przy0 8 12 16 20
obliczeniu za pomocą(0,8+4*!4)
, a następnie połącz powstałe fragmenty ciągu za pomocą myślników ("-"/
).W akcji:
źródło
R , 63 bajty
Wypróbuj online!
Kod najpierw tworzy losowy ciąg 36 znaków, a następnie umieszcza cztery łączniki. Wysyła UUID na standardowe wyjście.
źródło
c
połączeniesprintf("%x",0:15)
na -1.JavaScript, ES6, 106 bajtów
Używa zamiany Regex. Traktuje ciąg formatu jako liczbę do wygenerowania znaku szesnastkowego. Podnoszenie gdziekolwiek mogę; w miarę możliwości pomijając średniki.
źródło
'8-4-4-4-12'.replace(/\d+/g,n=>Math.floor(16**n*Math.random()).toString(16).padStart(n,0))
Perl 6 , 53 bajtów
Oczywisty:
Tłumaczenie przykładu Perla 5 przy użyciu
printf
powoduje, że kod jest nieco krótszy.źródło
(0..16⁴)
?! Możesz to zrobić w Perlu?1,2,4,8,16 ... *
co generuje leniwą nieskończoną listę mocy 2. ({2**$++} ... *
działa również)Kotlin , 175 bajtów
Wypróbuj online!
Mój pierwszy program Kotlin i zgłoszenie PPCG
źródło
APL (Dyalog Unicode) ,
11578 bajtówWypróbuj online!
To jest moje pierwsze zgłoszenie APL. Ogromne podziękowania dla @ Adám za spotkanie ze mną na czacie APL PPCG i za funkcję konwersji szesnastkowej.
Dzięki @ Zacharý za 1 bajt
Edytowane, aby naprawić liczbę bajtów.
źródło
⎕IO←0
bez bajtów, Adám to robi. Ponadto większość bajtów (IIRC, wszystkie te, które masz tutaj) można policzyć jako jeden w APL.a(H 12?16)
na,a H 12?16
aby zapisać jeden bajt.'-'@(+\9,3⍴5)⊢(⎕D,819⌶⎕A)[?36⍴16]
lub'-'@(+\9,3⍴5)∊⌂hex?18⍴256
Japt , 32 bajty
Wypróbuj online!
źródło
m@
-£
na przykład), a aby pomóc Ci zacząć, przygotuj 24-bajtową wersję swojego rozwiązania: ethproductions.github.io/japt/… Jeśli masz jakieś pytania, wejdź do pokoju rozmów Japt .MATLAB / oktawa, 95 bajtów
źródło
Perl , 51 bajtów
Wymaga perl5> = 5,10 Myślę, że. Dla modyfikatora / r i dla powiedzmy ().
źródło
s//xx-x-x-x-xxx/;s/x/sprintf"%04x",rand 65536/eg
użyciu-p
flagi, co oznaczałoby również, że działa on na starszych wersjach bez-E
.-p
), ale nadal całkiem niezłe i nie rozważyłbym tego podejścia bez zobaczenia twojej odpowiedzi!J ,
42 39 3727 bajtówWypróbuj online!
źródło
C ++,
194193221210201 bajtów+7 bajtów dzięki Zacharýowi (wykryto,
-
że nie powinno być na końcu)Jeśli ktoś ma sposób na uzyskanie innej wartości przy każdym wykonaniu bez zmiany
srand
i bez uwzględnienia<ctime>
, byłoby świetnieźródło
#define L(a) for
... być#define L(a)for...
? ("0123456789abcdef"[rand()%16]
, a następnie usunąćf
?Befunge-93 , 97 bajtów
Wypróbuj online!
Jestem pewien, że można to zmniejszyć, ale to moja pierwsza próba :)
źródło
Bash, 67 bajtów
źródło
JavaScript REPL, 79 bajtów
Wypróbuj online!
Math.random
może wrócić0
. Dodanie 5 zer powoduje, że krojenie dostaje 40
sźródło
Dalej (gforth) ,
9189 bajtówWypróbuj online!
Wyjaśnienie
Zmienia podstawę na szesnastkową, a następnie wyprowadza liczby / segmenty o odpowiedniej długości z myślnikami w określonych odstępach czasu
Objaśnienie kodu
źródło
C (gcc) ,
949186 bajtówWypróbuj online!
Chciałbym zasugerować tę wersję w komentarzu do Maxa Yekhlakova ( jego odpowiedź ), ale niestety nie mam jeszcze 50 potrzebnych punktów reputacji, więc oto moja odpowiedź.
803912
jestC4448
zapisany w systemie szesnastkowym, opisuje sposób sformatowania danych wyjściowych (12-4-4-4-8
), jest odwrócony, ponieważ najpierw zostaną odczytane najmniej znaczące cyfry.Edycje:
srand(time(0))
jesrand(&i)
źródło
main(){...;int i=
can bemain(i){...;i=
.srand()
accept anunsigned int
as its seed parameter. On tio.run, anunsigned int
is 4 bytes long but the UUID is 16 bytes long. This means only a tiny fraction of the valid outputs (1/2^12) will be generated, thus my solution (as well as the previous one withtime(0)
) is not valid. What do you think ?Assuming that your language's PRNG is perfect, all valid outputs must have the same probability of being generated.
. The seed entropy does not necessarily determine the RNG entropy, though it likely does (did not check thesrand()
implementation). However,srand()
is to my knowledge reasonably uniform, so if the RNG was perfect, it would still be uniform. I therefore think your answer is valid.srand()
has already been done, and in this case there will be no doubt. But I'm not sure if this is allowed, other C/C++ submissions all seem to includesrand()
int the answer (unless it does not userand()
)C (gcc),
1431101039694 bytesGolfed down to 94 bytes thanks to ceilingcat and Jonathan Frech.
Try it online!
Explanation:
źródło
*z=L"\27\23\17\vz"
instead of*z=L"\10\4\4\4\14"
andfor(n=32;n--;z+=printf("-%x"+(n!=*z),P()&15)-1)
instead offor(;*z;*++z&&putchar(45))for(n=*z;n--;printf("%x",P()&15))
Java with Ten Foot Laser Pole v. 1.06, 126 bytes
Tested with version 1.06 of the library, but this should work with any version 1.04 or newer.
źródło
Jelly, 17 bytes
Try it online!
źródło
SmileBASIC,
6562 bytesI created a function to print 4 random hex digits:
DEF H?HEX$(RND(65536),4);:END
as well as 4 digits with a-
after them:DEF G:H?"-";:END
. Then it just has to call these functions a bunch of times.źródło
Chip, 109 + 6 = 115 bytes
Requires flags
-wc36
, causing +6 bytesTry it online!
Generates 4 random bits (the four
?
's) and converts to hex digits:0x0
-0x9
=>0
-9
0xa
-0xe
=>b
-f
0xf
=>a
...a bit unconventional, but it saved me some bytes at no expense to the distribution of outcomes.
źródło