Вирази повністю в дужках


11

Сьогодні ваше завдання полягає в тому, щоб створити всі можливі повноцінні дужки виразів.

Ваш вхід - це один рядок для друку ASCII, що містить один або більше термінів, розділених операторами. Вхід може також містити пробіли - їх потрібно ігнорувати. Термін є [a-zA-Z0-9], оператор - це [^ ()a-zA-Z0-9]. Ви можете припустити, що введення завжди дійсне.

Виведіть усі можливі способи повною дужкою в заданому виразі, розділених новими рядками з необов'язковим останнім рядком.

Є НЕ :

  • Терміни для введення дужки - лише дужки навколо операторів.
  • Упорядкуйте умови.
  • Виведіть будь-які пробіли.

Приклад введення / виводу:

N
N

a * b
(a*b)

x_x_0
(x_(x_0))
((x_x)_0)

a * b|c|d
(a*(b|(c|d)))
(a*((b|c)|d))
((a*b)|(c|d))
((a*(b|c))|d)
(((a*b)|c)|d)

Найменший код у байтах виграє.


Ви повинні перерахувати точні оператори, які ми маємо врахувати. Це !оператор? Про що ?
Оптимізатор

@Optimizer Я перерахував точне регулярне вираження того, що вважається оператором. !підходить регулярний вираз, так що робить , однак , не може бути частиною входу , тому що це не для друку ASCII.
orlp

Ага гаразд. Тож нічого, крім терміна, це оператор ...
Оптимізатор

Отже, і терміни, і оператори завжди є одним символом?
користувач81655

1
вставте сюди обов’язковий каламбур, пов’язаний з LISP
кіт

Відповіді:


2

Pyth, 38 байт

L?tbsmmjj@bdk"()"*y<bdy>bhd:1lb2bjy-zd

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

Він визначає рекурсивну функцію, яка:

  • повертає вхід, якщо його довжина дорівнює 1
  • приймає всі два розщеплення вводу для операторів, і для кожного розділення:
    • називає себе рекурсивно на кожній із половинок
    • приймає декартовий добуток результатів кожної половини
    • приєднується до кожного результату оператором при розщепленні
    • дужки поєднує результат
  • і, нарешті, з'єднує отримані масиви.

Потім функція викликається вхідним рядком із видаленими пробілами, а результати з'єднуються новими рядками.


3

JavaScript (ES6), 208 197 байт

s=>((q=x=>x.map((_,i)=>(a=[...x.slice(0,i*=2),p="("+x[i]+x[++i]+x[++i]+")",...x.slice(i+1)],x[i]?a[1]?q(a):r.push(p):0)))([...s.replace(/ /g,o="")],r=[]),r.map((l,i)=>r.indexOf(l)<i?0:o+=l+`
`),o)

Пояснення

Використовує рекурсивну функцію, яка приймає масив з [ t, o, t, o, etc... ]дужок, кожну послідовну пару з двох термінів разом, як [ (tot), o, etc... ]і повторює цей процес, поки в масиві не буде лише одного елемента, а потім фільтрується дублюючі значення.

s=>(                                  // s = input string
  (q=x=>                              // q = parenthesise array function
    x.map((_,i)=>(
      a=[                             // a = p with parenthesised pair of terms
        ...x.slice(0,i*=2),
        p="("+x[i]+x[++i]+x[++i]+")", // parenthesise and join 2 terms and an operator
        ...x.slice(i+1)
      ],
      x[i]?a[1]                       // make sure the loop is not over
        ?q(a)                         // check next level of permutations
        :r.push(p)                    // add the permutation to the results
      :0
    ))
  )([...s.replace(/ /g,               // remove spaces and parenthesise all expressions
    o="")],                           // o = output string
    r=[]),                            // r = array of result strings
  r.map(                              // filter out duplicates
    (l,i)=>r.indexOf(l)<i?0:o+=l+`
`
  ),o)                                // return o

Тест

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