Menerapkan fungsi pola dan string yang akan dicocokkan, mengembalikan true jika pola cocok dengan string WHOLE, jika tidak palsu.
Sintaks pola glob kami adalah:
?
cocok dengan satu karakter+
cocok dengan satu atau lebih karakter*
cocok dengan nol atau lebih karakter\
lolos
Aturan:
- Tidak ada eval, tidak ada konversi menjadi ekspresi reguler, tidak ada panggilan fungsi sistem glob.
- I / O tidak diperlukan: Anda cukup menulis fungsi
- Kemenangan terpendek
Contoh:
glob('abc', 'abc') => true
glob('abc', 'abcdef') => false IMPORTANT!
glob('a??', 'aww') => true
glob('a*b', 'ab') => true
glob('a*b', 'agwijgwbgioeb') => true
glob('a*?', 'a') => false
glob('?*', 'def') => true
glob('5+', '5ggggg') => true
glob('+', '') => false
glob('a\*b', 'a*b') => true
Berikut ini tip untuk memulai: http://en.wikipedia.org/wiki/Backtracking
code-golf
interpreter
regular-expression
Ming-Tang
sumber
sumber
Jawaban:
Golfscript - 82 karakter
Asumsikan bahwa tidak ada baris baru di string. Mengembalikan array kosong untuk false, dan array tidak kosong untuk true (konsisten dengan definisi skrip golf true / false).
Ini adalah solusi non-rekursif (kecuali untuk berturut-turut
*
), yang memelihara daftar posisi dalam string polai
sedemikian rupa sehinggapattern[0..i]
cocokstring[0..cur]
.Ini memiliki potensi untuk berjalan untuk waktu yang sangat lama. Anda dapat menambahkan
.&
setelah:C%
untuk mencegah ini.sumber
Haskell, 141 karakter
Berfungsi untuk semua input, baik pola dan string yang cocok. Menangani trailing backslash dalam pola sebagai kecocokan literal (perilaku tidak ditentukan.)
Ini dapat dijalankan dengan driver tes berikut:
Pembaruan: Saya menulis posting blog tentang jawaban khusus ini, karena saya pikir itu menunjukkan dengan baik bagaimana Haskell dengan mudah mengkodekan masalah.
d
danm
dengan operatorr
dalamc
+
kasus ini%
, yang ditangani oleh&
sumber
PHP -
275243 karakterTidak Disatukan:
sumber
Overly Verbose Python (
384367 Karakter)Ini bukan yang terpendek, tapi itu bagus dan fungsional. Hal dict pengiriman di tengah mungkin bisa ditulis ulang sebagai disjungsi atas
(h(p) == '?') and (? lambda body)
hal-hal jenis. Menentukan bahwa operator h membebani saya beberapa karakter tanpa manfaat, tetapi menyenangkan untuk memiliki kata kunci untuk kepala.Saya ingin memiliki celah di skrip golf nanti jika waktu mengizinkan.
sunting: menghapus cabang ketiga yang tidak perlu dalam kasus '*' setelah membaca jawaban ruby user300
sumber
Snappier Python 2.6 (272 karakter), Shorter
golf:
ungolfed:
menampilkan:
kredit untuk jawaban user300 untuk menggambarkan bagaimana hal-hal disederhanakan jika Anda bisa mendapatkan semacam nilai terminator ketika muncul kepala dari string kosong.
Saya berharap kepala / ekor membongkar dapat dilakukan inline selama deklarasi argumen m. maka m bisa menjadi lambda, sama seperti teman-temannya n dan glob. python2 tidak bisa melakukannya, dan setelah sedikit membaca, sepertinya python3 juga tidak bisa. duka.
pengujian:
sumber
Ruby -
199171Tidak Disatukan:
Tes:
Terinspirasi oleh jawaban roobs
sumber
lambda s : list(s)+[None]
??
karakter literal,=>
pemisah kunci / nilai dalam Ruby Hash, dan->
memulai lambda :-) ({ ?? => ->{...} }
adalah hash dengan kunci"?"
dan lambda sebagai nilai.) Tapi ya cara penggunaannya yang sama terlihat seperti pencocokan pola pada karakter tunggal :-)Fungsi C - 178 karakter yang diperlukan
Dikompilasi dengan GCC, ini tidak menghasilkan peringatan.
Baris pertama dan terakhir tidak termasuk dalam jumlah karakter. Mereka disediakan hanya untuk kenyamanan.
Diledakkan:
sumber
JavaScript - 259 karakter
Implementasi saya sangat rekursif, sehingga tumpukan akan meluap jika pola yang sangat panjang digunakan. Mengabaikan tanda plus (yang bisa saya optimalkan tetapi memilih untuk tidak kesederhanaan), satu tingkat rekursi digunakan untuk setiap token.
Fungsi ini terkadang mengembalikan nomor alih-alih boolean. Jika itu masalah, Anda dapat menggunakannya sebagai
!!glob(pattern, str)
.Tidak digabungkan (tidak ditambang, lebih tepatnya) untuk berfungsi sebagai sumber daya yang berguna:
Perhatikan bahwa pengindeksan ke karakter string sebagai untuk elemen array bukan bagian dari standar bahasa yang lebih lama (ECMAScript 3), jadi itu mungkin tidak berfungsi di browser lama.
sumber
Python (454 karakter)
sumber
D: 363 Karakter
Lebih Jelas:
sumber
skrip golf
itu dibangun dari fungsi yang mengkonsumsi dua argumen dari stack, s dan p, dan menghasilkan nilai balik boolean tunggal. ada sedikit mucking untuk membuat yang kompatibel dengan operator dan malas. Saya sangat meragukan pendekatan ini mendekati optimal, atau bahkan ke arah yang benar.
ada juga beberapa momen bodoh yang menghibur, seperti muncul
'*'
pola, mengkonsumsi'*'
dalam perbandingan, hanya untuk menyadari bahwa cabang berikutnya tidak cocok. untuk turun ke cabang lain, kita membutuhkan pola dengan'*'
di bagian depan, tetapi kita telah mengkonsumsi pola asli ketika kita muncul'*'
, dan kita mengkonsumsi'*'
, jadi untuk mendapatkan diri kita sendiri pola lagi kita memuat string baru yang mengkilap konstan'*'
, dan tambahkan di tempat. itu menjadi lebih buruk karena untuk beberapa alasan pencocokan karakter harus dilakukan dengan nilai ascii, tetapi dengan menambahkan kembali ke string membutuhkan string.skrip golf kurang golf
tes
sumber
C # (251 karakter)
Sedikit lebih mudah dibaca:
† Saya tahu, saya tahu ... kecuali untuk gumpalan yang mengandung garis miring terbalik. Sangat disayangkan. Kalau tidak begitu, akan sangat pintar. :(
sumber