완전 괄호 표현식


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

@Optimizer 나는 연산자로 간주되는 것에 대한 정확한 정규 표현을 나열했습니다. !는 정규식에 적합 하지만 인쇄 가능한 ASCII가 아니기 때문에 입력의 일부가 될 수 없습니다.
orlp

아 알았어 용어를 제외한 모든 것은 연산자입니다.
Optimizer

용어와 연산자는 항상 한 문자 길이입니까?
user81655

1
필수 LISP 관련 말장난을 여기에 삽입
고양이

답변:


2

Pyth, 38 바이트

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

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

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

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

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


3

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

테스트

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.