Проблема
У меня есть куча регулярных выражений, которые мне нужно использовать в некотором коде, но я использую язык программирования, который не поддерживает регулярные выражения! К счастью, я знаю, что тестовая строка будет иметь максимальную длину и будет состоять только из печатного ASCII.
Соревнование
Вы должны ввести регулярное выражение и число n, и выход каждая строка состоит из печатной ASCII (ASCII коды от 32 до 126 включительно, до ~, ни вкладок или перевода строки) длины меньше или равно nчто совпадает с регулярным выражением. Вы не можете использовать встроенные регулярные выражения или функции сопоставления регулярных выражений в вашем коде вообще. Регулярные выражения будут ограничены следующим:
- Литеральные символы (и escape-символы, которые заставляют символ быть буквальным,
\.как и литерал.,\nявляются литераломn(эквивалентным простоn) и\wэквивалентныw. Вам не нужно поддерживать escape-последовательности.) .- подстановочный знак (любой символ)- Классы символов,
[abc]означает «a или b или c» и[d-f]означает что-нибудь от d до f (так, d или e или f). Единственными символами, которые имеют особое значение в классе символов, являются[и](которые всегда будут экранированы, поэтому не беспокойтесь о них)\(escape-символ, конечно)^в начале класса символов (который является отрицанием). ) и-(который является диапазоном). |- оператор ИЛИ, чередование.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 . Что плохого в том, чтобы использовать стандартные объяснения с точки зрения того, насколько сильно связаны конкатенация и чередование? (И у вас нет оправданий для того, чтобы не использовать песочницу)