상자를 찌르다


17

ASCII 상자는 다음과 같습니다.

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

다음은 동일한 ASCII 상자의 몇 가지 예입니다.

++    +- -+    +-    -+    +- -+    +- -+
++    | - |    | -  - |    | - |    | - |
       | |      | -- |      | |      | |
+-+    | |       |  |        "      | - |
+-+   | - |       ||        | |     +- -+
      +- -+      |  |      |   |
+--+            | -- |      | |     ++
|  |           | -  - |      "      ||
|  |           +-    -+     | |     ||
+--+                       | - |   |  |
                           +- -+   |  |
      --                            ||
     -  -         +-   -+           ||
+-  -    -  -+    | - - |           ++
| --      -- |     | = |
| --      -- |    | - - |
+-  -    -  -+    +-   -+
     -  -
      --

다음 은 복사하기 쉬운 형식으로 모든 테스트 사례 상자에 대한 링크입니다. 순서는 모든 입력과 동일한 순서로 모든 출력이 뒤 따릅니다.

목표는 ASCII 상자를 입력으로 사용하여 묵시 상자를 반환하는 것입니다. 파열 규칙은 다음과 같습니다.

  1. "+"는 절대 바뀌지 않습니다. "-"또는 "|" "+"에 직접 인접
  2. 모서리에서 시작하여 "-"및 "|" 같은 캐릭터보다 모퉁이에 가깝게 한 칸 더 안쪽으로 움직입니다. "-"및 "|" 같은 지점으로 이동하거나 이동하지 않습니다.
  3. "-"와 "-"가 같은 지점으로 이동하면 해당 지점에 "="를 넣으십시오. "|" "|" 같은 지점으로 이동하고 해당 지점에 "를 넣으십시오.이 지점은 반대 방향으로 이동하는 동일한 지점의 각 문자 중 두 개로 간주됩니다.
  4. 두 개의 "-"또는 두 개의 "|" 왼쪽 하단의 예와 같이 서로를 지나갈 수 있습니다.
  5. 상자가 충분히 마른 경우 같은 방법으로 바깥쪽으로 확장되기 시작하고 항상 시작 부분에서 멀어 지도록 이동합니다.
  6. 결과는 중심선을 가로 질러 x 및 y 방향으로 대칭이어야합니다 (줄 바꾸기 무시). 여기에는 공백이 포함되므로 결과를 만족시키기 위해 공백으로 채워야 할 수도 있습니다.

규칙 세부 사항 :

  1. 이것은 코드 골프이므로 바이트 단위의 가장 짧은 프로그램이 승리합니다.
  2. 표준 허점이 적용됩니다.
  3. 각 줄이 줄 바꿈 문자로 끝나는 것으로 가정 할 수 있습니다.
  4. 입력 문자열의 유일한 문자는 "+", "-", "|", ""및 "\ n"(줄 바꿈)이며 출력 문자열은 "="를 추가하여 동일한 규칙을 따라야합니다. 와 "는 가능한 문자입니다.
  5. 마지막 줄의 끝에 하나의 후행 줄 바꿈을 선택적으로 가질 수 있습니다.
  6. 처리해야 할 가장 작은 ASCII 상자가 왼쪽 위의 예입니다. 모든 ASCII 상자의 모서리에는 정확히 4 개의 "+"가 있습니다.
  7. (가장 큰 문자열 크기 ) 와 같은 m x n정수 의 크기 상자를 처리해야합니다.m,n2<=m,n<256255*(255+1)
  8. 항상 유효한 단일 ASCII 상자를 입력으로 사용한다고 가정 할 수 있습니다.

난 당신이 규칙 세부 사항의 숫자 4에 출력에 가능한 문자로 "를 추가하는 것을 잊었다 고 생각합니다. 편집 : 입력에 빈 줄이 없다고 가정 할 수 있습니까?
Theraot

그 1x6 예제는 펑키합니다. 왜 외부로 퍼져 있습니까? 나는 ||그 예에서 그 중 하나가 "뭔가 일 필요가 있다고 생각 합니다.
Magic Octopus Urn

@carusocomputing 왼쪽 아래의 예와 같이 벽은 서로를 통해 움직입니다 (상자 부피가 음수 임) – 규칙 4와 5
Lyth

@Lyth는 여전히 그래야하지 "않습니까? "3 와이드 이상에서만 나타나는 것 같아요 ?
Magic Octopus Urn

@carusocomputing 이것을 고려하십시오 : 어디로 "갈 것인가? 왼쪽 또는 오른쪽? 둘 다 될 수는 없지만 결과가 대칭이기 때문에 둘 중 하나 일 수 없습니다.
HyperNeutrino

답변:


15

파이썬 (2) , 591 (555) 545 527 525 496 436 351 334 333 303 바이트

s=input()
w=len(s[0])
h=len(s)
V=max(0,w/2-h)
H=max(0,h/2-w)
p=[[' ']*w]*V
q=[' ']*H
s=[q+k+q for k in p+s+p]
d,c=' -=',' |"'
exec"c,d,V,H,w,h=d,c,H,V,h,w;s=map(list,zip(*s))[::-1]\nfor j in range(h-4):q=s[V+j+2];q[H]=c[q[H]==c[2]];r=H+min(j+1,h-4-j);q[r]=c[1+(q[r]>' ')]\n"*4
for x in s:print''.join(x)

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

편집 : 내 오래된 방법은 먼저 상단과 하단을 내포 한 다음 왼쪽과 오른쪽을 내 렸습니다. 대신, 우리는 윗부분을 내밀고 90도 회전하여 4 번 할 수 있습니다. 또한 사용자 친화적 인 코드를 사용하고 있었 으므로이 입력 [['+', '-', '-', '-', '-', '-', '+'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['|', ' ', ' ', ' ', ' ', ' ', '|'], ['+', '-', '-', '-', '-', '-', '+']]은 프로그램의 추악하지만 짧은 형식이어야합니다 .P

사람이 읽을 수있는 입력을 컴퓨터가 읽을 수있는 입력으로 변환하는 데 사용되는 TIO 링크의 헤더 코드에 대한 Leaky Nun의 공로입니다.

Leaky Nun 덕분에 -85 바이트!
top-implosion에서 left-implosion으로 전환하여 -17 바이트로 전체 행을 변수에 저장하고 수정할 수 있습니다. 제안 해 주신 Leaky Nun에게 감사드립니다!
공백을 제거하기 위해 주변을 전환하여 -1 바이트.
Leaky Nun 덕분에 -30 바이트!


몇 바이트를 절약하기 위해 변수에 대입 s[0]및 할당S[0]
caird coinheringaahing

@Ilikemydog 아, 맞아. 감사!
HyperNeutrino

당신은 대체 할 수 p=s[0]P=S[0]p=z(s[0])P=z(S[0])각각 다음 모든 사건 교체 z(p)p및 모든 z(P)으로 P할인율 18 바이트.
R. Kap

또한 대체 할 수 (z(s)-1)/2-pz(s)/2-.5-p(p-1)/2-z(s)p/2-.5-z(s)2 바이트 이상을 저장합니다.
R. Kap

@ R.Kap 아 그래. 두 가지 제안에 감사드립니다!
HyperNeutrino 2016 년

1

C (클랑) , 693 바이트

가독성을 위해 새로운 줄이 추가되었습니다. 처음 두 개는 필수이지만 나머지는 그렇지 않습니다.

#define P B[i][l]
#define m malloc(8)
I(B,h,V,S,J,Z,i,j,l,n,H,W,c,C,a,z,_,L,G,u,N,M)char**B,**Z;char*L,*G,*u;{
V=strlen(B[0]);
S=J=0;
Z=m;
for(i=0,j=h-1;i<h/2+h%2;i++,j--){
for(l=0,n=V-1;l<V/2+V%2;l++,n--){
if(P!=43&&((B[i][l-1]!=43&&i<1)||(B[i-1][l]!=43&&l<1))){
H=P==45;
W=P=='|';
P=B[j][l]=B[i][n]=B[j][n]=32;
if(H){
c=(N=i+l-1)==(M=j-l+1)?61:45;
if(M<0)L=m,sprintf(L,"%*s",V,""),L[l]=L[n]=c,Z[J]=L,J++;
else B[N][l]=B[N][n]=B[M][l]=B[M][n]=c;
}
if(W){
c=(N=l+i-1)==(M=n-i+1)?34:'|';
if(M<0)G=m,sprintf(G,"|%*s%s%*s|",i-n-2,"",B[i],i-n-2,""),B[i]=B[j]=G,S++;
else B[i][N]=B[j][N]=B[i][M]=B[j][M]=c;
}
}
}
}
for(a=-J+1;a<=h+J;u=a<1?Z[-a]:a<=h?B[a-1]:Z[a-h-1],C=S+1-strlen(u)/2,printf("%*s%s\n",C>0?C:0,"",u),a++);
}

큰 도전에 감사드립니다! 꽤 까다로 웠지만 여전히 많은 재미가있었습니다.

이 명령은 입력을 명령 행 인수로 사용하여 암시 된 상자의 여러 행 문자열을 STDOUT에 출력합니다. 언제나 그렇듯이 골프 팁은 대단히 높이 평가됩니다.

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

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