Saya membutuhkan UUID. Tugas Anda adalah menghasilkan satu.
UUID kanonik (Universally Unique IDentifier) adalah angka heksadesimal 32 digit dengan tanda hubung dimasukkan dalam titik-titik tertentu. Program harus menghasilkan 32 digit hex (128 bit), dalam bentuk xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
( 8-4-4-4-12
digit), di mana x
adalah angka heksadesimal acak. Dengan asumsi PRNG bahasa Anda sempurna, semua output yang valid harus memiliki probabilitas yang sama untuk dihasilkan.
TL; DR
Hasilkan 32 digit heksadesimal acak dalam bentuk 8-4-4-4-12
digit. Kode terpendek menang.
EDIT: Harus heksadesimal. Selalu menghasilkan desimal saja tidak valid. EDIT 2: Tidak ada built-in. Ini bukan GUID, hanya digit hex umum.
Contoh output:
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
Input, dan celah standar tidak diizinkan.
Ini kode-golf , jadi kode terpendek menang. Juga, jangan ragu untuk meminta klarifikasi.
12345678-1234-1234-1234-123456789012
harus UUID yang valid (atau apakah ada hex digit yang diperlukan?). Apakah Anda menganggap ini celah?xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
manay
salah satunya[89AB]
. Pada saat komentar ini, tidak ada jawaban (kecuali C # menggunakan built in library) dijamin untuk menghasilkan UUID acak yang valid (dan sebenarnya, sangat mungkin untuk tidak menghasilkan satu).Jawaban:
Pyth, 20 byte
Demonstrasi.
Dikodekan
[1, 0, 0, 0, 2]
sebagai 83 di basis 3, lalu tambahkan satu dan kalikan dengan empat untuk mendapatkan panjang setiap segmen. Kemudian buat angka hex dan gabungkan dengan tanda hubung.sumber
Julia, 80 byte
Hasilkan integer 128-bit acak, dapatkan representasi heksideksimalnya sebagai string yang diisi hingga 32 digit, dan bagi yang menjadi segmen yang digabungkan dengan tanda hubung.
Terima kasih kepada ConfusedMr_C dan kvill atas bantuan mereka!
sumber
CJam,
2625 byteCobalah online di penerjemah CJam .
Bagaimana itu bekerja
sumber
PowerShell,
776967 bytesunting: parens asing:
sunting: mampu menghapus trailing .Trim ("-") dari aslinya:
Mungkin lebih jelas dengan spasi putih mengingat sifat dari flag (-f dan -Join). Saya masih ingin kehilangan Trim akhir ("-"):
Atau, menggunakan fungsi bawaan (ala C # jawaban di atas)
Namun, sepertinya sedikit pintas-y bahkan jika itu datang pada 31 byte.
sumber
(8,4,4,4,12|%{-join(1..$_|%{'{0:X}'-f(random(16))})})-join'-'
Python 2,
8684 byteIni memformat string pemformat untuk membuat format Python angka hex unik untuk setiap segmen.
Tidak Disatukan:
Ini bisa menggunakan beberapa perbaikan, tapi saya bangga.
sumber
Perl 5 , 43 byte
Disimpan 2 byte berkat @Xcali !
Cobalah online!
sumber
PHP, 69
7275byteIni tidak menampilkan digit hex (
a
, ...f
). Mereka diizinkan, tetapi tidak diharuskan oleh badan pertanyaan.Grup digit tidak dimulai dengan
0
(juga tidak diperlukan).sunting: disimpan 3 byte berkat @IsmaelMiguel
sumber
join()
sebagai gantinya.C #, 65 Bytes
edit: Ya! C # lebih pendek dari Bahasa lain (selain Jawa) :)
sumber
CreateUUID[]
!melongo, 86
Anda dapat menggunakan ini setiap detik untuk menghasilkan "UUID" acak yang unik. Ini karena
srand()
menggunakan waktu sistem dalam detik sejak zaman sebagai argumen jika tidak ada argumen yang diberikan.Saya pikir bagian awk agak elegan.
Jika Anda ingin menggunakannya lebih sering dari sekali setiap detik, Anda dapat menyebutnya di bash seperti ini. Perhatikan bahwa bagian awk juga berubah.
Itu
echo
ditambahkan di sana untuk mencetak baris baru setiap kali.sumber
K5, 35 byte
Untuk menghasilkan hex alphabet saya menghasilkan string karakter (
`c$
) dari daftar digit (48+!10
) dan 6 huruf kapital pertama (65+!6
). Cara alternatif untuk menghasilkan digit dengan panjang yang sama adalah,/$!10
.Dengan string "0123456789ABCDEF" dihasilkan, sisanya sederhana. Pilih 32 nilai acak dari set ini (
32?
), iris (_
) string yang dihasilkan pada0 8 12 16 20
dihitung melalui(0,8+4*!4)
, dan kemudian bergabung dengan fragmen string yang dihasilkan dengan tanda hubung ("-"/
).Beraksi:
sumber
R , 63 byte
Cobalah online!
Pertama kode membangun string acak 36 karakter, dan kemudian menempatkan empat tanda hubung. Ini menghasilkan UUID ke stdout.
sumber
c
panggilan dengansprintf("%x",0:15)
untuk -1.JavaScript, ES6, 106 byte
Menggunakan Regex ganti. Memperlakukan string format sebagai hitungan untuk menghasilkan hex char. Mengangkat ke mana pun saya bisa; menghilangkan titik koma jika memungkinkan.
sumber
'8-4-4-4-12'.replace(/\d+/g,n=>Math.floor(16**n*Math.random()).toString(16).padStart(n,0))
Perl 6 , 53 byte
Yang jelas:
Menerjemahkan contoh Perl 5 menggunakan
printf
, menghasilkan kode yang sedikit lebih pendek.sumber
(0..16⁴)
?! Anda dapat melakukannya di Perl?1,2,4,8,16 ... *
yang menghasilkan daftar malas dari kekuatan 2. ({2**$++} ... *
juga berfungsi)Kotlin , 175 byte
Cobalah online!
Program Kotlin & pengajuan PPCG pertama saya
sumber
APL (Dyalog Unicode) ,
11578 byteCobalah online!
Ini adalah pengajuan APL pertama saya. Terima kasih banyak kepada @ Adám karena mendukung saya di obrolan APL PPCG dan untuk fungsi konversi heksadesimal.
Terima kasih kepada @ Zacharý untuk 1 byte
Diedit untuk memperbaiki jumlah byte.
sumber
⎕IO←0
tanpa biaya byte, AdAm melakukan itu banyak. Juga, sebagian besar byte (IIRC, semua yang Anda miliki di sini) dapat dihitung sebagai satu di APL.a(H 12?16)
kea H 12?16
untuk menyimpan satu byte.'-'@(+\9,3⍴5)⊢(⎕D,819⌶⎕A)[?36⍴16]
atau'-'@(+\9,3⍴5)∊⌂hex?18⍴256
Japt , 32 byte
Cobalah online!
sumber
m@
-£
, misalnya) dan, untuk membantu Anda memulai, inilah versi 24 byte yang tergesa-gesa dari solusi Anda: ethproductions.github.io/japt/… Masuklah ke ruang obrolan Japt jika Anda memiliki pertanyaan.MATLAB / Oktaf, 95 byte
sumber
Perl , 51 byte
Membutuhkan perl5> = 5.10 Saya pikir. Untuk modifier / r dan untuk say ().
sumber
s//xx-x-x-x-xxx/;s/x/sprintf"%04x",rand 65536/eg
menggunakan-p
flag, juga berarti itu berfungsi pada versi yang lebih lama tanpa-E
.-p
) tapi masih cukup bagus dan saya tidak akan mempertimbangkan pendekatan itu tanpa melihat jawaban Anda!J ,
42 39 3727 byteCobalah online!
sumber
C ++,
194193221210201 byte+7 byte berkat Zacharý (terdeteksi
-
yang seharusnya tidak di akhir)Jika seseorang memiliki cara untuk mendapatkan nilai yang berbeda setiap eksekusi tanpa mengubah
srand
dan tanpa memasukkan<ctime>
, itu akan bagussumber
#define L(a) for
... menjadi#define L(a)for...
? (Mungkin sudah bertanya itu)"0123456789abcdef"[rand()%16]
, dan kemudian menghapusf
?Befunge-93 , 97 byte
Cobalah online!
Saya yakin ini dapat menyusut, tetapi ini adalah percobaan pertama saya :)
sumber
Bash, 67 byte
sumber
JavaScript REPL, 79 byte
Cobalah online!
Math.random
dapat kembali0
. Menambahkan 5 nol membuat irisan mendapatkan 40
detiksumber
Keempat (gforth) ,
9189 byteCobalah online!
Penjelasan
Mengubah basis menjadi heksadesimal, kemudian menampilkan angka / segmen dengan panjang yang sesuai dengan tanda hubung pada interval yang ditentukan
Penjelasan Kode
sumber
C (gcc) ,
949186 byteCobalah online!
Saya ingin menyarankan versi ini dalam komentar kepada Max Yekhlakov ( jawabannya ), tetapi sayangnya saya belum memiliki 50 poin reputasi yang dibutuhkan, jadi inilah jawaban saya.
803912
adalahC4448
dalam heksadesimal, hal itu menggambarkan bagaimana output harus diformat (12-4-4-4-8
), itu terbalik karena paling signifikan digit akan dibaca pertama.Suntingan:
srand(time(0))
dengansrand(&i)
sumber
main(){...;int i=
bisamain(i){...;i=
.srand()
menerimaunsigned int
parameter seed-nya. Pada tio.run, panjangnyaunsigned int
adalah 4 byte tetapi UUID panjangnya 16 byte. Ini berarti hanya sebagian kecil dari output yang valid (1/2 ^ 12) akan dihasilkan, sehingga solusi saya (serta yang sebelumnya dengantime(0)
) tidak valid. Bagaimana menurut anda ?Assuming that your language's PRNG is perfect, all valid outputs must have the same probability of being generated.
. Entropi benih tidak selalu menentukan entropi RNG, meskipun kemungkinan besar tidak (tidak memeriksasrand()
implementasinya). Namun,srand()
sepengetahuan saya cukup seragam, jadi jika RNG itu sempurna, itu akan tetap seragam. Karena itu saya pikir jawaban Anda valid.srand()
sudah dilakukan, dan dalam hal ini tidak akan ada keraguan. Tapi saya tidak yakin apakah ini diperbolehkan, pengiriman C / C ++ lainnya semua tampaknya termasuksrand()
int jawabannya (kecuali jika tidak digunakanrand()
)C (gcc),
1431101039694 byteGolf turun ke 94 byte berkat ceilingcat dan Jonathan Frech.
Cobalah online!
Penjelasan:
sumber
*z=L"\27\23\17\vz"
alih-alih*z=L"\10\4\4\4\14"
danfor(n=32;n--;z+=printf("-%x"+(n!=*z),P()&15)-1)
bukannyafor(;*z;*++z&&putchar(45))for(n=*z;n--;printf("%x",P()&15))
Java dengan Ten Foot Laser Pole v. 1.06, 126 byte
Diuji dengan versi 1.06 perpustakaan, tetapi ini harus bekerja dengan versi 1.04 atau lebih baru.
sumber
Jelly , 17 byte
Cobalah online!
sumber
SmileBASIC,
6562 byteSaya membuat fungsi untuk mencetak 4 digit acak hex:
DEF H?HEX$(RND(65536),4);:END
serta 4 digit dengan-
setelah mereka:DEF G:H?"-";:END
. Maka hanya perlu memanggil fungsi-fungsi ini beberapa kali.sumber
Chip , 109 + 6 = 115 byte
Membutuhkan bendera
-wc36
, menyebabkan +6 byteCobalah online!
Menghasilkan 4 bit acak (empat
?
's) dan mengkonversi ke digit hex:0x0
-0x9
=>0
-9
0xa
-0xe
=>b
-f
0xf
=>a
... sedikit tidak konvensional, tetapi itu menyelamatkan saya beberapa byte tanpa biaya untuk distribusi hasil.
sumber