Vấn đề
Tôi có một loạt các biểu thức chính quy mà tôi cần sử dụng trong một số mã, nhưng tôi đang sử dụng ngôn ngữ lập trình không hỗ trợ regex! May mắn thay, tôi biết rằng chuỗi thử nghiệm sẽ có độ dài tối đa và sẽ chỉ bao gồm ASCII có thể in được.
Các thách thức
Bạn phải nhập một regex và một số n
, và sản lượng mỗi chuỗi gồm ASCII in được (mã ASCII 32 đến 126, để
~
, không có tab hoặc dòng mới) có chiều dài nhỏ hơn hoặc bằng để n
mà trận đấu rằng regex. Bạn hoàn toàn không thể sử dụng các biểu thức chính quy hoặc các hàm so khớp regex tích hợp trong mã của mình. Biểu thức thông thường sẽ được giới hạn ở các mục sau:
- Ký tự chữ (và thoát, mà buộc một nhân vật là nghĩa đen, vì vậy
\.
là một chữ.
,\n
là một chữn
(tương đương với chỉn
), và\w
tương đương vớiw
. Bạn không cần phải trình tự hỗ trợ thoát.) .
- ký tự đại diện (bất kỳ ký tự nào)- Các lớp ký tự,
[abc]
có nghĩa là "a hoặc b hoặc c" và[d-f]
có nghĩa là bất cứ thứ gì từ d đến f (vì vậy, d hoặc e hoặc f). Các ký tự duy nhất có ý nghĩa đặc biệt trong một lớp nhân vật là[
và]
(sẽ luôn luôn được thoát, vì vậy đừng lo lắng về chúng),\
(nhân vật thoát, tất nhiên),^
ở đầu lớp nhân vật (đó là một phủ định ) và-
(là một phạm vi). |
- toán tử OR, xen kẽ.foo|bar
có nghĩa làfoo
hoặcbar
, và(ab|cd)e
khớp hoặcabe
hoặccde
.*
- khớp với mã thông báo trước đó lặp đi lặp lại 0 lần hoặc nhiều lần, tham lam (nó cố gắng lặp lại nhiều lần nhất có thể)+
- lặp đi lặp lại một hoặc nhiều lần, tham lam?
- không hoặc một lần- Nhóm với dấu ngoặc đơn, để tokens nhóm cho
|
,*
.+
, hoặc là?
Regex đầu vào sẽ luôn hợp lệ (nghĩa là bạn không phải xử lý đầu vào như ?abc
hoặc (foo
hoặc bất kỳ đầu vào không hợp lệ nào). Bạn có thể xuất các chuỗi theo bất kỳ thứ tự nào bạn muốn, nhưng mỗi chuỗi chỉ xuất hiện một lần (không xuất bất kỳ bản sao nào).
Các trường hợp thử nghiệm
Input: .*
, 1
Output: (trống string), ,
!
, "
, ..., }
,~
Đầu vào : w\w+
, 3
Đầu ra : ww
,www
Input: [abx-z][^ -}][\\]
, 3
Output: a~\
, b~\
, x~\
, y~\
,z~\
Input: ab*a|c[de]*
, 3
Output: c
, cd
, ce
, aa
, cde
, ced
, cdd
, cee
,aba
Input: (foo)+(bar)?!?
, 6
Output: foo
, foo!
, foofoo
,foobar
Input: (a+|b*c)d
, 4
Output: ad
, cd
, aad
, bcd
, aaad
,bbcd
Đầu vào : p+cg
, 4
Đầu ra : pcg
,ppcg
Đầu vào : a{3}
, 4
Đầu ra:a{3}
Người chiến thắng
Đây là mã golf , vì vậy mã ngắn nhất tính bằng byte sẽ giành chiến thắng!
|
bạn làm cho rất ít ý nghĩa. Nó dường như không xử lý các nhóm lồng nhau hoặc a|b|c
. Có gì sai khi sử dụng các giải thích tiêu chuẩn về mặt liên kết và xen kẽ mạnh mẽ như thế nào? (Và bạn không có lý do gì để không sử dụng hộp cát)