오늘 당신의 도전은 표현의 가능한 모든 괄호를 생성하는 것입니다.
입력은 연산자로 구분 된 하나 이상의 용어를 포함하는 인쇄 가능한 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