Diberikan input string, tulis sebuah program yang mencetak nilai kebenaran ke STDOUT atau setara jika inputnya adalah UUID yang valid, tanpa menggunakan regex.
UUID yang valid adalah
32 digit heksadesimal, ditampilkan dalam lima kelompok yang dipisahkan oleh tanda hubung, dalam bentuk 8-4-4-4-12 untuk total 36 karakter (32 karakter alfanumerik dan empat tanda hubung).
Uji Kasus
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)
Aturan
- Ekspresi Reguler tidak diizinkan
- Pencocokan pola literal yang seperti regex tidak diizinkan. Misalnya, menggunakan
[0-9a-fA-F]
atau pengidentifikasi heksadesimal lainnya (kami akan menyebutnyan
) dan kemudian cocoknnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn
ataun[8]-n[4]-n[4]-n[4]-n[12]
tidak diizinkan - Input dapat diambil dari
STDIN
atau sebagai argumen ke suatu fungsi - Input tidak sensitif huruf
- Aman untuk berasumsi bahwa input tidak akan mengandung umpan baris atau baris baru.
- Input dapat berisi karakter ASCII yang dapat dicetak (termasuk spasi)
- Nilai kebenaran harus dicetak ke
STDOUT
atau setara jika inputnya adalah uuid yang valid - Nilai kepalsuan harus dicetak
STDOUT
atau setara jika inputnya bukan uuid yang valid - Jika menggunakan fungsi, alih-alih menggunakan
STDOUT
, output bisa menjadi nilai balik dari fungsi - Nilai truthy / falsey tidak bisa dicetak
STDERR
. - Celah standar berlaku
- Ini adalah kode-golf , jadi program terpendek dalam byte menang. Semoga berhasil!
Papan peringkat
Ini adalah Stack Snippet yang menghasilkan leaderboard dan ikhtisar pemenang berdasarkan bahasa.
Untuk memastikan jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama menggunakan templat Penurunan harga berikut
## Language Name, N bytes
Di mana N adalah ukuran, dalam byte, dari kiriman Anda
Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (misalnya, mencoret skor lama, atau menyertakan bendera dalam jumlah byte), pastikan saja skor sebenarnya adalah angka terakhir di tajuk Anda
## Language Name, <s>K</s> X + 2 = N bytes
sumber
\h{8}-\h{4}-\h{4}-\h{4}-\h{12}
(di mana\h
digit heksadesimal) yang valid.Jawaban:
CJam,
313029 byteJalankan semua test case di sini.
Penjelasan
Alih-alih pola yang cocok dengan input secara langsung, kami pertama-tama mengubahnya menjadi bentuk yang lebih sederhana yang dapat dengan mudah dibandingkan dengan string pola tunggal.
sumber
JavaScript ES6,
735556 karakterVersi 55 karakter sebelumnya memiliki masalah dengan spasi tambahan dalam grup:
Uji:
sumber
PowerShell,
2921844937 BytesTerima kasih banyak kepada orang-orang di komentar yang membantu bermain golf ini untuk mengikuti aturan yang berubah - TessellatingHeckler , iFreilicht , Jacob Krall , dan Joey . Silakan lihat riwayat edit untuk revisi dan versi yang lebih lama.
Revisi ini mengambil input sebagai
$g
, kemudian membuat tabel hash baru@{}
dengan satu elemen, indeks36
diset sama dengan$g-as[guid]
. Ini menggunakan-as
operator bawaan untuk mencoba konversi antara dua tipe data .NET - dari[string]
hingga[guid]
. Jika konversi berhasil,[guid]
objek dikembalikan, yang lain$null
dikembalikan. Bagian ini memastikan bahwa string input adalah .NET GUID yang valid.Langkah selanjutnya adalah mengindeks ke tabel hash dengan
[$g.length]
. Jika$g
panjangnya tidak tepat 36 karakter, tabel hash akan kembali$null
, yang akan ditampilkan sebagai nilai falsey. Jika$g
panjangnya 36 karakter, maka hasil dari panggilan .NET akan ditampilkan. Jika$g
bukan .NET GUID yang valid (dalam bentuk apa pun), maka akan ditampilkan$null
sebagai nilai falsey. Jika tidak maka akan menampilkan objek .NET GUID sebagai nilai kebenaran - satu-satunya cara yang bisa dihasilkan adalah jika cocok dengan format tantangan yang diminta.Contohnya
Di sini saya merangkum panggilan skrip dalam parens dan secara eksplisit casting sebagai Boolean untuk kejelasan.
sumber
!!($args[0]-as[guid])
21 byte.!!()
? Sebagai nilai-nilai$NULL
dan[guid]
saling eksklusif, mereka memenuhi syarat untuk mewakili nilai-nilai yang sebenarnya dan palsu, bukan? Bagaimanapun, cara yang bagus untuk mengonversi ke boolean, cinta solusinya!True
untuk0FCE98AC13264C798EBC94908DA8B034
, yang tidak memiliki tanda hubung0FCE98AC-1326-4C79-8EBC-94908DA8B034D
(tambahan D di akhir) mengembalikan falsey$TRUE
, karena hanya memotong digit yang menyinggung dan 36 karakter pertama valid.Emacs Lisp, 236 Bytes
Tidak Disatukan:
sumber
Karena perubahan pada aturan , jawaban ini tidak lagi kompetitif :(
C, 98
Sebagian besar cukup jelas. The
%n
Format specifier memberikan jumlah byte yang dibaca sejauh ini, yang harus 36.scanf()
pengembalian jumlah item yang cocok, yang harus 6. akhir%c
harus tidak cocok apa-apa. Jika ya, maka ada teks tambahan, danscanf()
akan mengembalikan 7.Kompilasi dengan
-w
untuk menekan peringatan sial (ada beberapa).sumber
JavaScript ES6, 70
83CATATAN thx to @Qwertiy untuk menemukan bug (dan menyarankan beberapa perbaikan dan perbaikan)
Thx @ CᴏɴᴏʀO'Bʀɪᴇɴ 2 byte disimpan
9 byte lainnya disimpan simplifiying cek panjang (jalan kompleks itu lebih pendek dalam draft pertama, tapi tidak sekarang)
Dijelaskan
Cuplikan tes
sumber
-1-('0x'+h)
=>1/('0x'+h)
00000000-0000-0000-000 -000000000000
every
panggilanu
adalah string, bukan arrayKarena perubahan pada aturan , jawaban ini tidak lagi kompetitif :(
Bash Murni (tanpa utilitas eksternal), 78
Mengambil input dari baris perintah.
printf
membangun string berikut- - - -
.p=
baris mengubah ini untuk pola berikut:[[: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:]]
. Perhatikan ini terlihat sangat mirip dengan ekspresi reguler. Namun, tidak dalam konteks ini. Ini adalah pola untuk pencocokan pola shell . Ini mirip dalam konsep dengan ekspresi reguler, tetapi merupakan konstruk yang berbeda (dan sintaksis).Idiomatik ke shell, kode pengembalian 0 menunjukkan keberhasilan / BENAR dan 1 menunjukkan kegagalan / SALAH. Kode kembali dapat diperiksa
echo $?
setelah menjalankan skrip.sumber
tr
juga menggunakan kelas karakter Posix, tetapi bukan pengurai regex.Jolf, 32 byte
Coba di sini!
Karena kesalahan dalam kode saya, ini lebih lama dari yang seharusnya. :(
[8,4,4,4,12]
harus sama dengan{8444*26}
, tetapi}
juga merupakan penutupan fungsi: Psumber
MATL , 55 byte
Saya menahan diri untuk tidak menggunakan
Yb
function (strsplit
) karena agak miripregexp(..., 'split')
. Ini hanya menggunakan pengindeksan dan perbandingan karakter.Contoh
Penjelasan
sumber
CJam,
5242 byteCobalah online . Keluarkan string asli jika benar, menghasilkan string kosong jika salah ( ini diizinkan ).
Penjelasan:
sumber
A7*)<
tidak akan menghapus banyak karakter yang tidak valid, seperti spasi+
,,?
...Julia, 86 byte
Ini adalah fungsi anonim yang menerima string dan mengembalikan boolean. Untuk menyebutnya, berikan nama, mis
f=s->...
.Tidak Disatukan:
sumber
C # 196 byte
Tidak Disatukan:
Metode
T
dapat dipanggil dengan string non-null dan akan kembalitrue
untuk GUID yang valid,false
jika tidak. Ini adalah validasi waktu-konstan; dengan biaya tiga karakter Anda dapat keluar dari metode lebih awal (ubahi < v.Length
kei < v.Length && r
).Akan mencoba untuk mendapatkan bytecount lebih jauh nanti.
Saya jelas telah meninggalkan
Guid.ParseExact
jalan karena di mana kesenangan dalam itu? Ini dia, tanpa banyak usaha untuk menurunkannya lebih jauh dalam 86 byte :Tidak Disatukan:
sumber
Python 2,
99112 bytePada input yang valid, ia mencetak
True
. Pada input yang tidak valid ia mencetakFalse
atau0
, tergantung pada mengapa itu tidak valid.False
dan0
keduanya falsey dalam Python.Fungsi harus memeriksa 3 hal:
ABCDEF
Berikut ini rincian untuk menunjukkan bagaimana memeriksa mereka. Agak ketinggalan zaman tapi saya lapar jadi saya akan memperbaruinya nanti.
sumber
return
denganprint
. (Dalam hal ini Anda pasti ingin berada di Python 2, karenaprint
bekerja secara berbeda dalam Python 3.)map
sekarang mengembalikan "objek peta", bukan daftar.int
fungsinya memungkinkan spasi -0FCE98ac-1326-4c79-8EBC-94908da8B03
dengan spasi tambahan. Lihat komentar dalam jawaban Pyth yang dihapus di sini jika bisa.Python 2, 57 byte
Syukurlah untuk built-in! - pastikan untuk menyertakan string dalam tanda kutip.
sumber
1
untuk input12345678123456781234567812345678
.try:print uuid.UUID(input())
karena yang diperlukan hanyalah Anda mencetak nilai yang sebenarnyaPyth, 39 byte
Coba di sini .
sumber
\
karakterK\-k
, jadi gagal berjalan seperti apa adanya.Perl 6 ,
8367 byte(Hitungan tidak termasuk baris baru atau indentasi karena mereka tidak diperlukan)
pemakaian:
sumber
Gangguan Umum - 161
Nilai yang dikembalikan jika true adalah hash, sebagai angka, yang merupakan hasil yang berguna untuk dimiliki.
Tidak disatukan
sumber
F # 44 karakter
Dalam F #, fungsi dengan
out
parameter dapat dipanggil dengan menghilangkan parameter keluar; nilainya pada pengembalian akan dikombinasikan dengan nilai pengembalian sejati fungsi menjadi tupel.Di sini, tuple disalurkan ke
fst
fungsi, yang mengembalikan anggota pertamanya, yang dalam hal ini adalah nilai pengembalian Boolean dari TryParseExact, yang menunjukkan keberhasilan atau kegagalan panggilan.Sebagai tanda centang untuk format yang benar, kami kembali
true
hanya jika string sepanjang 36 karakter.Sebelum saya melihat jawaban C # RobIII, saya tidak pernah berpikir untuk menggunakan TryParseExact, jadi jawaban saya adalah tiga karakter lebih lama:
TryParse(string, Guid)
menerima input dalam format berikut:Dari jumlah tersebut, hanya yang kedua adalah 36 karakter.
sumber
Python 2,
938985 byteThe
map()
jaminan panggilan itu bagian adalah dari panjang yang tepat, danall()
tes masing-masing karakter untuk menjadi baik tanda hubung atau sewenang-wenang-kasus hex digit. Ekspresi generator sedang menguji masing-masing karakter dengan mengulangi seluruh string itu, jadi itu bukan metode yang paling performan, saya rasa, tapi itu harus memenuhi kasus uji:sumber
f=
dan spasi di sekitar string diall
blok.all(..)
untuk mengatur pengujian inklusi:set(u)<=set("-0123456789abcdefABCDEF")
.SAS,
171144141Sebenarnya menggunakan stdin dan stdout - salah satu fitur yang kurang dikenal dari bahasa khusus ini. Bekerja untuk contoh-contoh yang diberikan sejauh ini, tetapi mungkin tidak dalam semua kasus. Mungkin bisa diperbaiki.
Pendekatan yang lebih baik - satu karakter pada satu waktu:
Dipotong 6 karakter lain dari ekspresi sentral!
Tidak Disatukan:
Ini menghasilkan beberapa peringatan dan catatan di log, tetapi tidak mencetaknya ke stdout atau stderr, jadi saya pikir ini adalah permainan yang adil.
sumber
C, 391 byte
sumber
MATLAB, 126 byte
sumber
Python 3, 134 byte
int (k, 16) mencoba untuk melemparkan k ke basis-16 int. Pada karakter selain 0-9a-fA-F- gagal, dalam hal ini kita mengembalikan 0, yang salah. Tambahkan 1 ke int itu dan kami mendapatkan nilai kebenaran yang dijamin - kami telah menghapus semua tanda hubung dengan str.split () sehingga kami tidak bisa mendapatkan nilai -1 dan semua int non-0 benar.
sumber
Fungsi C, 102
Perubahan aturan dianulir c saya sebelumnya
scanf()
jawabannya berbasis , jadi di sini lain jawaban c menggunakanisxdigit()
yang saya pikir harus diizinkan untuk bersaing :Cobalah online.
-
karakter (ASCII 45) di posisi yang relevan - jika demikian, ganti dengan0
s (ASCII 48 (= 45 + 3))isxdigit()
sumber
Batch,
148139 + 2 =150141 byteMenambahkan 2 byte karena Anda perlu menggunakan
/v
peralihan keCMD.EXE
.Keluar dengan ERRORLEVEL 0 pada kesuksesan, 1 pada kegagalan.
Sunting: Disimpan beberapa byte terutama karena
:=
case-sensitive tetapi ada tweak lain juga.sumber
Java, 345 byte
Input adalah argumen baris perintah pertama. Output adalah kode kesalahan (0 berarti UUID valid, 1 berarti tidak valid)
Tidak dikoleksi dengan komentar:
EDIT: Tidak melihat bagian STDOUT. Ups, perbaiki sekarang.
sumber
if(b.length>36||b.length<36)
dengan sederhanaif(b.length!=36)
. Juga, karena Anda bisa mencetak nilai-nilai yang sebenarnya , Anda bisa mencetak0
bukan1<0
, dan1
bukannya1>0
.if(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); }
Jadi di Jawa, boolean adalah nilai kebenaran, tetapi ada1
atau0
tidak. Hanya ketika OP dari suatu tantangan mengatakan sesuatu seperti: " Output Anda bisa benar / salah, 0/1, kosong / tidak kosong; selama Anda menentukan apa yang Anda gunakan. " Maka Anda memang dapat menggunakan0
dan1
bukannyatrue/false
sebagai kebenaran / nilai falsey.if(b.length!=36)
;||
bisa|
di banyak tempat, juga&&
untuk&
;if(...!='-')
bisaif(...!=45)
;int i=-1; ... while(++i<b.length){
dapat diganti denganfor(int i=-1;++i<b.length;){
;'F'
bisa70
('f'
bisa 102, tapi itu tidak masalah karena itu adalah byte-count yang sama). Saya suka bagaimana Anda menggunakanjava.io.PrintStream u=System.out;
btw, saya harus ingat itu! Jadi terima kasih.Swift 3, 50 byte
Lewati sebuah string
s
sumber
PHP, 109 Bytes
mencetak 1 untuk true dan 0 untuk false
$i>7&$i<24&!($i%5-3)
lebih pendek 5 Bytesin_array($i,[8,13,18,23])
112 Bytes
113 Bytes
sumber
Java,
172 byte168 byte (Terima kasih Wheat Wizard)Agak curang sejak saya menggunakan java.util.UUID, tapi begini:
Versi tidak disatukan:
sumber
try
dan{
.String[]
dana
. Anda juga harus bisa menggantinyaprintln
denganprint
.java.util.UUID.fromString
alih-alih mengimpor.AWK, 98 byte
Cukup pisahkan garis pada setiap karakter dan periksa apakah setiap karakter adalah angka heks dan ada tanda hubung di tempat yang sesuai.
strtonum
mengkonversi karakter yang tidak valid ke0
. Membuat perbandingan antara0
danm
(dan karakter tidak sah yang dipilih secara sewenang-wenang) memerlukan langkah-langkah tambahan. Untungnya01
adalah nomor hex yang valid, tetapim1
tidak.Awalnya saya menulis dua
for
loop, tetapi saya menghemat 1 byte dengan meremasnya. :)CATATAN:
GAWK
dapat membaca input sebagai angka hex, tetapi ini membutuhkan opsi baris perintah yang sangat panjang.sumber