완전 괄호 표현식 공백이 포함될

오늘 당신의 도전은 표현의 가능한 모든 괄호를 생성하는 것입니다.

입력은 연산자로 구분 된 하나 이상의 용어를 포함하는 인쇄 가능한 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)

바이트 단위의 가장 작은 코드가 이깁니다.



답변

Pyth, 38 바이트

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

온라인으로 사용해보십시오.

다음과 같은 재귀 함수를 정의합니다.

  • 길이가 1 인 경우 입력을 반환합니다.
  • 연산자와 각 분할에 대해 두 개의 입력을 모두 취합니다.
    • 각 반쪽에서 재귀 적으로 호출
    • 각 반 결과의 데카르트 곱을 취합니다.
    • 분할에서 작업자가 각 결과를 결합
    • 결합 된 결과를 괄호로 묶습니다.
  • 마지막으로 결과 배열을 연결합니다.

그런 다음 공백이 제거 된 입력 문자열과 함께 함수가 호출되고 결과는 개행으로 결합됩니다.


답변

자바 스크립트 (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

테스트


답변