Проблема
У мене є маса регулярних виразів, які мені потрібно використовувати в якомусь коді, але я використовую мову програмування, яка не підтримує регулярний вираз! На щастя, я знаю, що тестова рядок матиме максимальну довжину і буде складатися тільки з друкованого ASCII.
Змагання
Ви повинні ввести регулярний вираз і число n
, і вихід кожен рядок складається з друкованої ASCII (ASCII коди від 32 до 126 включно, до
~
, ні вкладок або перекладу рядка) довжини менше або дорівнює n
що збігається з регулярним виразом. Ви взагалі не можете використовувати вбудовані регулярні вирази або функції зіставлення регулярних виразів у своєму коді. Регулярні вирази обмежуватимуться наступним:
- Літеральні символи (і втечі, які змушують персонажа бути буквальним, так
\.
це буквальний.
,\n
є буквальнимn
(еквівалентний справедливомуn
) і\w
еквівалентнийw
. Вам не потрібно підтримувати послідовності втечі.) .
- підстановочний знак (будь-який символ)- Класи символів
[abc]
означає "a або b або c" і[d-f]
означає що-небудь від d до f (так, d або e або f). Єдиними символами, які мають особливе значення у класі символів, є[
і]
(які завжди будуть уникнути, тому не хвилюйтеся про них),\
(звичайно, символ втечі),^
на початку класу символів (що є запереченням ), і-
(що є діапазоном). |
- оператор АБО, чергування.foo|bar
кошти абоfoo
абоbar
, і(ab|cd)e
матчі абоabe
абоcde
.*
- відповідати попередньому жетону, повтореному нулю або більше разів, жадібним (він намагається повторити якомога більше разів)+
- повторював один чи кілька разів жадібний?
- нуль або один раз- Угруповання з допомогою дужок, групувати жетони
|
,*
.+
, або?
Вхід регулярний вираз завжди буде дійсним (тобто, ви не повинні обробляти введення як ?abc
або (foo
чи будь-який невірний введення). Ви можете виводити рядки в будь-якому бажаному порядку, але кожен рядок повинен з’являтися лише один раз (не виводити жодних дублікатів).
Випробування
Вхід: .*
, 1
вихід: (порожній рядок), ,
!
, "
, ..., }
,~
Вхід: w\w+
, 3
вихід: ww
,www
Вхід: [abx-z][^ -}][\\]
, 3
вихід: a~\
, b~\
, x~\
, y~\
,z~\
Вхід: ab*a|c[de]*
, 3
вихід: c
, cd
, ce
, aa
, cde
, ced
, cdd
, cee
,aba
Вхід: (foo)+(bar)?!?
, 6
вихід: foo
, foo!
, foofoo
,foobar
Вхід: (a+|b*c)d
, 4
вихід: ad
, cd
, aad
, bcd
, aaad
,bbcd
Вхід: p+cg
, 4
вихід: pcg
,ppcg
Вхід: a{3}
, 4
вихід:a{3}
Переможець
Це код-гольф , тому найкоротший код у байтах виграє!
|
має дуже мало сенсу. Схоже, це не обробляє вкладені групи або a|b|c
. Що поганого у використанні стандартних пояснень щодо того, наскільки сильно пов'язують конкатенацію та чергування? (І у вас немає виправдань за те, щоб не скористатися пісочницею)