Проблема
У мене є маса регулярних виразів, які мені потрібно використовувати в якомусь коді, але я використовую мову програмування, яка не підтримує регулярний вираз! На щастя, я знаю, що тестова рядок матиме максимальну довжину і буде складатися тільки з друкованого 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. Що поганого у використанні стандартних пояснень щодо того, наскільки сильно пов'язують конкатенацію та чергування? (І у вас немає виправдань за те, щоб не скористатися пісочницею)