동일한 브래킷 유형


9

질문을 바탕으로 합니다.

문자열이 주어지면 각 브래킷 ()[]{}<>을 적절한 유형의 브래킷 으로 교체 하여 브래킷이 일치하고 중첩 된 브래킷이 다음과 같이 순환합니다.

  1. 가장 바깥 쪽은 ()
  2. 직접 내부에 ()있어야합니다[]
  3. 직접 내부에 []있어야합니다{}
  4. 직접 내부에 {}있어야합니다<>
  5. 직접 내부 <>될 것입니다 ()다시 (사이클)

대괄호가 아닌 모든 문자는 그대로 유지해야합니다. 열린 괄호는 일부 유형의 열린 괄호로만 교체 할 수 있으며 닫힌 괄호가있는 닫힌 괄호로만 교체 할 수 있습니다.

입력은 항상 이것을 가능하게합니다. 이는 유형이 무시되면 대괄호가 올바르게 일치 함을 의미합니다. 따라서 {ab<)c]유효한 입력이지만 ab)(cd그렇지 ab((cd않습니다.

예 :

2#jd {¤>. = 2#jd (¤).
abcdef    = abcdef
(3×5+(4-1)) = (3×5+[4-1])
<<<>><<>><<<<<<>>>>>>> = ([{}][{}][{<([{}])>}])

이 방법으로 입력을 기본적으로 변환하는 것은 사용할 수 없습니다 (언어의 자동 구문).

항상 그렇듯이 가장 짧은 코드가 승리합니다.


나는 도전을 이해하지 못한다. 입력과 관련하여 출력이 무엇이어야합니까?
xnor

@xnor 출력은 네 종류의 괄호를 제외하고 입력과 같은 문자열이어야합니다. 패턴과 일치하도록 교체해야합니다.
Dirk Reichel

아, 이제 알겠습니다. 나는 "해야한다"는 것이 당신이 사실로 만들어야한다는 것을 이해하지 못했습니다. 더 명확하게하기 위해 편집하겠습니다.
xnor

1
@ DirkReichel 나는 그것이 당신이 걱정할 필요가 있다고 생각하지 않습니다. 어떤 언어라도이 특정 변형을 기본적으로 수행 할 수 있다고 상상할 수 없으며, 그러한 언어가있을 가능성이 높을 경우 그 언어로 된 답변은 그다지 흥미롭지 않을 것입니다.
Martin Ender

2
@DirkReichel 요점이 뭐야? ASCII 만 사용하면됩니다. 다른 문자를 사용하면 ASCII 전용 언어에 대한 불필요한 제한 외에는 문제가 없습니다.
FlipTack

답변:


2

자바 스크립트 (ES6), 79 바이트

s=>s.replace(/./g,c=>~(p=l.indexOf(c))?l[p&4?--k&3|4:k++&3]:c,l='([{<)]}>',k=0)

테스트 사례


1

Lex, 132 바이트

%{
int i,o[4]={40,91,123,60};
%}
%%
[[({<] {putchar(o[i++&3]);}
[])}>] {putchar(o[--i&3]+2-!(i&3));}
%%
yywrap(){}
main(){yylex();}

flex몇 바이트의 비용으로 마지막 두 개 또는 세 개의 줄을 삭제하여 27 바이트 (휴대용 lex) 또는 30 바이트 ( 컴파일러로 사용)를 저장할 수 있습니다 (아마도 2, 3 또는 4; 규칙은 다소 불분명합니다) -ll결과 C 파일을 링크 할 때 명령 행 옵션에 대한 처벌 . (이것은으로 컴파일하는 대신으로 컴파일하는 lex brackets.l; cc lex.yy.c것입니다 lex brackets.l; cc lex.yy.c -ll.) 이것은 분명히 이런 상황에서 가치가 있습니다.

1

자바, 155 바이트

a->{String s="([{<)]}>";for(int i=0,j=0,k;i<a.length;i++){k=s.indexOf(a[i]);if(k>3){a[i]=s.charAt(--j%4+4);}else if(k>-1){a[i]=s.charAt(j++%4);}}return a;}

char[]단일 인수로 사용 되는 람다 . 우리는 배열을 반복하여 배열 ( s) 안의 문자열을 변수 ( k)에 저장합니다. 우리는 여는 또는 닫는 괄호 ( s.indexAt()) 인지 확인 하고 중첩 수준 ( s.charAt()) 에 따라 적절한 괄호로 바꿉니다.%4


1

하스켈, 126 바이트

b="([{<"
d=")]}>"
y=cycle
(!)=elem
f(e:c)n(x:r)|x!b=y b!!n:f(y d!!n:e:c)(n+1)r|x!d=e:f c(n-1)r|1<3=x:f(e:c)n r
f c n s=s
f" "0

아이디어로 사용해보십시오. 용법:

*Main> f" "0 "<<<>><<>><<<<<<>>>>>>>"
"([{}][{}][{<([{}])>}])"

설명

f괄호를 닫기위한 스택으로 작동하는 문자열 n, 중첩 깊이를 계산하기 위한 int 및 입력 문자열.

f c n "" = ""                            -- base case for recursion: input string is empty
f (e:c) n (x:r)                          -- for the current char x
   | elem x "([{<" =                     -- check if it is an opening bracket
       (cycle "([{<")!!n :               --   if so, replace it with a bracket of the current nesting depth
           f ((cycle ")]}>")!!n : e : c) --   push the matching closing bracket on the stack
               (n+1) r                   --   increase depth level and check the next char
   | elem x ")]}>" =                     -- if x is a closing bracket
       e :                               --   replace it by the closing bracket from on top of the stack
           f c (n-1) r                   --   decrement depth level and check the next char
   | otherwise     = x : f (e:c) n r     -- otherwise keep x and check the next char
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.