Знайдіть шаблони в рядках


17

У цьому завданні ваше завдання - знайти підрядки з заданою структурою.

Вхідні дані

Вхідними даними повинні бути два непусті буквено-цифрові рядки, візерунок p та текст t . Ідея полягає в тому, що кожен символ pявляє собою суміжну не порожню підрядку, tяка виникає поруч, і pявляє собою їх конкатенацію. Ідентичні символи відповідають однаковим підрядкам; Наприклад, шаблон aaпредставляє будь непорожній квадрат (рядок , отриману шляхом конкатенації коротшу рядок до себе). Таким чином, візерунок aaможе відповідати підрядку byebyeз кожним aузгодженням bye.

Вихідні дані

Якщо текст tмістить підрядку, яка pзбігається, то вашим висновком буде ця підрядка з двокрапками, :вставленими між рядками, що відповідають символам p. Наприклад, якщо ми маємо t = byebyenowі p = aa, то bye:byeє прийнятним виходом. Можливо, буде кілька варіантів відповідного підрядка, але виведете лише один із них.

Якщо tне містить збігової підрядки, у вашому виході буде сумне обличчя :(.

Правила та уточнення

Різні символи pможуть відповідати однаковим підрядкам, тому вони p = abaможуть відповідати рядку AAA. Зауважте, що символи повинні відповідати не порожнім рядкам; зокрема, якщо pдовше, ніж tвихід, повинен бути вихідний :(.

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

Випробування

Дано у форматі pattern text -> output. Зауважте, що можуть існувати й інші прийнятні результати.

a Not -> N
aa Not -> :(
abcd Not -> :(
aaa rerere -> re:re:re
xx ABAAAB -> A:A
MMM ABABBAABBAABBA -> ABBA:ABBA:ABBA
x33x 10100110011001 -> 10:1001:1001:10
abcacb 0a00cca0aa0cc0ca0aa0c00c0aaa0c -> c:a0aa:0c:c:0c:a0aa
abccab 0a00cca0aa0cc0ca0aa0c00c0aaa0c -> a:a:0c0:0c0:a:a
abcbcab 0a00cca0aa0cc0ca0aa0c00c0aaa0c -> :(
abcbdcab 0a00cca0aa0cc0ca0aa0c00c0aaa0c -> 00:c:ca0aa0c:c:0:ca0aa0c:00:c

1
Набір живлення всіх підрядків? Чому ні!
orlp

1
@orlp Це лише O(2^((n * (n + 1))/2)): P
ThreeFx

Що означає цифра у рядку шаблону?
feersum

@feersum Це персонаж, тому він по суті такий же, як і будь-який інший символ.
ThreeFx

@ThreeFx Я не впевнений, оскільки перший абзац стосується лише "літер" у шаблоні.
feersum

Відповіді:


6

Пітон, 207 байт

import re
h=lambda x:"a"+str(ord(x))
def g(a,b):
 c,d="",set()
 for e in a:
  c+=["(?P<"+h(e)+">.+)","(?P="+h(e)+")"][e in d]
  d.add(e)
 f=re.search(c,b)
 return f and":".join(f.group(h(e))for e in a)or":("

Подзвоніть з g(pattern, string)

Використовує reмодуль, щоб виконати більшу частину роботи.


1

JavaScript (SpiderMonkey) (ES5.1), 198 байт

Оскільки ES6 вийшов у червні 2015 року, я розміщую версію коду ES5.1 разом із еквівалентом ES6, але оголошую версію ES5.1 як основну відповідь.

Жадібний матч, тому перший випадок повертає "Не" замість "N".

function(a,b){c=[o="indexOf"];r=a.split("");return(m=RegExp(r.map(function(i){return(e=c[o](i))>0?"\\"+e:(c.push(i),"(.+)")}).join("")).exec(b))?r.map(function(x){return m[c[o](x)]}).join(":"):":("}

Спробуйте в Інтернеті!

JavaScript (Node.js) (ES6), 141 байт

a=>b=>(c=[o="indexOf"],r=[...a],m=RegExp(r.map(i=>(e=c[o](i))>0?"\\"+e:(c.push(i),"(.+)")).join``).exec(b))?r.map(x=>m[c[o](x)]).join`:`:":("

Спробуйте в Інтернеті!

Бере аргументи в синтаксисі currying: f(a)(b)

Пояснення (і необережене):

function matchPattern(a, b) {                   // Main function
 var c = ["indexOf"];                           // Array used for the capturing groups
 var r = [...a];                                // Split the pattern first
 var m = RegExp(r.map(function(i) {             // Create the regex
  var e = c.indexOf(i);                         // Check if the character is found before
  if (e > 0)                                    // If so
   return "\\" + e;                             // Append the back reference to the regex
  else {                                        // If not
   c.push(i);                                   // Append the character to the array
   return "(.+)";                               // Append a capturing group to the regex
  }             
 }).join("")).exec(b);                          // Execute the regex
 if (m != null)                                 // If the pattern matches the string
  return r.map(function(x) {                    // Replace each letter
   return m[c.indexOf(x)];                      // With the corresponding substring
  }).join(":");                                 // And join them with ":"
 else                                           // If there is no match
  return ":(";                                  // Return ":("
}

1

Брахілог , 35 байт

sᵗ~cᵗXlᵛ∧Xzdz≠ʰ∧Xt~ṇ{Ḷ∧":"|}ᵐ.∨":("

Спробуйте в Інтернеті!

На не зовсім малих входах, дуже повільно. Я - ще не насправді зробив шостий тест-випадок, але-не-за-відсутністю-намагаюся повільно. (Можливо, через жорстоке форсування кожного розділу кожної підрядки, починаючи з найбільшої, а потім перевіряючи, чи збігається вона.) Вводиться як список [pattern,string].

Зведене та розділене пояснення:

sᵗ~cᵗX

X - візерунок, сполучений з розділом підрядка вхідного рядка.

lᵛ

Шаблон і розділ мають однакову кількість елементів.

Xzdz≠ʰ

Немає двох унікальних pattern char, matched substringпар мають спільний характер. Тобто жоден шаблон символів не відображається в декількох підрядках, хоча кілька символів візерунка можуть відображатися в одній підрядку.

Xt~ṇ{Ḷ∧":"|}ᵐ.∨":("

Вихід - це елементи розділу, з’єднані колонами, якщо щось не вдалося зробити, і в цьому випадку це :(замість цього.

Монолітичне пояснення:

                                       The input
 ᵗ  ᵗ                                  with its last element replaced with
  ~c                                   a list which concatenates to
s                                      a substring of it
     X                                 is X,
       ᵛ                               the elements of which all have the same
      l                                length.
        ∧                              And,
         X                             X
          z                            zipped
           d                           with duplicate pairs removed
            z                          and zipped back
              ʰ                        has a first element
             ≠                         with no duplicate values.
               ∧                       Furthermore,
                 t                     the last element of
                X                      X
                  ~ṇ                   with its elements joined by newlines
                    {      }ᵐ          where each character of the joined string
                     Ḷ                 is a newline
                      ∧                and
                          |            is replaced with
                       ":"             a colon
                          |            or is passed through unchanged
                             .         is the output.
                              ∨        If doing any part of that is impossible,
                                       the output is
                               ":("    ":(".

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

Гаразд, або я недооцінював часову складність використання декількох шарів жорсткої грубої сили, або це якимось чином порушено, тому що досі не робив шостий тестовий випадок
Unrelated String

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