Відповідайте перестановкам!


15

Ваше завдання полягає в тому, щоб створити регулярний вираз, який відповідає кожній перестановці струни, і нічого іншого. Матч також має враховувати регістри.

Так, наприклад, якщо ваш регулярний вираз:

ABC

Він повинен відповідати (і тільки відповідати) цим рядкам:

ABC
ACB
BAC
BCA
CAB
CBA

Він не повинен відповідати таким речам, як:

AABC (contains an extra A)
ABCD (contains an extra D)
AC   (no B)
AAA  (no B and C, extra 2 A's)
abc  (case-sensitive)

Правила:

  • Ви можете використовувати будь-який аромат регексу, який вам подобається.
  • Застосовуються стандартні лазівки.
  • У коді має бути принаймні два різних символи. Це означає, що такі рішення як 1недійсні.
  • Регекс повинен містити тільки друкований ASCII і більше нічого.



Я думав, (ABC|ACB|BAC|BCA|CAB|CBA)але ти хотів узагальнити відповідь.
Стівен Куан

Відповіді:


11

JavaScript, 64 57 байт

4 байти видалено завдяки Мартіну Ендеру.

^(?!.*([^])(.*\1){3}]?)[$$[-^?!!.'''-*11{33}5577\\-]{57}$

Спробуйте тут.

Пояснення (застарілі)

^                                  # Beginning of the string.
(?!.*                              # Match only the strings that don't contain...
  (.)(.*\1){4}                     #     5 occurrences of the same character.
  [^1]?[^1]?                       #     Something that doesn't matter.
)
[]zzz^(?!!!.**[)\\1{{44}}666]{64}  # 64 occurrences of these 16 characters.
                                   # Some are duplicated to make sure the regex
                                   # contains 4 occurrences of each character.
\z                                 # End of the string.

2
Я думаю, це працює для 60: ^(?!.*(\S)(.*\1){3}[^1]?)[]zzSS[-^?!!.'''-*1{33}0066-]{60}\z regex101
Мартін Ендер

Це майже працює в .NET:^(?'4'(?!(.*\4){3})[]$$[\\^^?!!..'-*{}33-5-]){54}$[5]*
jimmy23013

Що не працює? Зворотна стрічка?
Мартін Ендер

@MartinEnder Так.
jimmy23013

2

Регекс Perl і PCRE, 280 байт

^(?=(.*z){2})(?=(.*\(){43})(?=(.*\)){43})(?=(.*\*){22})(?=(.*\.){23})(?=(.*0){2})(?=(.*1){6})(?=(.*2){16})(?=(.*3){7})(?=(.*4){4})(?=(.*5){1})(?=(.*6){3})(?=(.*7){2})(?=(.*8){2})(?=(.*9){1})(?=(.*=){22})(?=(.*\?){22})(?=(.*\\){11})(?=(.*\^){2})(?=(.*\{){23})(?=(.*\}){23}).{280}\z

(Трохи) читабельніше:

^
(?=(.*z){2})
(?=(.*\(){43})
(?=(.*\)){43})
(?=(.*\*){22})
(?=(.*\.){23})
(?=(.*0){2})
(?=(.*1){6})
(?=(.*2){16})
(?=(.*3){7})
(?=(.*4){4})
(?=(.*5){1})
(?=(.*6){3})
(?=(.*7){2})
(?=(.*8){2})
(?=(.*9){1})
(?=(.*=){22})
(?=(.*\?){22})
(?=(.*\\){11})
(?=(.*\^){2})
(?=(.*\{){23})
(?=(.*\}){23})
.{280}\z

Це працює в O (2 ^ n) час, як написано, тому неймовірно неефективно. Найпростіший спосіб перевірити це, щоб замінити кожне входження .*з .*?, що викликає той випадок , коли він відповідає , щоб перевірити перше ( що означає , що він відповідає в лінійний час, але по- як і раніше займає експоненціальне час , якщо воно не збігається).

Основна ідея полягає в тому, що ми проводимо довжину регулярного виразу рівним 280, і використовувати LOOKAHEAD затвердження , щоб змусити кожного символу в регулярному виразі з'являтися по крайней мере , певне число раз, наприклад , (?=(.*z){2})змушує zхарактер з'являтися принаймні в два рази. 2+43+43+22+23+2+6+16+7+4+1+3+2+2+1+22+22+11+2+23+23дорівнює 280, тому у нас не може бути жодних "зайвих" випадків жодних символів.

Це приклад програмування автограми , речення, яке описує себе, перераховуючи номер кожного символу, який він містить (і, в цьому випадку, також загальну довжину). Мені пощастило в його конструюванні (як правило, ви повинні використовувати грубу силу, але я наткнувся на це рішення під час тестування своєї грубої сили програми, перш ніж повністю закінчити її написання).

Регекс Perl та PCRE, 253 байти, у співпраці з Мартіном Ендером

Я припускав, що можуть бути більш короткі рішення, які опускають деякі цифри (швидше за все, 9, 8 або 7). Мартін Ендер знайшов його, показане нижче:

^(?=(.*z){2})(?=(.*\(){39})(?=(.*\)){39})(?=(.*\*){20})(?=(.*\.){21})(?=(.*0){4})(?=(.*1){6})(?=(.*2){11})(?=(.*3){6})(?=(.*4){3})(?=(.*5){2})(?=(.*6){3})(?=(.*9){4})(?=(.*=){20})(?=(.*\?){20})(?=(.*\\){9})(?=(.*\^){2})(?=(.*{){21})(?=(.*}){21}).{253}\z

Читаема версія:

^
(? = (. * z) {2})
(? = (. * \ () {39})
(? = (. * \)) {39})
(? = (. * \ *) {20})
(? = (. * \.) {21})
(? = (. * 0) {4})
(? = (. * 1) {6})
(? = (. * 2) {11})
(? = (. * 3) {6})
(? = (. * 4) {3})
(? = (. * 5) {2})
(? = (. * 6) {3})
(? = (. * 9) {4})
(? = (. * =) {20})
(? = (. * \?) {20})
(? = (. * \\) {9})
(? = (. * \ ^) {2})
(? = (. * {) {21})
(? = (. *}) {21})
. {253} \ z

Я не думаю, що вам потрібно уникати тих, хто {}знаходиться в останніх двох динаміках. Вам також не потрібно додавати такі речі, як (?=(.*5){1})не було б, 5якби у вас не було такого пошуку. Однією з проблем є те, що $дозволяє проводити зворотний потік рядків, тому вам потрібно буде використовувати \zтам замість того, $як робив Джиммі, але це не обійдеться вам у байт \.
Мартін Ендер

Я знаю, що такі речі, як цифри, можна опустити. Однак вони там, щоб зробити роботу автограми . Видалення будь-якої частини програми призведе до порушення всіх решти, оскільки вона більше не описує програму правильно. (Підрахунки для кожного рядка підраховують підрахунки для кожного рядка. Таким чином, змінити програму взагалі неможливо.) Що стосується $дозволу нового рядка в кінці рядка, це, як правило, залежить від того, як оточуючий виклик називається. програма (вони зазвичай працюють за кодом, який вже був розібраний у рядки).

Або якщо бути точнішим: мені це потрібно (?=(.*5){1})в цьому випадку. Якби я його зняв, у програмі було б 5, бо (?=(.*1){6})рядок тепер мав би прочитати (?=(.*1){5}).

Щодо трейлінг linefeed, схоже, немає жодних обмежень у виклику щодо виду вводу у ваш регулярний вираз, так що зазвичай це означає, що він повинен працювати для будь-якого рядка, а зміна $на \zне приносить ніякої шкоди (і не робить не порушую автограму).
Мартін Ендер

О Я бачу; ви змінюєте \$$на z\z. Це працює; Я піду поміняти.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.