변장에 괄호가 있습니까?


12

누군가 우리에게 줄을 주었지만, 모든 괄호와 같은 문자는 일반 문자로 바뀌었고, 우리는 어느 것이 있는지, 심지어 얼마나 많은지 알 수 없습니다. 우리가 아는 것은 L1,L2,L3,...,LN다른 종류의 왼쪽 대괄호이고 R1,R2,R3,...,RN다른 대응하는 종류의 오른쪽 대괄호 인 경우 모두 고유하고 (2N 고유 한 대괄호 문자) 문자열 중 하나 인 경우에 유효합니다 (+는 일반 문자열 연결).

  • L1+X+R1, L2+X+R2, ..., LN+X+RN여기서 X유효한 문자열입니다,

  • X+Y, where XY유효한 문자열,

  • 대괄호 문자가 아닌 모든 단일 문자.

  • 빈 문자열

대괄호를 변경하기 전에 유효한 문자열로 시작했으며 문자열에 이미 존재하는 문자로 변경하지 않았습니다. 각 브래킷마다 하나 이상의 쌍이 존재했습니다. 당신은 재구성 할 수있는 문자는 원래 왼쪽과 오른쪽 브래킷 쌍합니다 (찾을 된 LiRi주어진 조건 아래)?

대괄호 인 문자 쌍을 출력하십시오. 예를 들어, (){}[]실제로 문자를 괄호했다, 당신은 출력 수도 (){}[]또는 {}[]()또는 [](){}등 문자열을이 작업을 수행하는 여러 가지 방법이있을 수 있습니다, 당신은 단지 하나는 더 쌍 (예 참조)에는 브래킷 할당이 없음을 반환해야합니다. 출력 문자열의 길이는 항상 짝수 여야합니다.

예 :

abcc- c두 개의 어커런스가있는 다른 문자가 없으므로 ab대괄호가 될 수 없지만 대괄호 쌍이 될 수 있으므로 정확하게 출력합니다 ab.

fffff -최대 하나의 문자가있는 문자열은 대괄호를 사용할 수 없으므로 빈 문자열을 반환하거나 아무것도 출력하지 않습니다.

aedbedebdcecdec -이 문자열에는 1a, 2bs, 3cs, 4ds 및 5es가 있으므로 대괄호를 사용할 수 없으므로 같은 수의 두 문자가 발생하지 않으므로 대괄호를 사용해야합니다.

abcd- 가능한 과제는 ab, cd, abcd, cdab, adbc, bcad, ac, ad, bcbd, (물론 그들 모두가 가지고있는 빈 할당 등)하지만 당신은 당신이 반환해야하므로, 가장 긴 과제 중 하나 반환해야한다 abcd, cdab, adbc, 또는 bcad.

aabbcc, abc-이 모두가 ab, ac그리고 bc유효한 쌍으로. 이 쌍 중 하나를 반환해야합니다.

abbac-a와 b는 같은 문자 수를 갖지만 실제로는 작동하지 않습니다. 그중 하나는 다른 모든 발생의 왼쪽과 오른쪽 모두에서 발생하기 때문입니다. 아무것도 반환하지 마십시오.

aabcdb- cdab정확한 브래킷 2 쌍은, 출력 중 하나 그래서 cdababcd.

abcdacbd- 하나의 쌍은 한 번에 달성 할 수 있지만 ab, ac, bd, cd, 그리고 ad당신은 가능한 한 쌍을 모두 반환 할 수 있습니다. 당신이 선택하는 한 쌍 상관없이, 그것은의 경우를 제외하고, 다른 쌍을 금지 한 다른 캐릭터가 그 안에있는 인스턴스가 ad다른 쌍, bc그리고 cb하나, 그렇게 할 수 없습니다 만 불가능을 로 ad.

이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 이깁니다. 가능하면 STDIN에서 입력하십시오. 가능하지 않은 경우 답변에 입력 방법을 표시하십시오.


1
입력 abcd의 경우 출력 adbc도 허용됩니다.
Patrick Roberts

예, 예제에 추가했습니다.
마찰적인 멜론

답변:


4

루비, 373 바이트

i=gets.chomp
b=[*(i.chars.group_by{|x|x}.group_by{|x,y|y.size}.map{|x|s=x[1].size
x[1][0...s-s%2].map{|x|x[0]}*''}*'').chars.each_slice(2)]
puts [*[*b.size.downto(1).map{|n|b.combination(n).map{|t|[t*'',(h=Hash[t]
s=[]
o=1
i.each_char{|c|s.push(c)if h.keys.include?c
(o=false if s.empty?||!h[s.pop].eql?(c))if h.values.include?c}
o ?s.empty?: o)]}}.find{|x|x[0][1]}][0]][0]

여기서 골프 파서 버전의 스택 파서를 사용 합니다 .

아마도 더 단순화 될 수는 있지만 뇌가 더 이상 처리 할 수 ​​없다고 생각합니다.

모든 테스트 사례 : http://ideone.com/gcqDkK

공백 사용시 : http://ideone.com/pLrsHg

Ungolfed (주로) : http://ideone.com/oM5gKX

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