Выражения в скобках


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

Ах хорошо. Так что все, кроме термина, является оператором ...
Оптимизатор

Значит, и термины, и операторы всегда имеют длину одного символа?
user81655

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.