สร้าง UUID แบบสุ่ม


15

ฉันต้องการ UUID งานของคุณคือการสร้าง

canonical UUID (Universally Unique IDentifier) ​​เป็นเลขฐานสิบหก 32 หลักพร้อมเครื่องหมายขีดคั่นในบางจุดโปรแกรมควรแสดงผลตัวเลขฐานสิบหก 32 (128 บิต) ในรูปแบบของxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx( 8-4-4-4-12หลัก) ซึ่งxเป็นเลขฐานสิบหกแบบสุ่ม สมมติว่า PRNG ของภาษาคุณสมบูรณ์แบบผลลัพธ์ที่ถูกต้องทั้งหมดจะต้องมีความน่าจะเป็นเหมือนกัน

TL; DR

สร้างตัวเลขฐานสิบหกแบบสุ่ม 32 หลักในรูปแบบ8-4-4-4-12หลัก รหัสที่สั้นที่สุดชนะ

แก้ไข: ต้องเป็นเลขฐานสิบหก การสร้างทศนิยมเพียงอย่างเดียวไม่ถูกต้องเสมอไป แก้ไข 2: ไม่มีบิวด์อิน นี่ไม่ใช่ GUID เพียงแค่เลขฐานสิบหกทั่วไป


ตัวอย่างผลลัพธ์:

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

อินพุตและช่องโหว่มาตรฐานไม่ได้รับอนุญาต


นี่คือดังนั้นรหัสที่สั้นที่สุดจึงชนะ นอกจากนี้อย่าลังเลที่จะขอคำชี้แจง



9
"ตัวอย่างเหล่านี้ไม่ใช่การสุ่มลองแนบความสำคัญบางอย่าง" นั่นหมายความว่าอย่างไร?
Alex A.

3
ที่จริงแล้วเราไม่ต้องการเลขฐานสิบหกซึ่งฐาน 10 สามารถสุ่มได้ ตัวอย่างเช่น12345678-1234-1234-1234-123456789012ควรเป็น UUID ที่ถูกต้อง (หรือเป็นเลขฐานสิบหกที่จำเป็น?) คุณคิดว่านี่เป็นช่องโหว่หรือไม่?
Voitcus

3
ชื่อเรื่องและประโยคแรกแนะนำให้คุณต้องการ UUID ที่เป็นที่ยอมรับและตัวอย่างที่ให้ไว้จะเป็นไปตามข้อมูลจำเพาะของ UUID แต่คุณดูเหมือนจะขออะไรอย่างอื่น
Peter Taylor

3
ฉันรู้สึกว่าต้องชี้ให้เห็นว่า UUID รุ่น 4 (สุ่ม) มีรูปแบบที่ต้องการxxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx ซึ่งyเป็นหนึ่งใน[89AB]นั้น ในช่วงเวลาของความคิดเห็นนี้ไม่มีคำตอบใด (ยกเว้น C # ที่ใช้บิวด์อิน) ที่รับประกันว่าจะสร้าง UUID แบบสุ่มที่ถูกต้อง (และที่จริงแล้วมีแนวโน้มที่จะไม่สร้างหนึ่ง)

คำตอบ:


11

Pyth, 20 ไบต์

j\-msm.HO16*4hdj83 3

สาธิต.

เข้ารหัส[1, 0, 0, 0, 2]เป็น 83 ในฐาน 3 จากนั้นเพิ่มหนึ่งและคูณด้วยสี่เพื่อให้ได้ความยาวของแต่ละเซกเมนต์ จากนั้นสร้างเลขฐานสิบหกและเชื่อมต่อกับเครื่องหมายขีดกลาง


8

Julia, 80 ไบต์

h=hex(rand(Uint128),32)
print(h[1:8]"-"h[9:12]"-"h[13:16]"-"h[17:20]"-"h[21:32])

สร้างจำนวนเต็ม 128 บิตแบบสุ่มได้รับการเป็นตัวแทนเลขฐานสิบหกของมันเป็นสตริง padded ถึง 32 หลักและแบ่งออกเป็นส่วนที่เข้าร่วมกับขีดกลาง

ขอบคุณ ConfusedMr_C และ kvill สำหรับความช่วยเหลือของพวกเขา!


8

CJam, 26 25 ไบต์

8 4__C]{{Gmr"%x"e%}*'-}/;

ลองออนไลน์ใน ล่าม CJam

มันทำงานอย่างไร

8 4__C]{              }/   For each I in [8 4 4 4 12]:
        {         }*         Do I times:
         Gmr                   Pseudo-randomly select an integer between 0 and 15.
            "%x"e%             Apply hexadecimal string formatting.
                    '-       Push a hyphen-minus.
                        ;  Discard the last hyphen-minus.

5

PowerShell, 77 69 67 ไบต์

((8,4,4,4,12)|%{((1..$_)|%{'{0:X}'-f(random(16))})-Join""})-Join"-"

แก้ไข: parens ภายนอก:

((8,4,4,4,12)|%{((1..$_)|%{('{0:X}'-f(random(16)))})-Join""})-Join"-"

แก้ไข: สามารถลบ. Trim ("-") ต่อท้ายจากต้นฉบับได้:

(((8,4,4,4,12)|%{((1..$_)|%{('{0:X}'-f(random(16)))})+"-"})-Join"").Trim("-")

มันอาจจะชัดเจนขึ้นด้วยช่องว่างบางอย่างที่กำหนดลักษณะของธง (-f และ -Join) ฉันยังต้องการเสียค่า Trim สุดท้าย ("-"):

(((8,4,4,4,12)|%{((1..$_)|%{('{0:X}' -f (random(16)))}) + "-"}) -Join "").Trim("-")

หรือใช้ฟังก์ชั่นในตัว (เช่นคำตอบ C # ด้านบน)

'{0}'-f[System.Guid]::NewGuid()

อย่างไรก็ตามดูเหมือนว่าจะเป็นบิตลัด - y แม้ว่าจะอยู่ที่ 31 ไบต์


61 byte:(8,4,4,4,12|%{-join(1..$_|%{'{0:X}'-f(random(16))})})-join'-'
mazzy

5

Python 2, 86 84 ไบต์

from random import*;print'-'.join('%%0%ix'%i%randint(0,16**i-1)for i in[8,4,4,4,12])

ตัวจัดรูปแบบสตริง chains นี้เพื่อจัดรูปแบบ Python ตัวเลขฐานสิบหกที่ไม่ซ้ำกันสำหรับแต่ละเซ็กเมนต์

Ungolfed:

import random

final = []
for i in [8, 4, 4, 4, 12]:               # Iterate through every segment
    max = (16 ** i) - 1                  # This is the largest number that can be
                                         # represented in i hex digits
    number = random.randint(0, max)      # Choose our random segment
    format_string = '%0' + str(i) + 'x'  # Build a format string to pad it with zeroes
    final.append(format_string % number) # Add it to the list

print '-'.join(final)                    # Join every segment with a hyphen and print

นี่อาจใช้การปรับปรุงบางอย่าง แต่ฉันภูมิใจ



4

PHP, 69 72 75ไบต์

foreach([8,4,4,4,12]as$c)$r[]=rand(".1e$c","1e$c");echo join('-',$r);

สิ่งนี้ไม่ได้ส่งออกเลขฐานสิบหก ( a, ... f) อนุญาตให้ทำได้ แต่ไม่ต้องการโดยเนื้อความของคำถาม

ไม่มีกลุ่มเริ่มต้นด้วย0(ไม่จำเป็นต้องใช้)

แก้ไข: บันทึกแล้ว 3 ไบต์ด้วย @IsmaelMiguel


ดูเหมือนว่าจะมีความยาวมากกว่า 32 ไบต์
isaacg

@isaacg ใช่ขอโทษ - ความผิดพลาดของฉัน
Voitcus

คุณควรใช้join()แทน
Ismael Miguel

3

C #, 65 ไบต์

using System;class C{void Main(){Console.Write(Guid.NewGuid());}}

แก้ไข: ใช่! C # สั้นกว่าภาษาอื่น (นอกเหนือจาก Java) :)


1
ฉันคิดว่านี่เป็นช่องโหว่มาตรฐาน ... :( meta.codegolf.stackexchange.com/questions/1061/…
Dom Hastings

1
ฉันคิดว่านี่ไม่ถือว่าเป็นช่องโหว่มาตรฐาน: ในขณะที่คุณเห็นคำขอให้ละทิ้งสิ่งนี้เพิ่งจะมี 2 upvotes มากกว่า 1 ปี ในทางตรงกันข้ามความคิดเห็นที่บอกว่าคุณควรใช้ฟังก์ชั่นในตัวมี 58 upvotes หรืออย่างที่ผู้วิจารณ์คนหนึ่งพูด -> ถ้าเราทุกคนถูก จำกัด ให้มีฟังก์ชั่นในตัวชุดเดียวกันการแข่งขันทุกรายการจะชนะโดย APL หรือ Golfscript เพราะชื่อคำสั่งของพวกเขาสั้นที่สุด (Michael Stern)
Stephan Schinkel

1
หรือเพียงแค่ใช้วิธีอื่น: เราสามารถใช้ printf ได้หรือไม่? หรือเราควรใช้ inline asm เพื่อทริกเกอร์การอินเตอร์ 21
Stephan Schinkel

เป็นจุดที่ดี! ฉันไม่ได้ตั้งใจจะเสียใจฉันตั้งใจจะให้ความช่วยเหลือ! ฉันเดาแล้ว Mathematica สามารถชนะด้วยCreateUUID[]!
Dom Hastings

1
@StephanSchinkel "มีเพียง 2 upvotes ต่อปี" เท่านั้นที่ทำให้เข้าใจผิด มันมี 47 อัพvotesและดาวน์ 45 อันในขณะนี้ดังนั้นสุทธิ +2 ที่ถูกกล่าวว่าเกณฑ์ที่ยอมรับโดยทั่วไปนั้นสูงกว่านั้นดังนั้นคุณพูดถูกว่า "ไม่" นับเป็นช่องโหว่มาตรฐานในขณะนี้
Geobits

3

เหยี่ยว, 86

BEGIN{for(srand();j++<32;printf(j~"^9|13|17|21"?"-":E)"%c",x+(x>10?87:48))x=rand()*16}

คุณสามารถใช้สิ่งนี้ทุกๆวินาทีเพื่อสร้าง "UUID" แบบสุ่มที่ไม่ซ้ำกัน นี่เป็นเพราะsrand()ใช้เวลาระบบเป็นวินาทีตั้งแต่ยุคเป็นอาร์กิวเมนต์หากไม่มีการกำหนดอาร์กิวเมนต์

for n in `seq 100` do awk 'BEGIN{for(srand();j++<32;printf(j~"^9|13|17|21"?"-":E)"%c",x+(x>10?87:48))x=rand()*16}'; sleep 1; done

ฉันคิดว่าส่วน awk นั้นค่อนข้างหรูหรา

BEGIN{
    srand()
    for(;j++<32;) {
        x=rand()*16
        x+=(x>10?87:48)
        printf "%c", x
        if(j~"^8|12|16|20")printf "-"
    }
}

หากคุณต้องการใช้งานบ่อยกว่าหนึ่งครั้งทุกวินาทีคุณสามารถโทรหามันได้ในแบบทุบตีแบบนี้ โปรดทราบว่าส่วน awk ก็เปลี่ยนไปเช่นกัน

echo `awk 'BEGIN{for(srand('$RANDOM');j++<32;printf(j~"^9|13|17|21"?"-":E)"%c",x+(x>10?87:48))x=rand()*16}'`

echoถูกเพิ่มมีการพิมพ์บรรทัดใหม่ทุกครั้ง


3

K5, 35 ไบต์

"-"/(0,8+4*!4)_32?`c$(48+!10),65+!6

เพื่อสร้างตัวอักษรฐานสิบหกฉันสร้างสตริงอักขระ ( `c$) จากรายการของตัวเลข ( 48+!10) และตัวอักษรตัวใหญ่ 6 ตัวแรก ( 65+!6) อีกวิธีหนึ่งในการสร้างตัวเลขซึ่งมีความยาวเท่า,/$!10กัน

ด้วยสตริงที่สร้าง "0123456789ABCDEF" ส่วนที่เหลือนั้นง่าย เลือก 32 ค่าสุ่มจากชุดนี้ ( 32?), slice ( _) สตริงผลลัพธ์ที่0 8 12 16 20คำนวณจากผ่าน(0,8+4*!4)แล้วเข้าร่วมแฟรกเมนต์สตริงผลลัพธ์ด้วยเครื่องหมายขีดกลาง ()"-"/ )

ในการดำเนินการ:

  "-"/(0,8+4*!4)_32?`c$(48+!10),65+!6
"9550E114-A8DA-9533-1B67-5E1857F355E1"

3

R , 63 ไบต์

x=sample(c(0:9,letters[1:6]),36,1);x[0:3*5+9]='-';cat(x,sep='')

ลองออนไลน์!

รหัสแรกสร้างสตริงแบบสุ่ม 36 อักขระจากนั้นใส่เครื่องหมายยัติภังค์สี่ตัว ส่งเอาต์พุต UUID ถึง stdout


แทนที่การcโทรด้วยsprintf("%x",0:15)สำหรับ -1
J.Doe

3

JavaScript, ES6, 106 ไบต์

"8-4-4-4-12".replace(/\d+/g, m => {t=0;for(i=0; i<m; i++) {t+=(Math.random()*16|0).toString(16)}return t})

ใช้ Regex แทน ใช้สตริงการจัดรูปแบบเป็นจำนวนเพื่อสร้าง hex char ชักรอกได้ทุกที่ ไม่ใช้เครื่องหมายอัฒภาคหากเป็นไปได้


89 bytes,'8-4-4-4-12'.replace(/\d+/g,n=>Math.floor(16**n*Math.random()).toString(16).padStart(n,0))
kamoroso94

2

Perl 6 , 53 ไบต์

หนึ่งที่เห็นได้ชัด:

say join '-',(0..9,'a'..'f').flat.roll(32).rotor(8,4,4,4,12)».join # 67

การแปลตัวอย่าง Perl 5 โดยใช้จะprintfให้ผลลัพธ์ในโค้ดที่สั้นกว่านี้เล็กน้อย

printf ($_='%04x')~"$_-"x 4~$_ x 3,(0..^4⁸).roll(8) # 53

(0..16⁴)?! คุณสามารถทำได้ใน Perl?
ตบมือ

1
@VoteToSpam คุณสามารถเป็นของ9 วันที่ผ่านมา (Perl 6 จะวางจำหน่ายในปลายเดือนนี้)
Brad Gilbert b2gills

Cooooool บางทีฉันควรจะเรียนรู้มัน
ตบมือ

@VoteToSpam นั่นคือไม่มีอะไรเทียบกับ1,2,4,8,16 ... *ที่สร้างรายการพลังที่ไม่มีที่สิ้นสุดขี้เกียจของ 2 ( {2**$++} ... *ยังใช้งานได้)
แบรดกิลเบิร์ต b2gills


2

APL (Dyalog Unicode) , 115 78 ไบต์

a←⊣,'-',⊢
H←⊃∘(⎕D,819⌶⎕A16∘⊥⍣¯1
(H 8?16)a(H 4?16)a(H 4?16)a(H 4?16)a H 12?16

ลองออนไลน์!

นี่คือการส่ง APL ครั้งแรกของฉัน ต้องขอบคุณ @ Adámที่อดทนกับฉันในการแชท APL ของ PPCG และสำหรับฟังก์ชั่นการแปลงเลขฐานสิบหก

ขอบคุณ @ Zacharýสำหรับ 1 ไบต์

แก้ไขเพื่อแก้ไขจำนวนไบต์


คุณสามารถสันนิษฐานได้ว่า⎕IO←0ไม่มีค่าใช้จ่ายทางไบต์Adámทำเช่นนั้นมาก นอกจากนี้ไบต์ส่วนใหญ่ (IIRC ทั้งหมดที่คุณมีที่นี่) สามารถนับเป็นหนึ่งใน APL
Zacharý

@ Zacharýฉันใช้ TIO เพื่อนับจำนวนไบต์สำหรับการส่งฉันควรใช้จำนวนอักขระแทนหรือไม่ ฉันยังใหม่กับ PPCG และใช้ APL ดังนั้นฉันไม่มีความรู้ที่แท้จริงเกี่ยวกับวิธีนับไบต์สำหรับมัน
J. Sallé

นอกจากนี้คุณยังสามารถเปลี่ยนa(H 12?16)ไปa H 12?16เพื่อประหยัดหนึ่งไบต์
Zacharý


2

Japt , 32 ไบต์

[8,4,4,4,12]m@MqG**X sG ù0X} q"-

ลองออนไลน์!


ยินดีต้อนรับสู่ PPCG และยินดีต้อนรับสู่ Japt :) ฉันจะใช้เวลาในการแก้ปัญหาของคุณจนถึงตอนที่ฉันสามารถหาเวลา (เพิ่งกลับมาจากวันหยุดมากที่จะตามทัน) แต่เคล็ดลับแรกที่ฉันจะเสนอคือทำความคุ้นเคย ตัวคุณเองด้วยทางลัด Unicode ( m@- £ตัวอย่าง) และเพื่อช่วยให้คุณเริ่มต้นที่นี่คือทางออกที่รวดเร็วของคุณในเวอร์ชัน 24 ไบต์: ethproductions.github.io/japt/…ดร็อปเข้าห้องสนทนา Japtถ้าคุณมีคำถาม
ปุย


1

Perl , 51 ไบต์

say"xx-x-x-x-xxx"=~s/x/sprintf"%04x",rand 65536/reg

ต้องใช้ perl5> = 5.10 ฉันคิดว่า สำหรับตัวปรับ / r และสำหรับ say ()


1
ดี! ดีกว่าของฉันมาก! ต้องดูที่วิธีการแก้ปัญหาของคุณคุณก็อาจจะสามารถที่จะบันทึกตามเพิ่มเติมเกี่ยวกับการโพสต์เมตานี้มีs//xx-x-x-x-xxx/;s/x/sprintf"%04x",rand 65536/egการใช้ธงก็จะหมายความว่าการทำงานในรุ่นเก่าได้โดยไม่ต้อง-p -E
Dom Hastings

ขอบคุณ คำแนะนำของคุณคือ: echo | perl -pe // // xx-xxx-xxx /; s / x / sprintf "% 04x", rand 65536 / เช่น 'และนั่นเป็นเพียง 48 ตัวอักษรระหว่าง' ' (การโกงแบบนี้ใช่มั้ย)
Kjetil S.

จากการโพสต์เมตาโพสต์นี้เป็นที่ยอมรับฉันยังไม่มีโอกาสใช้กลไกนั้น แต่หวังว่าฉันจะเร็วพอ! จะเป็น 49 ไบต์ (+ -p) แต่ก็ยังค่อนข้างดีและฉันจะไม่พิจารณาวิธีการนั้นโดยไม่เห็นคำตอบของคุณ!
Dom Hastings


1

C ++, 194 193 221 210 201 ไบต์

+7 ไบต์ขอบคุณZacharý (ตรวจพบ -ว่าไม่ควรอยู่ท้าย)

#include<iostream>
#include<random>
#include<ctime>
#define L(a)for(int i=0;i<a;++i)std::cout<<"0123456789abcdef"[rand()%16];
#define P(a)printf("-");L(a)
void t(){srand(time(0));L(8)P(4)P(4)P(4)P(12)}

หากใครบางคนมีวิธีที่จะได้รับคุณค่าที่แตกต่างกันทุกการดำเนินการโดยไม่มีการเปลี่ยนแปลงsrandและไม่รวมถึงการ<ctime>ที่จะดี


ไม่สามารถ#define L(a) for... จะเป็น#define L(a)for...? (อาจได้ถามไปแล้ว)
Zacharý

นี่ไม่ถูกต้องมี "-" ในตอนท้าย (ซึ่งไม่ควรมี)
Zacharý

@ Zacharýแก้ไขแล้วตอนนี้
HatsuPointerKun


1
คุณสามารถทำสิ่งที่ชอบ"0123456789abcdef"[rand()%16]แล้วลบf?
Zacharý



1

REPL JavaScript, 79 ไบต์

'66-6-6-6-666'.replace(/6/g,_=>(Math.random().toString(16)+'00000').slice(2,6))

ลองออนไลน์!

Math.random0อาจจะกลับมา การเพิ่ม 5 ศูนย์ทำให้การตัดได้ 4 0วินาที


1

ออกมา (gforth) , 91 89 ไบต์

include random.fs
hex
: f 0 4 4 4 8 20 0 do dup i = if + ." -" then 10 random 1 .r loop ;

ลองออนไลน์!

คำอธิบาย

เปลี่ยนฐานเป็นเลขฐานสิบหกจากนั้นส่งออกตัวเลข / ส่วนของความยาวที่เหมาะสมด้วยขีดกลางตามช่วงเวลาที่ระบุ

รหัสคำอธิบาย

include random.fs          \ include the random module
hex                        \ set the base to hexadecimal
: f                        \ start a new word definition
  0 4 4 4 8                \ enter the intervals to place dashes
  20 0 do                  \ start a counted loop from 0 to 0x20 (32 in decimal)
    dup i =                \ check if we are on a character that needs a dash
    if                     \ if we are
      +                    \ calculate the next character that gets a dash
      ." -"                \ output a dash
    then                   \ end the if block
    f random               \ get a random number between 0x0 and 0xf
    1 .r                   \ output it right-aligned in 1-character space
  loop                     \ end the loop
;                          \ end the word definition

1

C (gcc) ,  94   91  86 ไบต์

main(i){srand(&i);i=803912;for(;i--%16||(i/=16)&&printf("-");printf("%x",rand()%16));}

ลองออนไลน์!

ฉันอยากจะแนะนำรุ่นนี้ในความคิดเห็นของ Max Yekhlakov ( คำตอบของเขา ) แต่น่าเสียดายที่ฉันยังไม่มีคะแนนชื่อเสียงที่จำเป็น 50 คะแนนดังนั้นนี่คือคำตอบของฉัน

803912อยู่C4448ในเลขฐานสิบหกมันอธิบายวิธีการจัดรูปแบบผลลัพธ์ ( 12-4-4-4-8) มันกลับด้านเพราะตัวเลขที่สำคัญน้อยที่สุดจะถูกอ่านก่อน
 

การแก้ไข:

  • บันทึกแล้ว 3 ไบต์ขอบคุณ Jonathan Frech
  • บันทึก 5 ไบต์เพิ่มเติมโดยแทนที่srand(time(0))ด้วยsrand(&i)

1
main(){...;int i=main(i){...;i=สามารถ
Jonathan Frech

ฉันคิดว่าบางสิ่งบางอย่างดูเหมือนsrand()จะยอมรับunsigned intว่าเป็นพารามิเตอร์ของเมล็ด บน tio.run ความunsigned intยาว 4 ไบต์ แต่ UUID ยาว 16 ไบต์ ซึ่งหมายความว่าจะมีการสร้างเอาต์พุตที่ถูกต้องเพียงเล็กน้อย (1/2 ^ 12) ดังนั้นโซลูชันของฉัน (เช่นเดียวกับก่อนหน้านี้ด้วยtime(0)) จึงไม่ถูกต้อง คุณคิดอย่างไร ?
Annyo

Assuming that your language's PRNG is perfect, all valid outputs must have the same probability of being generated.สหกรณ์รัฐ เอนโทรปีของเมล็ดไม่จำเป็นต้องกำหนดเอนโทรปีของ RNG แม้ว่าจะเป็นไปได้ (ไม่ได้ตรวจสอบsrand()การนำไปใช้) อย่างไรก็ตามsrand()ความรู้ของฉันมีความสม่ำเสมอเหมือนกันดังนั้นหาก RNG นั้นสมบูรณ์แบบมันจะยังคงเหมือนเดิม ฉันคิดว่าคำตอบของคุณถูกต้อง
Jonathan Frech

โอเคฉันเข้าใจ. ฉันสามารถส่งคำตอบของฉันในฐานะฟังก์ชันสมมติว่าsrand()ได้ทำไปแล้วและในกรณีนี้จะไม่มีข้อสงสัย แต่ผมไม่แน่ใจว่านี้จะได้รับอนุญาตอื่น ๆ C / C ++ ส่งทั้งหมดดูเหมือนจะรวมsrand()int คำตอบ (ยกเว้นว่าจะไม่ได้ใช้rand())
Annyo


1

C (gcc), 143 110 103 96 94 ไบต์

เลื่อนลงมาถึง 94 ไบต์ด้วยแคตทาว์นและ Jonathan Frech

(*P)()="\xf\x31À";*z=L"\10\4\4\4\14";main(n){for(;*z;*++z&amp;&amp;putchar(45))for(n=*z;n--;printf("%x",P()&amp;15));}

ลองออนไลน์!

คำอธิบาย:

/*
  P is a pointer to a function.
  The string literal contains actual machine code of the function:

  0F 31     rdtsc
  C3        ret

  0xc3 is the first byte of the UTF-8 representation of the character À
*/
(*P)() = "\xf\61À";

// encode uuid chunk lengths as literal characters
// we use wide characters with 'L' prefix because
// sizeof(wchar_t)==sizeof(int) for 64-bit gcc C on TIO
// so z is actually a zero-terminated string of ints
*z = L"\8\4\4\4\14"

main (n)
{
    for (
        ; 

        // loop until we reach the trailing zero
        *z;

        // increase the pointer and dereference it
        *++z 
             // and output a hyphen, if the pointer does not point at zero
             && putchar(45) 
    )
        // output a random hex string with length pointed at by z
        for (n = *z; n--; printf ("%x", P()&15));
}

1
สวัสดีและยินดีต้อนรับสู่ PPCG! 110 ไบต์
Jonathan Frech

@JonathanFrech ขอบคุณ! เวอร์ชันของคุณน่าประทับใจมาก!
Max Yekhlakov

แนะนำ*z=L"\27\23\17\vz"แทน*z=L"\10\4\4\4\14"และfor(n=32;n--;z+=printf("-%x"+(n!=*z),P()&15)-1)แทนที่for(;*z;*++z&&putchar(45))for(n=*z;n--;printf("%x",P()&15))
ceilingcat

1

Java กับเสาเลเซอร์สิบฟุต v. 1.06, 126 ไบต์

String u(){return sj224.tflp.util.StringUtil.replace("aa-a-a-a-aaa","a",s->String.format("%04x",(int)(Math.random()*65536)));}

ทดสอบกับไลบรารีเวอร์ชัน 1.06 แล้ว แต่ควรใช้ได้กับเวอร์ชัน 1.04 หรือใหม่กว่า



0

SmileBASIC ขนาด 65 62 ไบต์

DEF G H?"-";:END
DEF H?HEX$(RND(65536),4);
END H G G G G H H H

ฉันสร้างฟังก์ชั่นการพิมพ์ตัวเลข 4 หลักเลขฐานสิบหกสุ่ม: DEF H?HEX$(RND(65536),4);:ENDเช่นเดียวกับตัวเลข 4 หลักด้วยหลังจากที่พวกเขา:- DEF G:H?"-";:ENDจากนั้นจะต้องเรียกฟังก์ชันเหล่านี้หลายครั้ง


0

ชิป 109 + 6 = 115 ไบต์

ต้องใช้แฟล็ก-wc36ซึ่งก่อให้เกิด +6 ไบต์

!ZZZZZZZZZZZZZZZZZZZZZZ
,-----.,+vv--^----^---z
?]]]--R\acd
?xx+-)\\b
?x+x-)\\c
?^xx\--\d
`-xx]v~\e
f*`)'`-\g

ลองออนไลน์!

สร้าง 4 บิตสุ่ม (สี่?) และแปลงเป็นเลขฐานสิบหก:

  • 0x0- 0x9=> 0-9
  • 0xa- 0xe=> b-f
  • 0xf => a

... ไม่เป็นทางการ แต่มันช่วยฉันสักสองสามไบต์โดยไม่เสียค่าใช้จ่ายในการแจกจ่ายผลลัพธ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.