Перевірте, чи UUID дійсний, не використовуючи регулярні вирази


44

Враховуючи рядок введення, напишіть програму, яка виводить значення "truthy" в STDOUT або еквівалент, якщо вхід є дійсним UUID, не використовуючи регулярні вирази.

Дійсний UUID є

32 шістнадцяткових цифр, відображених у п’яти групах, розділених дефісами, у формі 8-4-4-4-12 на загальну кількість 36 символів (32 буквено-цифрових символів та чотири дефіси).

Джерело

Випробування

0FCE98AC-1326-4C79-8EBC-94908DA8B034
    => true
00000000-0000-0000-0000-000000000000
    => true
0fce98ac-1326-4c79-8ebc-94908da8b034
    => true
0FCE98ac-1326-4c79-8EBC-94908da8B034
    => true

{0FCE98AC-1326-4C79-8EBC-94908DA8B034}
    => false (the input is wrapped in brackets)
0GCE98AC-1326-4C79-8EBC-94908DA8B034
    => false (there is a G in the input)
0FCE98AC 1326-4C79-8EBC-94908DA8B034
    => false (there is a space in the input)
0FCE98AC-13264C79-8EBC-94908DA8B034
    => false (the input is missing a hyphen)
0FCE98AC-13264-C79-8EBC-94908DA8B034
    => false (the input has a hyphen in the wrong place)
0FCE98ACD-1326-4C79-8EBC-94908DA8B034
    => false (one of the groups is too long)
0FCE98AC-1326-4C79-8EBC-94908DA8B034-
    => false (has a trailing hyphen)
0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
    => false (too many groups)
0FCE98AC13264C798EBC94908DA8B034
    => false (there is no grouping)

Правила

  • Регулярні вирази заборонені
  • Буквальне узгодження шаблону, подібне до регулярного вираження, не допускається. Наприклад, використовуючи [0-9a-fA-F]або інші шістнадцяткові ідентифікатори (ми це назвемо n), а потім відповідати nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnnабо n[8]-n[4]-n[4]-n[4]-n[12]забороняється
  • Вхід може бути взято з STDINаргументу функції або як аргумент
  • Вхід нечутливий до регістру
  • Можна з упевненістю припустити, що вхідні дані не містять стрічкових каналів чи нових рядків.
  • Вхід може містити будь-які символи для друку ASCII (включені пробіли)
  • Параметр " truthy" повинен бути надрукований STDOUTабо еквівалентний, якщо вхід є дійсним uuid
  • Значення фальси повинно бути надруковано STDOUTабо еквівалентно, якщо вхід не є дійсним uuid
  • Якщо використовується функція, замість використання STDOUT, вихід може бути зворотним значенням функції
  • Не може бути надруковано значення truthy / falsey STDERR.
  • Застосовуються стандартні лазівки
  • Це , тому виграє найкоротша програма в байтах. Удачі!

Таблиця лідерів

Це фрагмент стека, який генерує як таблицю лідерів, так і огляд переможців за мовою.

Щоб відповідь з’явилася, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown

## Language Name, N bytes

Де N - розмір поданих вами даних у байтах

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, пробивання старих балів чи включення прапорів у кількість байтів), просто переконайтесь, що фактичний бал є останнім номером у вашому заголовку

## Language Name, <s>K</s> X + 2 = N bytes


32
Бідна сітківка . Д:
BrainSteel


8
Тільки для довідки я можу придумати 28-байтне рішення Retina. (Тож не шалена перевага перед мовами для гри в гольф, хоча в даний час це буде ведучим.)
Мартін Ендер

5
Чи дозволені схеми Луа ? Вони, звичайно, не є регулярними виразами.
маніпуляція

1
@JacobKrall Я впевнений, що це "хибність" у всіх ваших запитаннях. Я вважаю, що виклик є досить зрозумілим, що тільки рядки форми \h{8}-\h{4}-\h{4}-\h{4}-\h{12}(де \hє шістнадцяткова цифра) є дійсними.
Мартін Ендер

Відповіді:


15

CJam, 31 30 29 байт

8 4__C]Nf*'-*qA,s'G,_el^+Ner=

Тут запустіть усі тестові справи.

Пояснення

Замість того, щоб шаблон безпосередньо відповідав вводу, ми спочатку перетворюємо його на більш просту форму, яку можна легко порівняти з одним рядком шаблону.

8 4__C] e# Push the array of segment lengths, [8 4 4 4 12].
Nf*     e# Turn that into strings of linefeeds of the given length.
'-*     e# Join them by hyphens, giving "NNNNNNNN-NNNN-NNNN-NNNN-NNNNNNNNNNNN".
q       e# Read the input.
A,s     e# Push the string "0123456789".
'G,_el^ e# Push the string "ABCDEFabcdef".
+       e# Concatenate the two strings.
N       e# Push a linefeed.
er      e# Replace all hexadecimal digits with linefeeds.
=       e# Check for equality with the pattern string.

23

JavaScript ES6, 73 55 56 символів

s=>s.split`-`.map(x=>x.length+`0x${x}0`*0)=="8,4,4,4,12"

У попередній версії 55 символів є проблема з пробілами в групі:

s=>s.split`-`.map(x=>x.length+("0x"+x)*0)=="8,4,4,4,12"
// "00000000-0000-0000-000 -000000000000" true

Тест:

f=s=>s.split`-`.map(x=>x.length+`0x${x}0`*0)=="8,4,4,4,12"
;`0FCE98AC-1326-4C79-8EBC-94908DA8B034
0fce98ac-1326-4c79-8ebc-94908da8b034
0FCE98ac-1326-4c79-8EBC-94908da8B034
0GCE98AC-1326-4C79-8EBC-94908DA8B034
0FCE98AC-13264C79-8EBC-94908DA8B034
0FCE98AC-13264-C79-8EBC-94908DA8B034
0FCE98ACD-1326-4C79-8EBC-94908DA8B034
0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
00000000-0000-0000-0000-000000000000
D293DBB2-0801-4E60-9141-78EAB0E298FF
0FCE98AC-1326-4C79-8EBC-94908DA8B034-
00000000-0000-0000-000 -000000000000`.split(/\n/g).every(s=>f(s)==/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i.test(s))

Awesome (і в'янення для мене) +1
edc65

@ edc65, що ти маєш на увазі під "в'яненням"?
Qwertiy

Дивовижне зловживання неявним кастингом +1
Пуховик

4
презирливий, презирливий,
бридкий, жалючий

11

PowerShell, 29 21 84 49 37 Байт

param($g)@{36=$g-as[guid]}[$g.length]

Велике спасибі людям в коментарях , які надають допомогу з цією грою в гольф , щоб йти в ногу з мінливими правилами - TessellatingHeckler , iFreilicht , Jacob Кролл і Джо . Перегляньте історію редагування для редакцій та старіших версій.

Ця редакція приймає введення як $g, а потім створює нову хеш-таблицю @{}з одним елементом, індекс 36встановлюється рівним $g-as[guid]. При цьому використовується вбудований -asоператор для спроби перетворення між двома типами даних .NET - від [string]до [guid]. Якщо конверсія успішна, [guid]об’єкт повертається, інше $nullповертається. Ця частина гарантує, що вхідний рядок є дійсним .NET GUID.

Наступним кроком є ​​індексація в хеш-таблиці за допомогою [$g.length]. Якщо $gдовжина не буде точно 36 символів, повернеться хеш-таблиця $null, яка виводиться як значення фальси. Якщо $gдовжина становить 36 символів, то результат виклику .NET буде виведений. Якщо $gне є дійсним .NET GUID (у будь-якій формі), він відображатиметься $nullяк значення фальси. В іншому випадку він виведе об’єкт .NET GUID у якості триєдкого значення - єдиний спосіб, який можна вивести, це якщо він відповідає запитуваному формату завдання.

Приклади

Ось я інкапсулюю скрипт-виклик у паренах і явно викладаю як булевий для ясності.

PS C:\Tools\Scripts\golfing> [bool](.\check-if-a-uuid-is-valid.ps1 '0FCE98AC-1326-4C79-8EBC-94908DA8B034')
True

PS C:\Tools\Scripts\golfing> [bool](.\check-if-a-uuid-is-valid.ps1 '0FCE98AC-1326-4C79-8EBC-94908DA8B034D')
False

PS C:\Tools\Scripts\golfing> [bool](.\check-if-a-uuid-is-valid.ps1 '0FCE98AC13264C798EBC94908DA8B034')
False

4
Я закину в !!($args[0]-as[guid])21 байт.
TessellatingHeckler

2
Не могли ви просто зберегти 4 байти, залишивши поза !!()? Так як значення $NULLі [guid]є взаємовиключними, вони мають право представляти truthey і falsey значення, чи не так? У будь-якому випадку, чудовий спосіб перетворитись на булеве, любити рішення!
iFreilicht

@iFreilicht - це точка; дивлячись на пов'язаний пост "трактування фальси / фальси" - я згоден, це виглядає дійсно.
TessellatingHeckler

1
Це рішення невірно повертається Trueза тим 0FCE98AC13264C798EBC94908DA8B034, що не має дефісів
Якоб Кралл

1
@TessellatingHeckler Ні, занадто добре, щоб бути правдою. Додавання цифри, наприклад 0FCE98AC-1326-4C79-8EBC-94908DA8B034D(додатковий D на кінці), повертає фальси $TRUE, оскільки вона просто обрізає цифру, яка ображає, і перші 36 символів є дійсними.
AdmBorkBork

9

Emacs Lisp, 236 байт

(lambda(s)(and(eq(string-bytes s)36)(let((l(string-to-list s))(i 0)(h '(8 13 18 23))(v t))(dolist(c l v)(set'v(and v(if(member i h)(and v(eq c 45))(or(and(> c 47)(< c 58))(and(> c 64)(< c 91))(and(> c 96)(< c 123))))))(set'i(+ i 1))))))

Безголівки:

(lambda (s)
  (and (eq (string-bytes s) 36) ; check length
       (let ((l (string-to-list s))
             (i 0)
             ; location of hyphens
             (h '(8 13 18 23))
             (v t))
         (dolist (c l v)
           (set 'v (and v (if (member i h)      ; check if at hyphen position
                              (and v (eq c 45)) ; check if hyphen
                            (or (and (> c 47) (< c 58))      ; check if number
                                (and (> c 64) (< c 91))      ; check if upper case letter
                                (and (> c 96) (< c 123)))))) ; check if lower case letter
           (set 'i (+ i 1)))))) ; increment

8

Через зміни правил ця відповідь більше не є конкурентоспроможною :(

С, 98

main(a,n){printf("%d",scanf("%8x-%4hx-%4hx-%4hx-%4hx%8x%n%c",&a,&a,&a,&a,&a,&a,&n,&a)==6&&n==36);}

Здебільшого досить роз’яснювальний. Специфікатор %nформату дає кількість прочитаних до цього часу байтів, яка повинна бути 36. scanf()повертає кількість відповідних елементів, яка повинна бути 6. Фінал %cне повинен відповідати нічого. Якщо це так, то є текст, що scanf()повертається , і поверне 7.

Компілюйте, -wщоб придушити набридливі попередження (їх декілька).


6

JavaScript ES6, 70 83

ПРИМІТКА THX до @Qwertiy для пошуку помилки (та запропонування деяких удосконалень та виправлень)

Thx @ CᴏɴᴏʀO'Bʀɪᴇɴ збережено 2 байти

Інші 9 байт зберегли для спрощення перевірки довжини (складний шлях був коротшим у першому чернеті, але не зараз)

u=>u.split`-`.every((h,l,u)=>u[4]&&-`0x${h}1`&&h.length-'40008'[l]==4)

Пояснив

u=>u.split`-` // make an array splitting at '-'
.every( // for every element the following must be true
 (h,l,u)=> // h is the element, l is the index, u is the whole array
 u[4] // element 4 must be present (at least 5 element in array)
 && -`0x${h}1` // element must be a valid hex string with no extraneous blanks (else NaN that is falsy)
 // get requested length from index (8,4,4,4,12 sub 4 to put in 1 char)
 // a 6th elements will be rejected as undefined != 4
 && h.length-'40008'[l]==4// then check element length
)

Фрагмент тесту

f=u=>u.split`-`.every((h,l,u)=>u[4]&&-`0x${h}1`&&h.length-'40008'[l]==4)

console.log=x=>O.innerHTML+=x+'\n'

;[
  ['0FCE98AC-1326-4C79-8EBC-94908DA8B034',true],
  ['0fce98ac-1326-4c79-8ebc-94908da8b034',true],
  ['0FCE98ac-1326-4c79-8EBC-94908da8B034',true],
  ['00000000-0000-0000-0000-000000000000', true],
  ['ffffffff-ffff-ffff-ffff-ffffffffffff', true],
  ['0GCE98AC-1326-4C79-8EBC-94908DA8B034',false],
  ['0FCE98AC-13264C79-8EBC-94908DA8B034',false],
  ['0FCE98AC-13264-C79-8EBC-94908DA8B034',false],
  ['0FCE98ACD-1326-4C79-8EBC-94908DA8B034',false],
  ['0FCE98AC-1326-4C79-8EBC',false],
  ['0FCE98AC-1326-4C79-8EBC-94908DA8B034-',false],
  ['00000000-0000-0000-000 -000000000000', false],
  ['0FCE98AC-1326-4C79-8EBC-94908DA8B034-123',false],
].forEach(x=>{
  var t=x[0], r=f(t), k=x[1]
  console.log('Test '+t+' result '+r+(r==k?' ok':' fail'))
})
<pre id=O></pre>


-1-('0x'+h)=>1/('0x'+h)
Qwertiy

Та ж проблема, що і в моїй попередній версії: правда00000000-0000-0000-000 -000000000000
Qwertiy

Ні. Але ви додали неправильний тест. Провідний простір не є проблемою, але трейлінг - це так, як рядок обрізається при перетворенні на число. Дивіться мій коментар вище з тестом.
Qwertiy

'00000000-0000-0000-000 -000000000000' тепер я бачу це @Qwertiy Я пропустив 3 нулі замість 4
edc65

1
@Stefnotch я не згоден. Поза everyвикликом u- рядок, а не масив
edc65

5

Через зміни правил ця відповідь більше не є конкурентоспроможною :(

Pure Bash (без зовнішніх утиліт), 78

printf -vv %8s-%4s-%4s-%4s-%12s
p=${v// /[[:xdigit:]]}
[ "$1" -a ! "${1/$p}" ]

Здійснює введення з командного рядка.

  • printfБудує наступний рядок - - - -.
  • p=Лінія перетворює це в таку схему: [[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]. Зауважте, це виглядає дуже жахливо, як звичайний вираз. Однак це не в цьому контексті. Це зразок для узгодження шаблону оболонки . Це за принципом схоже на регулярний вираз, але є іншою конструкцією (та синтаксисом).
  • Останній рядок перевіряє, чи є
    • вхід не порожній
    • якщо витягуючи візерунок із вхідного рядка, виходить порожня рядок

Ідіоматичний оболонці, зворотний код 0 вказує на успіх / ІСТИНА, а 1 вказує на збій / ЛЖ. Код повернення може бути перевірений echo $?після запуску сценарію.


1
Зображення оболонки оболонки може не відповідати синтаксису регулярного виразів, але клас символів, безумовно, використовує визначення та синтаксис з регулярного виразу POSIX. У будь-якому разі, вирішувати, чи прийнятна вона, залежить від ОП.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Регулярні вирази можуть включати класи символів Posix, але я не думаю, що це означає, що все, що використовує клас символів Posix, є регулярним вираженням. В якості іншого прикладу trтакож використовуються класи символів Posix, але це не паргекс-аналізатор.
Цифрова травма

Ви можете поголити кілька символів, уникаючи непотрібних подвійних лапок, наприклад у форматі printf.
Єнс

Я оновив виклик, щоб уточнити - причина заборонених регулярних виразів полягала в тому, щоб зробити так, щоб шістнадцяткові візерунки не можна було використовувати для відповідності уйдам
Джодмо

4

Джольф, 32 байти

Спробуйте тут!

 eGi'-DN&bH*28=lH.[8,4,4,4,12]S}
 e                               Property "e"very of next object
  Gi'-                           Split i at hyphen
      DN                       } every comparison function
        &                        logical conjugation of next two arguments
         bH*28                   base 16 of H (first arg); is NaN (falsey) if invalid
              =                  equality of next two items
               lH                the length of H (first arg)
                 .            S  the Sth (index) member of the object inbetween
                  [8,4,4,4,12]   array of lengths

Через помилку в моєму коді це довше, ніж має бути. :( [8,4,4,4,12] має бути таким же, як {8444*26}, але }це також закриття функції: P


2
Так це довше, ніж це має бути, тому що у вас створені неоднозначні команди на створеній мові? : P
Rɪᴋᴇʀ

@RikerW Незначна смислова помилка. Це зараз виправлено.
Conor O'Brien

4

MATL , 55 байт

jttn36=?[9,5,5,5]XsXK)45=?36:Km~)4Y2'A':'F'hm?}F]]]N~1$

Я утримався від використання Ybфункції ( strsplit), оскільки вона дещо схожа на regexp(..., 'split'). Для цього використовується лише індексація та порівняння символів.

Приклад

>> matl
 > jttn36=?[9,5,5,5]XsXK)45=?36:Km~)4Y2'A':'F'hm?}F]]]N~1$
 > 
> This is a test
0

>> matl
 > jttn36=?[9,5,5,5]XsXK)45=?36:Km~)4Y2'A':'F'hm?}F]]]N~1$
 > 
> D293DBB2-0801-4E60-9141-78EAB0E298FF
1

Пояснення

jt                     % input string, duplicate
tn36=?                 % if length is 36
  [9,5,5,5]XsXK        % build and copy indices of required '-' positions
  )45=?                % if those entries are indeed '-'
    36:Km~)            % logical index of remaining positions
    4Y2'A':'F'h        % allowed chars in those positions
    m?                 % if all those entries are legal: do nothing
    }                  % else
      F                % false value
    ]                  % end
  ]                    % end
]                      % end
N~                     % true if stack is empty
1$                     % display last result only

3

CJam, 52 42 байти

qeu__{A7*)<},\'-/83 3b{)4*}%.{\,=}[1]5*=*=

Спробуйте в Інтернеті . Виводить початковий рядок, якщо є істинним, виводить порожню рядок, якщо помилкова ( це дозволено ).

Пояснення:

qeu__                                      e# Take input, make 2 copies
     {A7*)<},\                             e# Remove invalid characters from first copy
              '-/                          e# Split top of stack on '-
                 83 3b{)4*}%               e# Array of group lengths: [8 4 4 4 12]
                            .{\,=}[1]5*=   e# Compare two arrays, return true if group lengths are correct
                                        *= e# Multiply this value by original string (0 = empty string, 1 = same string)

A7*)<НЕ буде видаляти неприпустимі символи, як прогалини, +, ?...
Мартін Ендер

@ MartinBüttner о стріляй ... Я цього не усвідомлював, зафіксував це за кілька хвилин.
GamrCorps

3

Джулія, 86 байт

s->(t=split(s,"-");map(length,t)==[8,4,4,4,12]&&all(i->!isnull(tryparse(Int,i,16)),t))

Це анонімна функція, яка приймає рядок і повертає булева. Щоб зателефонувати, дайте ім’я, наприклад f=s->....

Безголівки:

function f(s::AbstractString)
    # Split the input into an array on dashes
    t = split(s, "-")

    # Ensure the lengths are appropriate
    ok1 = map(length, t) == [8, 4, 4, 4, 12]

    # Ensure each element is a valid hexadecimal number
    ok2 = all(i -> !isnull(tryparse(Int, i, 16)), t)

    return ok1 && ok2
end

3

C # 196 байт

using System.Linq;class P{bool T(string v){var r=v.Length==36;for(var i=0;i<v.Length;i++)r&=new[]{8,13,18,23}.Any(t=>t==i)?v[i]=='-':v[i]>47&&v[i]<58|v[i]>64&&v[i]<71|v[i]>96&&v[i]<103;return r;}}

Безголівки:

using System.Linq;
class P
{
    public bool T(string v)
    {
        var r = v.Length == 36;
        for (var i = 0; i < v.Length; i++)
            r &= new[] { 8, 13, 18, 23 }.Any(t => t == i) 
                ? v[i] == '-' 
                : v[i] > 47 && v[i] < 58 | v[i] > 64 && v[i] < 71 | v[i] > 96 && v[i] < 103;
        return r;
    }
}

Метод Tможна викликати будь-яким ненульовим рядком, інакше повернеться trueдля дійсних GUID false. Це перевірка постійного часу; ціною трьох символів ви можете достроково вийти з методу (змінити i < v.Lengthна i < v.Length && r).

Спробуємо пізніше знизити рахунок.

Я, очевидно, залишив Guid.ParseExactшлях, бо де в цьому весело? Ось це, без особливих спроб гольфувати його далі в 86 байтах :

using System;class P{bool T(string v){Guid x;return Guid.TryParseExact(v,"D",out x);}}

Безголівки:

using System;
class P
{
    bool T(string v)
    {
        Guid x;
        return Guid.TryParseExact(v, "D", out x);
    }
}

2

Python 2, 99 112 байт

def f(u):
 try:u=u.split()[0];int(u.replace('-',''),16);print[8,4,4,4,12]==map(len,u.split('-'))
 except:print 0

На дійсному введенні він друкує True. На невірному введенні він друкується Falseабо 0, залежно від того, чому він був недійсним. Falseі 0обидва фальси в Пітона.

Функція повинна перевіряти 3 речі:

  • Кожен символ, який не переносить дефіс, - це цифра або є в ABCDEF
  • Там рівно 4 дефіси
  • Перед першою дефісом є 8 символів, 12 після останнього і 4 між будь-якими іншими

Ось розбивка, щоб показати, як вона перевіряє їх. Це трохи застаріло, але я голодний, тому оновлю його згодом.

def f(u):
    try:
        int(u.replace('-',''),16) # Remove all hyphens from the string and parse what's
                                  # left as a base 16 number. Don't do anything with this
                                  # number, but throw an exception if it can't be done.

        return[8,4,4,4,12]==map(len,u.split('-')) # Split the string at each hyphen and
                                                  # get the length of each resulting
                                                  # string. If the lengths == [8,4,4,4,12],
                                                  # there are the right number of groups
                                                  # with the right lengths, so the string
                                                  # is valid.
    except:
        return 0 # The only way to get here is if the string (minus hyphens) couldn't be
                 # parsed as a base 16 int, so there are non-digit, non-ABCDEF characters
                 # and the string is invalid.

Я думаю , ви можете зберегти 2 байти , якщо замінити обидва примірника returnз print. (У такому випадку ви неодмінно захочете опинитися в Python 2, тому що printв Python 3. працює інакше)
mathmandan

1
Це не працює в Python 3, тому що mapтепер повертає "об'єкт карти", а не список.
Тім Педерік

Це не працює в python 2 (можливо, теж 3), оскільки intфункція дозволяє пробіли - 0FCE98ac-1326-4c79-8EBC-94908da8B03з пробілом. Дивіться коментар у видаленій відповіді Pyth тут, якщо є можливість.
Синій

2

Python 2, 57 байт

Дякую добру за вбудований! - обов’язково додайте рядки до лапок.

import uuid
try:uuid.UUID(input());print 1
except:print 0

5
Відповідно до документів, з якими ви пов’язані, вони надрукували б 1для введення 12345678123456781234567812345678.
Денніс

якби це спрацювало, ти зможеш зберегти байти, виконуючи це, try:print uuid.UUID(input())оскільки все, що потрібно, - це ти надрукуєш велику цінність
undergroundmonorail

2
Ця програма приймає багато форматів UUID, але питання хоче лише 36-символьного формату UUID з дефісами.
Якоб Кралл

2
Ви можете виправити це, впоравшись із оновленими правилами, перевіривши, чи вхідна рядок дорівнює uuid, перетвореному назад у рядок. Одразу дає вам справжнє значення.
квітня

2

Pyth, 39 байт

&&!+1xzd.xi:zK\-k16ZqxKc+zK1mid36"8dinz

Спробуйте тут .


У вашому посиланні "спробуй тут" відсутній \символ K\-k, тому він не запускається як є.
Олексій

Це вже виправлено
Синій

2

Perl 6 ,  83   67 байт

# 83 bytes
{
  (
    my@a=.uc.split('-')
  ).map(*.comb)⊆('0'..'9','A'..'F')
&&
  @a».chars~~(8,4,4,4,12)
}

# 67 bytes
{
  (
    $/=.split('-')
  ).map({:16($_)//|()})==5
&&
  $/».chars~~(8,4,4,4,12)
}

(підрахунки не включають нові рядки або відступи, оскільки вони не потрібні)

використання:

# give it a name
my &code = {...}

say map &code, «
  D293DBB2-0801-4E60-9141-78EAB0E298FF
  0FCE98AC-1326-4C79-8EBC-94908DA8B034
  0fce98ac-1326-4c79-8ebc-94908da8b034
  0FCE98ac-1326-4c79-8EBC-94908da8B034
  00000000-1326-4c79-8EBC-94908da8B034
»;
# (True True True True True)

say map &code, «
  0GCE98AC-1326-4C79-8EBC-94908DA8B034
 '0FCE98AC 1326-4C79-8EBC-94908DA8B034'
  0FCE98AC-13264C79-8EBC-94908DA8B034
  0FCE98AC-13264-C79-8EBC-94908DA8B034
  0FCE98ACD-1326-4C79-8EBC-94908DA8B034
  0FCE98AC-1326-4C79-8EBC-94908DA8B034-
  0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
»;
# (False False False False False False False)

2

Лист звичайний - 161

(lambda(s &aux(u(remove #\- s)))(and(=(length s)36)(=(length u)32)(every(lambda(p)(char=(char s p)#\-))'(8 13 18 23))(ignore-errors(parse-integer u :radix 16))))

Повернене значення, якщо true - хеш, як число, що є корисним результатом.

Безумовно

(defun uuid-p (string &aux (undashed (remove #\- string)))
  (and
   ;; length of input string must be 36
   (= (length string) 36)

   ;; there are exactly 4 dashes
   (= (length undashed) 32)

   ;; We check that we find dashes where expected
   (every (lambda (position)
            (char= (char string position) #\-))
          '(8 13 18 23))

   ;; Finally, we decode the undashed string as a number in base 16,
   ;; but do not throw an exception if this is not possible.
   (ignore-errors
    (parse-integer undashed :radix 16))))

@Jojodmo Так, безумовно! Спасибі
coredump

2

F # 44 символів

fun s->System.Guid.TryParseExact(s,"D")|>fst

У F # функції з outпараметрами можна викликати, опустивши вихідний параметр; його значення при поверненні буде поєднуватися з справжнім значенням повернення функції в кортеж.

Тут кортеж передається в fstфункцію, яка повертає свого першого члена, що в даному випадку є булевим значенням повернення TryParseExact, що вказує на успіх або невдачу виклику.

В якості перевірки правильності формату ми повертаємося trueлише в тому випадку, якщо рядок має 36 символів.

Перш ніж я побачив відповідь C # на RobIII, я не думав використовувати TryParseExact, тому моя відповідь повинна була бути на три символи довше:

fun s->System.Guid.TryParse s|>fst&&s.Length=36

TryParse(string, Guid) приймає вхід у таких форматах:

00000000000000000000000000000000 
00000000-0000-0000-0000-000000000000 
{00000000-0000-0000-0000-000000000000} 
(00000000-0000-0000-0000-000000000000)
{0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}

З них лише другий - 36 символів.


2

Python 2, 93 89 85 байт

lambda u:(set(u)<=set("-0123456789abcdefABCDEF"))*map(len,u.split("-"))==[8,4,4,4,12]

У map()гарантії виклику , що секції мають правильні довжини і all()випробування кожного персонажа за те , або дефіс або довільної випадку шістнадцяткове число. Вираз генератора тестує кожен символ шляхом ітерації через всю цілу рядок, тому, боюся, це не найефективніший метод, але він повинен задовольняти тестові випадки:

>>> f=lambda u:(set(u)<=set("-0123456789abcdefABCDEF"))*map(len,u.split("-"))==[8,4,4,4,12]
>>> testcases = """\
... D293DBB2-0801-4E60-9141-78EAB0E298FF
... 0FCE98AC-1326-4C79-8EBC-94908DA8B034
... 0fce98ac-1326-4c79-8ebc-94908da8b034
... 0FCE98ac-1326-4c79-8EBC-94908da8B034
... 00000000-0000-0000-0000-000000000000""".splitlines()
>>> failcases = """\
... 0GCE98AC-1326-4C79-8EBC-94908DA8B034
... 0FCE98AC 1326-4C79-8EBC-94908DA8B034
... 0FCE98AC-13264C79-8EBC-94908DA8B034
... 0FCE98AC-13264-C79-8EBC-94908DA8B034
... 0FCE98ACD-1326-4C79-8EBC-94908DA8B034
... 0FCE98AC-1326-4C79-8EBC-94908DA8B034-
... 0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
... 00000000-0000-0000-000 -000000000000
... 00000000-0000-0000- 000-000000000000""".splitlines()
>>> all(f(u) for u in testcases)
True
>>> any(f(u) for u in failcases)
False
>>> 

Хтось має ідею, чому найменш правильна відповідь Python була скасована? Недостатнє пояснення?
rsandwick3

Jojodmo - у випадку, якщо з цього приводу виникли плутанини, я не відхилив запропоновану вам зміну - я вже зробив редагування, тому що пропустив символи автофокусування (скопіював з вікна, де я тестував негативні випадки), і спільнота авто -відхилила вашу пропозицію, не знаючи, що вона навіть була піднята. На той момент, коли я знав, що ти запропонував, @nimi вже вніс виправлення в заголовок. Я дуже сподіваюсь, що це не має нічого спільного з головою, оскільки це дуже погано відображатиметься на цій громаді. У всякому разі, я припускаю, що це інша річ, і додам трохи більше пояснень.
rsandwick3

2
Ви можете видалити f=пробіли та пробіли навколо рядка в allблоці.
FryAmTheEggman

о, приголомшливий, приємний улов - відредаговано
rsandwick3

1
Ви можете зберегти 8 (або 6, то , можливо , необхідно додати круглі дужки) байт шляхом перетворення all(..)встановити тестування включення: set(u)<=set("-0123456789abcdefABCDEF").
409_Конфлікт

1

САС, 171 144 141

data;infile stdin;file stdout;input a$9b$14c$19d$24;e=(a!!b!!c!!d='----')*length(_infile_)=36*(1-missing(put(input(compress(_infile_,,'adk'),$hex32.),$hex32.)));put e;run;

Насправді використовується stdin та stdout - одна з менш відомих особливостей цієї конкретної мови. Працює на наведених прикладах, але, можливо, не у всіх випадках. Можливо, можна покращити.

Кращий підхід - один символ одночасно:

data;infile stdin;file stdout;do i=1 to 37;input@i c$1.@;a+ifn(i in(9,14,19,24),c='-',n(input(c,hex.))-36*(i>36&c^=''));end;b=a=36;put b;run;

Отримали ще 6 символів від центрального виразу!

Безголівки:

data;
infile stdin;
file stdout;
do i=1 to 37;
input@i c$1.@;
a+ifn(i in(9,14,19,24),c='-',n(input(c,hex.))-36*(i>36&c^=''));
end;
b=a=36;
put b;
run;

Це генерує досить багато попереджень та приміток у журналі, але він не друкує їх на stdout або stderr, тому я думаю, що це чесна гра.


1

C, 391 байт

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define F printf("0")
#define T printf("1")
#define E return 0
main(){char s[99],*t;int k=1,l,i;scanf("%99[^\n]",s);if(s[strlen(s)-1]=='-'){F;E;}t=strtok(s,"-");while(t!=NULL){for(i=0,l=0;t[i]!=0;i++,l++){if(!isxdigit(t[i])){F;E;}}if((k==1&&l!=8)||((k>1&&k<5)&&l!=4)||(k==5&&l!=12)){F;E;}k++;t=strtok(NULL,"-");}if(k==6){T;E;};F;}

1

MATLAB, 126 байт

function f(a)
b='-';if length(a)==36&&a(9)==b&&a(13)==b&&a(17)==b&&a(21)==b;a(a==b)=[];if any(isnan(hex2dec(a)));0;end;1;end;0

1

Пітон 3, 134 байти

def a(i):
 try:l=[1+int(k,16)and(len(k)==c)for k,c in zip(i.split("-"),[8,4,4,4,12])];return(len(l)==5)&(0 not in l)
 except:return 0

int (k, 16) намагається кинути k на базу-16 int. Для символу, відмінного від 0-9a-fA-F-, він не вдається, і в цьому випадку ми повертаємо 0, що є помилковим. Додайте 1 до цього int, і ми отримаємо гарантоване значення truthy - ми позбавили всіх дефісів за допомогою str.split (), тому ми не зможемо отримати значення -1, а всі не-0 ints є правдивими.


1

C функція, 102

Зміна правила заборонила мою попередню scanf()відповідь на основі c , тому ось ще одна відповідь c, за допомогою isxdigit()якої, на мою думку, слід дозволити змагатися :

i;f(char *s){for(i=8;i<24;i+=5)s[i]=s[i]-45?1:s[i]+3;for(i=0;isxdigit(s[i]);i++);return i==36&&!s[i];}

Спробуйте в Інтернеті.

  • Перевірте наявність -символів (ASCII 45) у відповідних позиціях - якщо так, замініть їх на 0s (ASCII 48 (= 45 + 3))
  • Пройдіть рядок, перевіряючи кожну табличку isxdigit()
  • Поверніть TRUE, якщо довжина рядка 36, а остаточний символ - NUL.

1

Пакетна, 148 139 + 2 = 150 141 байт

@set/pu=
@for %%d in (1 2 3 4 5 6 7 8 9 A B C D E F)do @set u=!u:%%d=0!
@if -!u!==-00000000-0000-0000-0000-000000000000 exit/b0
@exit/b1

Додано 2 байти, оскільки вам потрібно використовувати /vперемикач на CMD.EXE.

Виходить з ERRORLEVEL 0 при успіху, 1 при відмові.

Редагувати: збережено кілька байтів, головним чином, тому що :=це нечутливе до регістру, але були й інші зміни.


1

Java, 345 байт

interface q{static void main(String[]a){int i=-1;char[]b=a[0].toCharArray();java.io.PrintStream u=System.out;if(b.length>36||b.length<36)u.print(1<0);if(b[8]!='-'||b[13]!='-'||b[18]!='-'||b[23]!='-')u.print(1<0);while(++i<b.length){if(i!=8&&i!=13&&i!=18&&i!=23){if(!((b[i]>='0'&&b[i]<='F')||(b[i]>='a'&&b[i]<='f')))u.print(1<0);}}u.print(1>0);}}

Введення - це перший аргумент командного рядка. Вихід - код помилки (0 означає дійсний UUID, 1 означає недійсний)

Безголівки з коментарями:

interface q {
    static void main(String[] a) {
        int i = -1;                                                             // Index
        char[] b = a[0].toCharArray();                                          // Characters from input
        java.io.PrintStream u = System.out;                                     // STDOUT
        if (b.length > 36||b.length < 36)                                       // If input length is not 36
            u.print(1<0);                                                       // Invalid
        if (b[8]!='-'||b[13]!='-'||b[18]!='-'||b[23]!='-')                      // If hasn't got separators at correct positions
            u.print(1<0);                                                       // Invalid
        while (++i<b.length) {                                                  // Iterate over all characters
            if (i!=8 && i!=13 & i!=18 && i!=23) {                               // If not at separator indexes
                if ( !( (b[i]>='0'&&b[i]<='F') || (b[i]>='a'&&b[i]<='f') ))     // If incorrect hexadecimal number
                    u.print(1<0);                                               // Invalid
            }
        }
        u.print(1>0);                                                           // Valid
    }
}

РЕДАКТУВАННЯ: Не помітили STDOUT частини. На жаль, виправлено зараз.


Приємно! Ви можете замінити if(b.length>36||b.length<36)їх просто if(b.length!=36). Крім того, оскільки ви можете друкувати триєдині значення , ви можете просто друкувати 0замість 1<0, а 1не 1>0.
Джодмомо

@Jojodmo На підставі голосів, значення truthy знаходиться в вигляді if(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); }Таким чином , в Java логічне значення є значенням truthy, але 1чи 0немає. Тільки тоді, коли ОЗ виклику говорить щось на кшталт: " Ваш вихід може бути істинним / хибним, 0/1, порожнім / непорожнім; до тих пір, поки ви вкажете, що ви використовуєте ", тоді ви дійсно можете використовувати, 0а 1не true/falseяк тризубний / значення фальси.
Кевін Кройссен

1
Що стосується порад щодо гольфу щодо файлів cookie: @Jojodmo дійсно вірно замінює його на if(b.length!=36); ||може бути |в декількох місцях, а також &&до &; if(...!='-')може бути if(...!=45); int i=-1; ... while(++i<b.length){можна замінити на for(int i=-1;++i<b.length;){; 'F'може бути 70( 'f'може бути 102, але це не має значення, оскільки це те саме число байтів). Мені подобається, як ти користувався java.io.PrintStream u=System.out;btw, я повинен пам'ятати про це! Тож спасибі
Кевін Круїйсен

1

Перемістіть 3, 50 байт

Передати рядок s

import Foundation
print(UUID(uuidString:s) != nil)

1

PHP, 109 байт

друкує 1 для істинного та 0 для хибного

for($t=($l=strlen($a=$argn))==36;$i<$l;$i++)$t*=$i>7&$i<24&!($i%5-3)?$a[$i]=="-":ctype_xdigit($a[$i]);echo$t;

$i>7&$i<24&!($i%5-3) на 5 байт коротше in_array($i,[8,13,18,23])

112 байт

echo array_filter(str_split($argn),function($i){return!ctype_xdigit($i);})==[8=>"-",13=>"-",18=>"-",23=>"-"]?:0;

113 байт

echo array_diff(str_split(strtolower($argn)),array_map(dechex,range(0,15)))==[8=>"-",13=>"-",18=>"-",23=>"-"]?:0;

0

Java, 172 байт 168 байт (Спасибі пшеничний майстер)

Якийсь хитрий, оскільки я використовував java.util.UUID, але тут іде:

import java.util.UUID;class ValidUUID{public static void main(String[] a){try{UUID.fromString(a[0]);System.out.println(1);}catch(Exception e){System.out.println(0);}}}

Негольована версія:

import java.util.UUID;

class ValidUUID {

    public static void main(String[] a) {
        try {
            UUID.fromString(a[0]);
            System.out.println(1);
        } catch(Exception e) {System.out.println(0);}
    }
}

Ласкаво просимо на сайт! Я думаю, ви можете видалити пробіл між tryі {.
Пшеничний майстер

@WheatWizard дякую: D також зауважив, що я можу видалити "навколо 0 і 1
ryxn

2
Ви повинні мати можливість видалити пробіл між String[]і a. Крім того , ви повинні бути в змозі замінити printlnз print.
клісмік

1
Назва класу може мати 1 символ. Ви можете використовувати java.util.UUID.fromStringзамість імпорту.
Пукайте

0

AWK, 98 байт

BEGIN{FS=""}{for(j=4;k<NF;){h+=(j+=5)<25?$j=="-":0
s+=strtonum("0x"$++k 1)>0}$0=h+s==36&&NF==36}1

Просто розбиває рядок на кожному символі і перевіряє, чи кожен символ є шістнадцятковою цифрою і чи є дефіси у відповідних місцях. strtonumперетворює недійсні символи в 0. Роблячи порівняння 0і m(і довільно обраний неприпустимий символ) вимагають додаткових кроків. На щастя 01, це дійсний шістнадцятковий номер, але m1це не так.

Спочатку я написав дві forпетлі, але я врятував 1 байт, стиснувши їх разом. :)

ПРИМІТКА: GAWKможе читати введення у вигляді шістнадцяткових чисел, але для цього потрібна дуже довга опція командного рядка.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.