Мне нужен UUID. Ваша задача - создать его.
Канонический UUID (универсальный уникальный идентификатор) представляет собой шестнадцатеричное число из 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
Вход и стандартные лазейки запрещены.
Это код-гольф , поэтому выигрывает самый короткий код. Кроме того, не стесняйтесь просить разъяснений.
12345678-1234-1234-1234-123456789012
должен быть действительный UUID (или необходима какая-либо шестнадцатеричная цифра?). Вы считаете это лазейкой?xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
гдеy
один из[89AB]
. На момент написания этого комментария ни один из ответов (кроме C #, использующего встроенную библиотеку) гарантированно не выдал действительный случайный UUID (и, скорее всего, вряд ли его выдаст).Ответы:
Pyth, 20 байтов
Демонстрация.
Кодирует
[1, 0, 0, 0, 2]
как 83 в базе 3, затем добавляет единицу и умножает на четыре, чтобы получить длину каждого сегмента. Затем делает шестнадцатеричные цифры и присоединяется к дефисам.источник
Юлия, 80 байт
Создайте случайное 128-разрядное целое число, получите его шестнадцатеричное представление в виде строки, дополненной до 32 цифр, и разделите ее на сегменты, соединенные штрихами.
Спасибо ConfusedMr_C и kvill за помощь!
источник
CJam,
2625 байтовПопробуйте онлайн в интерпретаторе CJam .
Как это устроено
источник
PowerShell,
776967 байтредактировать: посторонние парены:
редактировать: удалось удалить конечный .Trim ("-") из оригинала:
Это может быть яснее с некоторыми пробелами, учитывая природу флагов (-f и -Join). Я все еще хотел бы потерять окончательный Трим ("-"):
Или, используя встроенную функциональность (аля ответ C # выше)
Тем не менее, он выглядит довольно коротко, даже если он занимает 31 байт.
источник
(8,4,4,4,12|%{-join(1..$_|%{'{0:X}'-f(random(16))})})-join'-'
Python 2,
8684 байтаЭта цепочка форматирует строки, чтобы заставить Python форматировать шестнадцатеричные числа уникально для каждого сегмента.
Ungolfed:
Это может использовать некоторые улучшения, но я горжусь.
источник
Perl 5 , 43 байта
Сохранено 2 байта благодаря @Xcali !
Попробуйте онлайн!
источник
PHP, 69
7275байтЭто не выводит шестнадцатеричные цифры (
a
, ...f
). Они разрешены, но не обязательны для тела вопроса.Группа цифр не начинается с
0
(также не требуется).редактировать: сохранено 3 байта благодаря @IsmaelMiguel
источник
join()
вместо этого.C #, 65 байт
редактировать: да! C # короче другого языка (кроме Java) :)
источник
CreateUUID[]
!Гоук, 86
Вы можете использовать это один раз в секунду, чтобы генерировать уникальный случайный «UUID». Это связано с тем,
srand()
что в качестве аргумента используется системное время в секундах с начала эпохи, если аргумент не указан.Я думаю, что часть awk довольно элегантна.
Если вы хотите использовать его чаще, чем раз в секунду, вы можете назвать его в bash следующим образом. Обратите внимание, что часть awk также изменена.
echo
Добавляется там напечатать новую линию каждый раз.источник
К5, 35 байт
Для создания шестнадцатеричного алфавита я генерирую символьную строку (
`c$
) из списка цифр (48+!10
) и первых 6 заглавных букв (65+!6
). Альтернативный способ генерации цифр одинаковой длины,/$!10
.С созданной строкой "0123456789ABCDEF" все остальное просто. Выберите 32 случайных значения из этого set (
32?
), slice (_
) результирующей строки при0 8 12 16 20
вычислении через(0,8+4*!4)
, а затем объедините полученные фрагменты строки с помощью dashes ("-"/
).В бою:
источник
R , 63 байта
Попробуйте онлайн!
Код сначала строит случайную строку из 36 символов, а затем помещает четыре дефиса. Он выводит UUID на стандартный вывод.
источник
c
вызовsprintf("%x",0:15)
на -1.JavaScript, ES6, 106 байт
Использует Regex заменить. Обрабатывает строку формата как счетчик для генерации шестнадцатеричного символа. Поднимать везде, где могу; пропуская точки с запятой, где это возможно.
источник
'8-4-4-4-12'.replace(/\d+/g,n=>Math.floor(16**n*Math.random()).toString(16).padStart(n,0))
Perl 6 , 53 байта
Очевидный:
Перевод примера Perl 5 с использованием
printf
приводит к тому, что код немного короче.источник
(0..16⁴)
?! Вы можете сделать это в Perl?1,2,4,8,16 ... *
что генерирует ленивый бесконечный список степеней 2. ({2**$++} ... *
также работает)Котлин , 175 байт
Попробуйте онлайн!
Моя первая в истории программа Kotlin и подача PPCG
источник
APL (Dyalog Unicode) ,
11578 байтПопробуйте онлайн!
Это мое первое представление APL. Огромное спасибо @ Adám за поддержку в чате APL PPCG и за функцию шестнадцатеричного преобразования.
Спасибо @ Zacharý за 1 байт
Отредактировано, чтобы исправить количество байтов.
источник
⎕IO←0
на себя без стоимости байтов, Adám делает это много. Кроме того, большинство байтов (IIRC, все те, что у вас есть здесь) можно считать одним в APL.a(H 12?16)
чтобыa H 12?16
сохранить один байт.'-'@(+\9,3⍴5)⊢(⎕D,819⌶⎕A)[?36⍴16]
или'-'@(+\9,3⍴5)∊⌂hex?18⍴256
Japt , 32 байта
Попробуйте онлайн!
источник
m@
-£
, например) и, чтобы помочь вам начать работу здесь наспех golfed версия 24 байт вашего решения: ethproductions.github.io/japt/... отброшенных в чат Japt , если у вас есть какие - либо вопросы.MATLAB / Octave, 95 байт
источник
Perl , 51 байт
Требуется perl5> = 5.10 Я думаю. Для модификатора / r и для say ().
источник
s//xx-x-x-x-xxx/;s/x/sprintf"%04x",rand 65536/eg
использованием-p
флага, что также означает, что оно работает на более старых версиях без-E
.-p
), но все еще довольно хорошо, и я бы не стал рассматривать этот подход, не увидев ваш ответ!J ,
42 39 3727 байтПопробуйте онлайн!
источник
C ++,
194193221210201 байт+7 байт благодаря Zacharý (обнаружил,
-
что не должно быть в конце)Если у кого-то есть способ получить разные значения при каждом выполнении без изменений
srand
и без учета<ctime>
, это было бы здоровоисточник
#define L(a) for
... быть#define L(a)for...
? ("0123456789abcdef"[rand()%16]
, а затем удалитьf
?Befunge-93 , 97 байт
Попробуйте онлайн!
Я уверен, что это может быть уменьшено, но это моя первая попытка :)
источник
Баш, 67 байт
источник
JavaScript REPL, 79 байт
Попробуйте онлайн!
Math.random
может вернуться0
. Добавив 5 нулей, получим нарезку 40
систочник
Forth (gforth) ,
9189 байтПопробуйте онлайн!
объяснение
Изменяет основание на шестнадцатеричное, затем выводит числа / сегменты соответствующей длины с тире через заданные интервалы
Код Объяснение
источник
C (gcc) ,
949186 байтовПопробуйте онлайн!
Я хотел бы предложить эту версию в комментарии Максу Ехлакову ( его ответ ), но, к сожалению, у меня пока нет 50 необходимых очков репутации, так что вот мой ответ.
803912
находитсяC4448
в шестнадцатеричном формате, он описывает , как результат должен быть отформатирован (12-4-4-4-8
), она восстанавливается , так как наименее значащие цифры будут считаны первым.Редактирование:
srand(time(0))
сsrand(&i)
источник
main(){...;int i=
может бытьmain(i){...;i=
.srand()
принимаюunsigned int
как его начальный параметр. На tio.run длинаunsigned int
составляет 4 байта, а UUID - 16 байтов. Это означает, что будет сгенерирована только малая часть действительных выходных данных (1/2 ^ 12), поэтому мое решение (как и предыдущее сtime(0)
) недействительно. Как вы думаете ?Assuming that your language's PRNG is perfect, all valid outputs must have the same probability of being generated.
. Начальная энтропия не обязательно определяет энтропию ГСЧ, хотя, скорее всего, она определяет (не проверялаsrand()
реализацию). Тем не менее,srand()
насколько мне известно, это достаточно равномерно, поэтому, если бы ГСЧ было совершенным, оно все равно было бы однородным. Поэтому я думаю, что ваш ответ действителен.srand()
это уже сделано, и в этом случае не будет никаких сомнений. Но я не уверен, разрешено ли это, другие представления C / C ++, кажется, все включаютsrand()
int ответ (если он не используетrand()
)C (gcc),
1431101039694 байтаГольф до 94 байтов, благодаря потолочной кошке и Джонатану Фреху.
Попробуйте онлайн!
Объяснение:
источник
*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))
Ява с десятифутовым лазерным полюсом v. 1.06, 126 bytes
Протестировано с версией 1.06 библиотеки, но это должно работать с любой версией 1.04 или новее.
источник
Желе , 17 байт
Попробуйте онлайн!
источник
SmileBASIC,
6562 байтаЯ создал функцию для печати 4 случайных шестнадцатеричных цифр:
DEF H?HEX$(RND(65536),4);:END
а также 4 цифры с А-
после нихDEF G:H?"-";:END
. Тогда он просто должен вызывать эти функции несколько раз.источник
чип , 109 + 6 = 115 байт
Требуются флаги
-wc36
, вызывающие +6 байтПопробуйте онлайн!
Создает 4 случайных бита (четыре
?
) и преобразует их в шестнадцатеричные цифры:0x0
-0x9
=>0
-9
0xa
-0xe
=>b
-f
0xf
=>a
... немного нетрадиционно, но это сэкономило мне несколько байтов без затрат на распределение результатов.
источник