정규식을 사용하지 않고 UUID가 유효한지 확인


44

문자열 입력이 주어지면 정규 표현식 을 사용하지 않고 입력이 유효한 UUID 인 경우 정확한 값 을 STDOUT 또는 이와 동등한 으로 인쇄하는 프로그램을 작성하십시오 .

유효한 UUID는

16 개의 32 자리 숫자로, 하이픈으로 구분 된 5 개의 그룹으로 표시되며 총 8 자 (32 자의 영숫자 및 4 개의 하이픈)에 대해 8-4-4-4-12 형식입니다.

출처

테스트 사례

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]다른 16 진수 식별자를 사용 하거나 (이것을 호출 할 것 n) 일치 nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn하거나 n[8]-n[4]-n[4]-n[4]-n[12]허용되지 않습니다
  • 입력은 STDIN함수 에서 가져 오거나 함수의 인수로 사용할 수 있습니다.
  • 입력은 대소 문자를 구분하지 않습니다
  • 입력에 줄 바꿈이나 줄 바꿈이 포함 되지 않는다고 가정하는 것이 안전합니다 .
  • 입력은 인쇄 가능한 ASCII 문자를 포함 할 수 있습니다 (공백 포함)
  • truthy 값 에 인쇄해야 STDOUT입력 유효한 UUID 경우 상당
  • falsey 값 에 인쇄해야 STDOUT입력이있는 경우 또는 동등 하지 유효한 UUID
  • 를 사용하는 대신 함수를 사용하는 경우 STDOUT출력은 함수의 반환 값이 될 수 있습니다.
  • 진실 / 거짓 값은에 인쇄 할 수 없습니다 STDERR.
  • 표준 허점 적용
  • 이것은 이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다. 행운을 빕니다!

리더 보드

리더 보드와 언어 별 수상자 개요를 모두 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## Language Name, N bytes

여기서 N은 제출 크기 (바이트)입니다.

헤더에 여러 숫자를 포함하려면 (예를 들어, 오래된 점수를 받거나 바이트 수에 플래그 포함) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오.

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


32
불쌍한 망막 . D :
BrainSteel


8
참고 로 28 바이트 Retina 솔루션을 제안 할 수 있습니다 . (가 현재 최고의 받겠지만 골프를 치는 언어를 통해 이렇게하지 미친 장점.)
마틴 청산

5
루아의 패턴이 허용됩니까? 그들은 확실히 정규 표현식이 아닙니다.
manatwork

1
@JacobKrall 나는 당신의 모든 질문에 "거짓"이라고 확신합니다. 나는 도전하는 것이 매우 분명하다 생각 에만 형태의 문자열 \h{8}-\h{4}-\h{4}-\h{4}-\h{12}( \h16 진수 숫자입니다)이 유효합니다.
Martin Ender

답변:


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

자바 스크립트 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))

굉장한 (그리고 나를 위해 시들어) +1
edc65

@ edc65, "withering"은 무슨 뜻입니까?
Qwertiy

묵시적 캐스팅의 멋진 남용 +1
Downgoat

4
조롱, 경멸, scathing, 찌르기, 파괴, 굴욕, 치명적-(내 대답을 비교)
edc65

11

PowerShell, 29 21 84 49 37 바이트

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

TessellatingHeckler , iFreilicht , Jacob KrallJoey 와 같은 변화하는 규칙을 따라 잡기 위해이 골프를 돕고있는 의견에 감사의 말을 전합니다 . 개정판 및 이전 버전의 편집 내역을 참조하십시오.

이 개정으로의 입력을 받아 $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 객체를 정확한 값으로 출력합니다. 요청 된 챌린지 형식과 일치하는 경우에만 출력 할 수 있습니다.

여기서는 스크립트 호출을 parens로 캡슐화하고 명확성을 위해 부울로 명시 적으로 캐스팅합니다.

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 Nope, 사실 너무 좋아. 0FCE98AC-1326-4C79-8EBC-94908DA8B034D(끝의 추가 D) 와 같은 숫자를 추가 $TRUE하면 잘못된 숫자가 제거되고 처음 36자가 유효하므로 falsey를 반환 합니다.
AdmBorkBork

9

이맥스 리스프, 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

로 인해 규칙을 변경 ,이 답변이 더 이상 경쟁력이 없다 :(

C, 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

자바 스크립트 ES6, 70 83

버그를 발견하고 개선 사항을 제안하기 위해 @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를 보았습니다. 4 대신에 0을 놓쳤습니다.
edc65

1
@Stefnotch 동의하지 않습니다. every호출 외부에는 u배열이 아닌 문자열이 있습니다.
edc65

5

로 인해 규칙을 변경 ,이 답변이 더 이상 경쟁력이 없다 :(

퓨어 배쉬 (외부 유틸리티 없음), 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 정규 표현식의 정의와 구문을 확실히 사용합니다. 어쨌든, 그것이 수용 가능한지를 결정하는 것은 OP에 달려 있습니다.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ 정규식에는 Posix 문자 클래스가 포함될 수 있지만 Posix 문자 클래스를 사용하는 것은 정규식이라고 생각하지 않습니다. 다른 예로 trPosix 문자 클래스도 사용하지만 정규식 파서는 아닙니다.
Digital Trauma

쓸모없는 큰 따옴표 (예 : printf 형식)를 피함으로써 몇 개의 문자를 줄일 수 있습니다.
Jens

육각 패턴이 일치하는 UUID를 사용하지 수 있도록 정규 표현식에이 허용 된 이유는 그것을 확인했다 - 나는 명확하게 도전을 업데이 트했습니다
Jojodmo

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, false그렇지 않으면 유효한 GUID를 리턴 합니다 . 이것은 일정한 시간 유효성 검사입니다. 세 문자의 비용으로는 방법 (변경 조기 종료 할 수 있습니다 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

파이썬 2, 99112 바이트

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파이썬에서 모두 falsey 있습니다.

이 기능은 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 바이트를 저장할 수 있습니다 생각 returnprint. (이 경우 Python 3에서는 print다르게 작동 하기 때문에 Python 2에
있어야합니다.

1
파이썬 3에서는 작동하지 않습니다 map. 목록이 아닌 "맵 객체"를 반환 하기 때문 입니다.
Tim Pederick

int함수가 공백을 허용 하기 때문에 파이썬 2 (아마도 3)에서도 작동하지 않습니다 0FCE98ac-1326-4c79-8EBC-94908da8B03. 후행 공백이 있습니다. 삭제 Pyth 응답에 코멘트를 참조하십시오 여기에 수있는 경우입니다.
Blue

2

파이썬 2, 57 바이트

내장 주셔서 감사합니다! -문자열을 따옴표로 묶어야합니다.

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

5
연결 한 문서에 따르면 1input으로 인쇄 됩니다 12345678123456781234567812345678.
Dennis

이 일을하면 당신은 수행하여 바이트를 저장할 수있을 것 try:print uuid.UUID(input())필요한 것 모든 것을 당신이 truthy의 값을 출력하기 때문에
undergroundmonorail

2
이 프로그램은 많은 UUID 형식을 허용하지만 질문은 하이픈이있는 36 자 UUID 형식 만 원합니다.
Jacob Krall

2
입력 문자열이 다시 문자열로 변환 된 uuid와 같은지 확인하여 업데이트 된 규칙에 따라이를 복구 할 수 있습니다. 바로 당신에게 진실한 가치를 제공합니다.
agtoever

2

Pyth, 39 바이트

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

여기서 사용해보십시오 .


"여기에서 시도"링크에의 \문자 가 누락 K\-k되어 그대로 실행되지 않습니다.
Alex

이제 수정되었습니다
Blue

2

펄 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매개 변수가있는 함수 는 out 매개 변수를 생략하여 호출 할 수 있습니다. 반환시 그 값은 함수의 실제 반환 값과 튜플로 결합됩니다.

여기에서 튜플은 fst함수 로 파이프되어 첫 번째 멤버를 리턴합니다.이 경우에는 호출의 성공 또는 실패를 나타내는 TryParseExact의 부울 리턴 값입니다.

올바른 형식을 확인하기 위해 true문자열 길이가 36자인 경우에만 반환 합니다.

RobIII의 C # 답변을보기 전에 TryParseExact를 사용할 생각은 없었으므로 대답은 3 자 이상이어야했습니다.

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

파이썬 2, 93 89 85 바이트

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

map()호 보장 부분은 오른쪽 길이이며, 그 all()검사 하이픈 또는 임의의 경우 16 진수 하나 인 각 캐릭터. 생성기 표현식은 전체 문자열을 반복하여 각 문자를 테스트하므로 가장 성능이 좋은 방법은 아니지만 테스트 사례를 충족해야합니다.

>>> 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-이것에 대해 혼란 스러울 경우 제안 된 변경 사항을 거부하지 않았습니다 .AF 문자 (음수 사례를 테스트하는 창에서 복사)를 놓 쳤기 때문에 이미 편집했으며 커뮤니티 자동 -제안이 제기되었다는 사실을 모른 채 귀하의 제안을 거부했습니다. 내가 제안한 것을 알았을 때 @nimi는 이미 제목을 수정했습니다. 공감대와는 아무 관련이 없기를 바랍니다. 그것이이 공동체에 아주 잘 반영되지 않기 때문입니다. 어쨌든, 나는 그것이 다른 것이라고 가정하고 조금 더 설명을 추가 할 것입니다.
rsandwick3

2
블록 f=에서 문자열 주위와 공백을 제거 할 수 있습니다 all.
FryAmTheEggman

oh awesome, nice
catch-

1
all(..)포함 테스트를 설정하도록 변환하여 8 (또는 6, 괄호를 추가해야 할 수도 있음) 바이트를 절약 할 수 있습니다 set(u)<=set("-0123456789abcdefABCDEF").
409_Conflict

1

SAS, 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을 더하면 확실한 값을 얻을 수 있습니다. str.split ()으로 모든 하이픈을 제거하여 값 -1을 얻을 수없고 0이 아닌 정수는 모두 진실입니다.


1

C 함수, 102

규칙 변경 내 이전 C 허용 scanf()기반 대답을 , 그래서 여기에 또 다른 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()
  • 문자열 길이가 36이고 마지막 문자가 NUL이면 TRUE를 반환합니다.

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

/v스위치를 사용해야하므로 2 바이트가 추가되었습니다 CMD.EXE.

성공하면 ERRORLEVEL 0으로 종료하고 실패하면 1로 종료합니다.

편집 : :=대소 문자를 구분하지 않지만 다른 조정도 있었기 때문에 주로 일부 바이트를 저장했습니다 .


1

자바, 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). 인쇄 할 수 있기 때문에, truthy 값을 , 당신은 단순히 인쇄 할 수있는 0대신 1<0하고, 1대신 1>0.
Jojodmo

@Jojodmo 투표를 기준으로 진실한 가치는 다음 과 같은 형태입니다 if(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); }. Java에서 부울은 진실한 가치이지만 1그렇지 0않습니다. 도전의 영업 이익은 같은 것을 말한다 만하면 " 당신의 출력은 참 /의 거짓, 0/1, 비어있을 수 / 비어 있지 않은, 당신은 당신이 사용하는 지정할만큼. "당신이 실제로 사용 0하고 1대신 true/falsetruthy로 / falsey 값.
Kevin Cruijssen

1
쿠키에 대한 골프 팁 : @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를 사용하는 방법을 좋아합니다 , 나는 그것을 기억해야합니다! 감사합니다.
Kevin Cruijssen

1

스위프트 3, 50 바이트

문자열을 전달 s

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

1

PHP, 109 바이트

1은 true, 0은 false

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 바이트 (Thanks Wheat Wizard)

java.util.UUID를 사용한 이후 Kinda cheaty는 다음과 같습니다.

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. 또한, 교체 할 수 있어야 printlnprint.
clismique

1
클래스 이름은 1 자일 수 있습니다. java.util.UUID.fromString가져 오는 대신 사용할 수 있습니다 .
Poke

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

모든 문자에서 행을 간단히 분할하고 각 문자가 16 진수인지, 적절한 위치에 하이픈이 있는지 확인합니다. strtonum유효하지 않은 문자를로 변환합니다 0. 사이의 비교 만들기 0m(과 임의로 선택 잘못된 문자) 추가 단계가 필요합니다. 운 좋게도 01올바른 16 진수이지만 m1그렇지 않습니다.

처음에는 두 개의 for루프를 작성했지만 함께 압축하여 1 바이트를 절약했습니다. :)

참고 : GAWK16 진수로 입력을 읽을 수 있지만 매우 긴 명령 행 옵션이 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.