리버스 엔지니어 브래킷 사각형


24

모든 프로그래머는 사각형 이 정말 재미 있다는 것을 알고 있습니다. 이 재미를 악화시키기 위해이 귀엽고 퍼지 다이어그램은 짜여진 괄호 그룹으로 변환 될 수 있습니다.

이 도전은 나의 이전 과 반대 입니다 .

다음과 같이 연동 사각형 그룹이 있다고 가정 해 봅시다.

   +------------+
   |            |
+--+-+     +----+-+
|  | |     |    | |
|  | | +---+--+ | |
|  | | |   |  | | |
+--+-+ | +-+--+-+-+-+
   |   | | |  | | | |
   |   | | |  | | | |
   |   | | |  | | | |    +-+
   |   +-+-+--+ | | |    | |
   |     | |    | | |  +-+-+-+
   +-----+-+----+ | |  | | | |
         | |      | |  | +-+ |
         | +------+ |  |     |
         |          |  |     |
         +----------+  +-----+

추가 사항 :

  • 두 개의 +인접 하지 않습니다
  • 두 개의 직사각형은 모서리 나 모서리를 공유하지 않습니다
  • 각 열에는 최대 하나의 수직 모서리 만있을 것입니다

첫 번째 단계는 사각형의 가장 왼쪽 가장자리를 보는 것입니다. 네 가지 브래킷 유형 중 하나를 지정하십시오 ({[<. 선택합니다 [.

   +------------+
   |            |
[--+-]     +----+-+
[  | ]     |    | |
[  | ] +---+--+ | |
[  | ] |   |  | | |
[--+-] | +-+--+-+-+-+
   |   | | |  | | | |
   |   | | |  | | | |
   |   | | |  | | | |    +-+
   |   +-+-+--+ | | |    | |
   |     | |    | | |  +-+-+-+
   +-----+-+----+ | |  | | | |
         | |      | |  | +-+ |
         | +------+ |  |     |
         |          |  |     |
         +----------+  +-----+

이제 가장 왼쪽에있는 두 번째 사각형을보십시오. [사각형 과 겹치므로 다른 유형이어야합니다. 선택합니다 (.

   (------------)
   (            )
[--(-]     +----)-+
[  ( ]     |    ) |
[  ( ] +---+--+ ) |
[  ( ] |   |  | ) |
[--(-] | +-+--+-)-+-+
   (   | | |  | ) | |
   (   | | |  | ) | |
   (   | | |  | ) | |    +-+
   (   +-+-+--+ ) | |    | |
   (     | |    ) | |  +-+-+-+
   (-----+-+----) | |  | | | |
         | |      | |  | +-+ |
         | +------+ |  |     |
         |          |  |     |
         +----------+  +-----+

다음으로 가장 왼쪽에있는 사각형은 이전 사각형과 교차하지 않지만 이전 사각형 안에 중첩됩니다. (다시 할당하기로 결정 했습니다. 가능하면 내부에 중첩되는 것과 같은 유형의 사각형을 할당하는 것이 일반적이지만 좋은 경우가 있습니다.

   (------------)
   (            )
[--(-]     +----)-+
[  ( ]     |    ) |
[  ( ] (---+--) ) |
[  ( ] (   |  ) ) |
[--(-] ( +-+--)-)-+-+
   (   ( | |  ) ) | |
   (   ( | |  ) ) | |
   (   ( | |  ) ) | |    +-+
   (   (-+-+--) ) | |    | |
   (     | |    ) | |  +-+-+-+
   (-----+-+----) | |  | | | |
         | |      | |  | +-+ |
         | +------+ |  |     |
         |          |  |     |
         +----------+  +-----+

이 다음 사각형을 [다시 할당 할 수 있습니다 .

   (------------)
   (            )
[--(-]     +----)-+
[  ( ]     |    ) |
[  ( ] (---+--) ) |
[  ( ] (   |  ) ) |
[--(-] ( [-+--)-)-+-]
   (   ( [ |  ) ) | ]
   (   ( [ |  ) ) | ]
   (   ( [ |  ) ) | ]    +-+
   (   (-[-+--) ) | ]    | |
   (     [ |    ) | ]  +-+-+-+
   (-----[-+----) | ]  | | | |
         [ |      | ]  | +-+ |
         [ +------+ ]  |     |
         [          ]  |     |
         [----------]  +-----+

다음 사각형은 좀 재미 있습니다. a ([사각형을 모두 교차 하므로 사각형이라고 할 수 있습니다 {( <그러나 아무도 좋아하지 않습니다).

   (------------)
   (            )
[--(-]     {----)-}
[  ( ]     {    ) }
[  ( ] (---{--) ) }
[  ( ] (   {  ) ) }
[--(-] ( [-{--)-)-}-]
   (   ( [ {  ) ) } ]
   (   ( [ {  ) ) } ]
   (   ( [ {  ) ) } ]    +-+
   (   (-[-{--) ) } ]    | |
   (     [ {    ) } ]  +-+-+-+
   (-----[-{----) } ]  | | | |
         [ {      } ]  | +-+ |
         [ {------} ]  |     |
         [          ]  |     |
         [----------]  +-----+

마지막 두 사각형은 그렇게 나쁘지 않습니다. 두 가지 유형이 될 수 있습니다.

   (------------)
   (            )
[--(-]     {----)-}
[  ( ]     {    ) }
[  ( ] (---{--) ) }
[  ( ] (   {  ) ) }
[--(-] ( [-{--)-)-}-]
   (   ( [ {  ) ) } ]
   (   ( [ {  ) ) } ]
   (   ( [ {  ) ) } ]    {-}
   (   (-[-{--) ) } ]    { }
   (     [ {    ) } ]  <-{-}->
   (-----[-{----) } ]  < { } >
         [ {      } ]  < {-} >
         [ {------} ]  <     >
         [          ]  <     >
         [----------]  <----->

사각형을 읽으면 얻을 수 [(]([{))}]<{}>있습니다. 이것은 위의 입력에 대해 가능한 출력 중 하나입니다. 다음은 가능한 많은 옵션의 목록입니다.

[(]([{))}]<{}>
<(>(<{))}>{()}
{<}[{(]>)}[<>]
any of the 4! permutations of ([{<, you get the idea...

입력

ASCII 아트 사각형은 모호하지 않으며 (위의 참고 참조) 괄호 문자열로 올바르게 변환 될 수 있다고 가정합니다. 선택적 후행 줄 바꿈을 사용하여 후행 공백이 없거나 사각형으로 채워져 있다고 가정 할 수 있습니다. 선행 공백이 없습니다.

산출

사각형의 교차 제한을 따르는 유효한 대괄호 문자열 중 하나. 선택적인 후행 줄 바꿈 이외의 대괄호 이외의 문자는 없어야합니다. 기본 규칙은 두 개의 사각형이 교차하는 경우 다른 대괄호 유형을 지정해야합니다.

이것은 품질에 비해 수량이 부족한 코드 골프입니다.


3
참고로 "악화하다"는 "나쁜 것을 악화시킨다"는 의미입니다.
Paul R

@PaulR 나는 그것이 핵심이라고 생각합니다
고양이

오, 알았어. 분명히 요점이 무엇이든 내 머리 위로 똑바로 갔다!
Paul R

각 사각형의 높이 일정 하다고 가정 할 수 있습니까 ? + , 왼쪽 상단 모서리에 대해 사용할 수 없으며 왼쪽 하단 모서리에 +대해 (즉시 아래에)있을 수 없습니까?
Tersosauros

답변:


2

파이썬 3, 519 바이트

def c(i):
 a,b,c,d={},0,[],{}
 for e in map("".join,zip(*i.split("\n"))):
  if"+"in e:
   f=e.index("+"),e.rindex("+")
   if f in a:j=a.pop(f);d[j]=f+(d[j],len(c));c.append(j)
   else:a[f]=b;d[b]=len(c);c.append(b);b+=1
 g,h={},0
 while d:
  i={list(d)[0]};
  for j,(k,l,m,n)in d.items():
   for(o,p,q,r)in(d[v]for v in i):
    if not(m>r or n<q or k>p or l<o or(q<m<n<r and o<k>l<p)):break
   else:i.add(j)
  for j in i:del d[j];g[j]=h
  h+=1
 s,u=set(),""
 for t in c:u+="[{(<]})>"[g[t]+4*(t in s)];s.add(t)
 return u

솔루션에 대한 첫 번째 시도가 있습니다. 사용 된 알고리즘은 순전히 다이어그램의 모서리를보고 열에서 하나의 수직선 만 발생할 수 있다는 사실을 남용하므로 열의 첫 번째와 마지막 +는 사각형의 모서리 여야합니다. 그런 다음 모든 사각형을 수집하고 충돌없는 그룹에 대한 순진한 (그리고 다소 비 결정적) 검색을 수행합니다. 이것이 항상 가장 최적의 솔루션을 찾을 수 있는지 확실하지 않지만 지금까지 시도한 모든 예제에서 작동했습니다. 또는 가장 적은 수의 그룹에 대한 무차별 검색으로 대체 될 수 있습니다.

입력 : 아스키 아트가 포함 된 문자열. 후행 줄 바꿈이 없으며 공백을 사용하여 모든 줄을 같은 길이로 채워야합니다. 또한 모서리를 보면서 | 또는-를 넣지 않아도됩니다.

골프는 매우 간단하기 때문에 (공백 최소화 및 가변 이름 바꾸기) 아마도 더 짧을 수 있지만 아직 다른 답변이 없으므로 지금은 그대로 두겠습니다.


<1 일 안에 다른 답변을 보지 않기 때문에 현상금을받습니다. 대답 해 주셔서 감사합니다. 골프를 계속하십시오!
Rɪᴋᴇʀ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.