ตรวจสอบว่า UUID ถูกต้องโดยไม่ต้องใช้ regexes


44

รับอินพุตสตริงเขียนโปรแกรมที่พิมพ์ค่าความจริงเป็น STDOUT หรือเทียบเท่าหากอินพุตเป็น UUID ที่ถูกต้องโดยไม่ต้องใช้ regexes

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)

กฎระเบียบ

  • ไม่อนุญาตให้ใช้นิพจน์ทั่วไป
  • ไม่อนุญาตการจับคู่รูปแบบตัวอักษรที่เหมือน regex ตัวอย่างเช่นการใช้[0-9a-fA-F]หรือตัวระบุเลขฐานสิบหกอื่น ๆ (เราจะเรียกสิ่งนี้ว่าn) และจากนั้นการจับคู่nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnnหรือn[8]-n[4]-n[4]-n[4]-n[12]ไม่ได้รับอนุญาต
  • อินพุตอาจถูกนำมาจากSTDINหรือเป็นอาร์กิวเมนต์ของฟังก์ชัน
  • อินพุตไม่คำนึงถึงขนาดตัวพิมพ์
  • มีความปลอดภัยที่จะสมมติว่าอินพุตจะไม่มี linefeeds หรือบรรทัดใหม่
  • อินพุตอาจมีอักขระ ASCII ที่พิมพ์ได้ (รวมช่องว่าง)
  • ค่า truthy ต้องพิมพ์ไปSTDOUTหรือเทียบเท่าถ้าใส่เป็น UUID ที่ถูกต้อง
  • ค่า falsey ต้องพิมพ์ไปSTDOUTหรือเทียบเท่าถ้าใส่เป็นไม่ UUID ที่ถูกต้อง
  • หากใช้ฟังก์ชันแทนที่จะใช้STDOUTเอาต์พุตจะเป็นค่าส่งคืนของฟังก์ชัน
  • ค่า truthy / falsey STDERRไม่สามารถพิมพ์
  • ช่องโหว่มาตรฐานใช้
  • นี่คือดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ โชคดี!

ลีดเดอร์บอร์ด

นี่คือตัวอย่างสแต็กที่สร้างทั้งกระดานผู้นำและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยบรรทัดแรกโดยใช้เทมเพลต Markdown ต่อไปนี้

## Language Name, N bytes

โดยที่ N คือขนาดไบต์ของการส่งของคุณ

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (ตัวอย่างเช่นการดูผ่านคะแนนเก่าหรือรวมถึงการตั้งค่าสถานะในจำนวนไบต์) เพียงตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นจำนวนสุดท้ายในส่วนหัวของคุณ

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


32
แย่Retina D:
BrainSteel


8
สำหรับการอ้างอิงฉันสามารถหาวิธีแก้ปัญหาเรติ 28 นิ้ว (ดังนั้นจึงไม่ใช่ข้อได้เปรียบเหนือภาษากอล์ฟถึงแม้ว่ามันจะเป็นผู้นำ)
Martin Ender

5
รูปแบบของ Lua ได้รับอนุญาตหรือไม่ แน่นอนว่ามันไม่ใช่การแสดงออกปกติ
จัดการ

1
@JacobKrall ฉันค่อนข้างแน่ใจว่ามันเป็น "เท็จ" สำหรับทุกคำถามของคุณ ฉันคิดว่าความท้าทายค่อนข้างชัดเจนว่ามีเพียงสตริงของแบบฟอร์ม\h{8}-\h{4}-\h{4}-\h{4}-\h{12}(ซึ่ง\hเป็นเลขฐานสิบหกหลัก) ที่ถูกต้อง
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

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))

ยอดเยี่ยม (และเหี่ยวแห้งสำหรับฉัน) +1
edc65

@ edc65 คุณหมายถึงอะไรโดย "withering"?
Qwertiy

การละเมิดที่น่ากลัวของการคัดเลือกโดย
อ้อม

4
ดูถูกเหยียดหยามดูหมิ่นแสบลิ้นทำลายล้างอัปยศอัปยศ - (เปรียบเทียบคำตอบของคุณกับฉัน)
edc65

11

PowerShell, 29 21 84 49 37 Bytes

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

ขอบคุณมากที่คนในความคิดเห็นที่ให้ความช่วยเหลือกับการเล่นกอล์ฟนี้เพื่อให้ทันกับการเปลี่ยนแปลงกฎ - TessellatingHeckler , iFreilicht , จาค็อบครัลล์และโจอี้ โปรดดูประวัติการแก้ไขสำหรับการแก้ไขและรุ่นที่เก่ากว่า

การแก้ไขนี้จะเข้าเป็น$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 และนำแสดงโดย Boolean เพื่อความชัดเจน

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]ไม่เกิดร่วมกันพวกเขามีคุณสมบัติที่จะเป็นตัวแทนของค่าความจริงและความเท็จไม่ใช่หรือไม่? อย่างไรก็ตามวิธีที่ยอดเยี่ยมในการแปลงเป็นบูลีนรักโซลูชัน!
iFreilicht

@iFreilicht นั่นคือจุด; ดูโพสต์ "การตีความความจริง / การตีความเท็จ" ที่เชื่อมโยง - ฉันเห็นด้วยว่ามันดูถูกต้อง
TessellatingHeckler

1
การแก้ปัญหานี้ไม่ถูกต้องส่งกลับTrueสำหรับ0FCE98AC13264C798EBC94908DA8B034ซึ่งไม่มียัติภังค์
จาค็อบครัลล์

1
@TessellatingHeckler Nope ดีเกินกว่าที่จะเป็นจริงได้ การต่อท้ายตัวเลขเช่น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))))))

Ungolfed:

(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

JavaScript 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 ฉันพลาดศูนย์ 3 ตัวแทนที่จะเป็น 4
edc65

1
@tefnotch ฉันไม่เห็นด้วย ข้างนอกการ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:]]หมายเหตุนี่ดูเยอะมากเหมือนนิพจน์ทั่วไป อย่างไรก็ตามมันไม่ได้อยู่ในบริบทนี้ มันเป็นรูปแบบสำหรับการจับคู่แบบเปลือก นี่เป็นแนวคิดที่คล้ายกับนิพจน์ทั่วไป แต่มีโครงสร้างที่แตกต่างกัน (และไวยากรณ์)
  • บรรทัดสุดท้ายตรวจสอบว่า
    • อินพุตไม่ว่างเปล่า
    • หากดึงรูปแบบออกจากสายป้อนจะสร้างสตริงว่าง

Idiomatic to shell, โค้ดส่งคืน 0 หมายถึงสำเร็จ / TRUE และ 1 หมายถึงความล้มเหลว / FALSE รหัสส่งคืนอาจถูกตรวจสอบด้วยecho $?หลังจากเรียกใช้สคริปต์


1
การจับคู่รูปแบบเชลล์อาจไม่เป็นไปตามไวยากรณ์ของ regex แต่คลาสอักขระใช้การกำหนดและไวยากรณ์จาก POSIX regex อย่างแน่นอน อย่างไรก็ตามมันขึ้นอยู่กับ OP เพื่อตัดสินใจว่ามันเป็นที่ยอมรับหรือไม่
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ นิพจน์ทั่วไปอาจรวมถึงคลาสอักขระ Posix แต่ฉันไม่คิดว่าจะมีความหมายว่าสิ่งใดก็ตามที่ใช้คลาสอักขระ Posix จะเป็น regex เป็นอีกตัวอย่างหนึ่งที่trใช้คลาสอักขระ Posix แต่ไม่ใช่ parser ของ regex
Digital Trauma

คุณสามารถโกนหนวดได้สองสามตัวโดยหลีกเลี่ยงการใส่เครื่องหมายคำพูดคู่คู่ที่ไม่มีประโยชน์เช่นในรูปแบบ printf
Jens

ฉันได้อัปเดตความท้าทายเพื่อชี้แจง - เหตุผลที่ไม่อนุญาตให้ใช้ regexes คือทำให้รูปแบบฐานสิบหกไม่สามารถใช้จับคู่ uuids ได้
Jojodmo

4

Jolf, 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*)<จะไม่ลบอักขระที่ไม่ถูกต้องจำนวนมากเช่นช่องว่าง+, ?...
Martin Ender

@ MartinBüttnerโอ้ยิง ... ฉันไม่ได้ตระหนักว่าฉันจะแก้ไขได้ภายในไม่กี่นาที
GamrCorps

3

Julia, 86 ไบต์

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

นี่เป็นฟังก์ชั่นนิรนามที่ยอมรับสตริงและส่งคืนบูลีน f=s->...เรียกว่าให้มันชื่อเช่น

Ungolfed:

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;}}

Ungolfed:

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สามารถเรียกใช้เมธอดด้วยสตริงที่ไม่ใช่ค่า null และจะส่งคืนtrueค่า GUID ที่ถูกต้องfalseมิฉะนั้น นี่เป็นการตรวจสอบความถูกต้องคงที่ ด้วยค่าใช้จ่ายสามตัวอักษรคุณสามารถออกจากวิธีการก่อนกำหนดได้ (เปลี่ยนi < v.Lengthเป็นi < v.Length && r)

จะพยายามทำให้ bytecount ลดลงในภายหลัง

เห็นได้ชัดว่าฉันหลงGuid.ParseExactทางเพราะความสนุกในนั้นอยู่ที่ไหน นี่มันเป็นโดยไม่ต้องพยายามมากที่จะเล่นกอล์ฟมันลงต่อไปใน86 ไบต์ :

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

Ungolfed:

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ทั้งคู่ก็โกหกใน Python

ฟังก์ชันมีการตรวจสอบ 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ตอนนี้ส่งคืน "map object" ไม่ใช่รายการ
ทิม Pederick

สิ่งนี้ใช้ไม่ได้กับงูหลาม 2 (อาจเป็น 3 ด้วย) เพราะintฟังก์ชั่นอนุญาตให้มีช่องว่าง - 0FCE98ac-1326-4c79-8EBC-94908da8B03ด้วยช่องว่างต่อท้าย ดูความคิดเห็นในคำตอบ Pyth ที่ถูกลบที่นี่ถ้าทำได้
Blue

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 จำนวนมาก แต่คำถามนั้นต้องการรูปแบบ UUID ที่มีความยาว 36 ตัวอักษรพร้อมยัติภังค์
Jacob Krall

2
คุณสามารถกอบกู้สิ่งนี้, จัดการกับกฎที่อัพเดต, โดยตรวจสอบว่าสตริงอินพุตเท่ากับ uuid ที่แปลงกลับเป็นสตริงหรือไม่ ให้คุณค่าความจริงแก่คุณทันที
agtoever


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))))

ค่าที่ส่งคืนถ้าเป็นจริงคือแฮชเป็นตัวเลขซึ่งเป็นผลลัพธ์ที่มีประโยชน์ที่จะมี

Ungolfed

(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 ค่าที่ส่งคืนจะถูกรวมกับค่าส่งคืนที่แท้จริงของฟังก์ชันใน tuple

ที่นี่ tuple ถูกไพพ์ไปที่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 - ในกรณีที่มีความสับสนเกี่ยวกับเรื่องนี้ฉันไม่ได้ปฏิเสธการเปลี่ยนแปลงที่เสนอของคุณ - ฉันได้ทำการแก้ไขแล้วเพราะฉันพลาดตัวละคร AF (ฉันคัดลอกจากหน้าต่างที่ฉันทดสอบกรณีลบ) และชุมชนอัตโนมัติ - ปฏิเสธข้อเสนอของคุณโดยที่ฉันไม่รู้ว่ามันถูกยกขึ้นมาด้วยซ้ำ ตามเวลาที่ฉันรู้ว่าคุณเสนอมัน @nimi ได้ทำการแก้ไขหัวข้อแล้ว ฉันหวังเป็นอย่างยิ่งว่าจะไม่เกี่ยวข้องกับการโหวตเพราะนั่นจะสะท้อนให้เห็นถึงคุณภาพของชุมชนนี้ อย่างไรก็ตามฉันจะถือว่าเป็นอีกสิ่งหนึ่งและเพิ่มคำอธิบายเพิ่มเติมอีกเล็กน้อย
rsandwick3

2
คุณสามารถลบf=และช่องว่างรอบ ๆ สตริงในallบล็อก
FryAmTheEggman

โอ้ยอดเยี่ยมจับได้ดี - แก้ไข
rsandwick3

1
คุณสามารถบันทึก 8 (หรือ 6 คุณอาจต้องเพิ่มวงเล็บ) ไบต์โดยการแปลงของคุณกับการทดสอบการรวมชุด:all(..) 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;

Golfed อีก 6 ตัวละครออกจากการแสดงออกที่เป็นศูนย์กลาง!

Ungolfed:

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

Python 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 นั้นและเราจะได้รับค่าความจริงที่รับประกันได้ - เราได้ตัดการใส่เครื่องหมายยัติภังค์ทั้งหมดด้วย str.split () ดังนั้นเราจึงไม่สามารถรับค่า -1 และ int-0 ที่ไม่ใช่ทั้งหมดนั้นเป็นความจริง


1

ฟังก์ชัน C, 102

การเปลี่ยนแปลงกฎไม่อนุญาตให้scanf()ใช้คำตอบแบบc- based ก่อนหน้านี้ดังนั้นนี่เป็นคำตอบอีกข้อหนึ่งที่ใช้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 ไบต์เพราะคุณจำเป็นต้องใช้สวิทช์ไป/vCMD.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)นอกจากนี้เนื่องจากคุณสามารถพิมพ์ค่า truthyคุณก็สามารถพิมพ์0แทน1<0และแทน1 1>0
Jojodmo

@Jojodmo บนพื้นฐานของการโหวตค่าความจริงอยู่ในรูปแบบของif(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); }ดังนั้นใน Java บูลีนเป็นค่าความจริง แต่1หรือ0ไม่ เฉพาะเมื่อ OP ของความท้าทายกล่าวว่าสิ่งที่ชอบ: " การส่งออกของคุณสามารถ / เท็จจริง 0/1 ว่าง / ไม่ว่างเปล่าตราบเท่าที่คุณระบุสิ่งที่คุณใช้. " แล้วคุณแน่นอนสามารถใช้0และ1แทนที่จะtrue/falseเป็น truthy / falsey value
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

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 ไบต์ (ขอบคุณ Wheat Wheat Wizard)

kinda cheaty ตั้งแต่ฉันใช้ 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
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

เพียงแยกบรรทัดที่ตัวละครทุกตัวและตรวจสอบว่าตัวละครแต่ละตัวนั้นเป็นเลขฐานสิบหกและมีเครื่องหมายขีดกลางที่ตำแหน่งที่เหมาะสมหรือไม่ แปลงตัวอักษรที่ไม่ถูกต้องstrtonum 0การทำการเปรียบเทียบระหว่าง0และm(และอักขระที่ไม่ถูกต้องที่เลือกไว้โดยพลการ) ต้องการขั้นตอนเพิ่มเติม โชคดีที่01เป็นเลขฐานสิบหกที่ถูกต้อง แต่m1ไม่ใช่

ตอนแรกฉันเขียนสองforลูป แต่ฉันบันทึก 1 ไบต์ด้วยการบีบมันเข้าด้วยกัน :)

หมายเหตุ: GAWKสามารถอ่านอินพุตเป็นตัวเลขฐานสิบหก แต่ต้องใช้ตัวเลือกบรรทัดคำสั่งที่ยาวมาก

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