반투명 상자 그리기


15

참고 : SE 글꼴 이상한 점 때문에 문자열 아트가 끔찍할 수 있습니다. : P :(

사각형의 모서리를 나타내는 4 개의 튜플 목록이 제공되면 반투명 사각형을 순서대로 그립니다.

이 문제를 해결하려면 왼쪽 상단 모서리에서 가장 작은 좌표를, x 축은 오른쪽으로, y 축은 아래쪽으로 증가시켜야합니다.

4 개의 튜플 (x0, y0, x1, y1)또는 직사각형의 왼쪽 상단 및 오른쪽 하단 모서리의 좌표 쌍을 (x0, x1, y0, y1)나타냅니다 (x, y)(직사각형의 두 형식 중 하나를 선택할 수 있지만 일관성이 있어야합니다)

"반투명 사각형"이란 무엇입니까? 이 도전을 위해, 당신은 공백 문자와 대부분의 상자 그리기 문자를 사용할 것입니다; 특히, "굵게"문자를 포함하여 사각형을 그리는 데 사용되는 모든 문자. 반투명 사각형을 그리면 먼저 차지하는 공간의 모든가는 선이 사라지고 모든 굵은 선이 얇아지고 직사각형 자체가 굵은 선으로 그려집니다.

예를 들어, 왼쪽 위와 오른쪽 아래에 사각형을 그리면 다음과 같이 보일 수 있습니다.

┏━━━━┓
┃    ┃
┃    ┃
┃ ┏━━╇━━┓
┃ ┃  │  ┃
┗━╉──┘  ┃
  ┃     ┃
  ┃     ┃
  ┗━━━━━┛

명확하게하기 위해 사각형 내에서 모든 선에 대해 선이 밝게 (굵게-> 얇게-> 없음) 표시됩니다 (예 : 아래쪽을 향하는 선은 위쪽 가장자리에는 영향을 받지만 아래쪽 가장자리에는 영향을 미치지 않음).

테스트 사례

각 테스트 케이스에 대해 몇 줄의 입력 라인이 제공되고 그 뒤에 유니 코드 아트가 제공됩니다.

0 0 5 5
5 5 10 10
3 3 7 7
2 2 8 8

┏━━━━┓     
┃    ┃     
┃ ┏━━╇━━┓  
┃ ┃┌─┴─┐┃  
┃ ┃│   │┃  
┗━╉┤   ├╊━┓
  ┃│   │┃ ┃
  ┃└─┬─┘┃ ┃
  ┗━━╈━━┛ ┃
     ┃    ┃
     ┗━━━━┛

14 5 15 9
13 2 15 16
6 4 15 11


             ┏━┓
             ┃ ┃
      ┏━━━━━━╇━┫
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┃      │ ┃
      ┗━━━━━━╈━┫
             ┃ ┃
             ┃ ┃
             ┃ ┃
             ┃ ┃
             ┗━┛

6 8 10 11
15 12 16 16
14 10 16 16
9 1 15 15

         ┏━━━━━┓ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
         ┃     ┃ 
      ┏━━╉┐    ┃ 
      ┃  ┃│    ┃ 
      ┃  ┃│   ┌╊┓
      ┗━━╉┘   │┃┃
         ┃    │┠┨
         ┃    │┃┃
         ┃    │┃┃
         ┗━━━━╈┩┃
              ┗┷┛

더 많은 테스트 사례를 생성하십시오!

규칙

  • 입력은 4 개의 튜플 목록에 적합한 형식 일 수 있습니다. 입력 한 인덱스 또는 (즉, 왼쪽 위 코너 중 하나가 될 수 있습니다 축을 따라 제로 인덱스 일 수있다 (0, 0), (0, 1), (1, 0), (1, 1).
  • 출력은 설명 된대로 유니 코드 기술이어야합니다. 출력에는 선행 줄 바꿈이 없을 수 있으며 마지막 줄 다음에 줄 바꿈 줄이 최대 하나만있을 수 있습니다. 이 문제의 목적을 위해 후행 공백은 무시됩니다.

코드 포인트

대담하고 가벼운 수평 및 수직 파이프의 범위에 [U+2500, U+2503]있습니다. 다양한 코너 파이프가 범위 내에 [U+250C, U+251C)있습니다. 세 팔 파이프의 범위에 [U+251C, U+253C)있습니다. 네 팔 파이프의 범위에 [U+253C, U+254C)있습니다. 내 프로그램에서 찾을 수있는 나머지 파이프는 실제로 사용되지 않습니다.


이게 정말 아스키 아트인가요? 공백을 제외하고는 ASCII 문자를 사용하지 않습니다.
caird coinheringaahing

@cairdcoinheringaahing ascii-art 정보에서,Typically this uses only 95 printable (from a total of 128) characters defined by the ASCII Standard from 1963.
totallyhuman


여기서 b-w 220-223 문자를 사용할 수 있습니까? 굵은 선 dochome.programbl.com/dochome/sites/default/files/image169.png
Mukul Kumar

1
@MukulKumar 아니요, 정확한 문자를 사용해야합니다. 문자 전체를 인코딩 할 때 바이트 / 문자를 낭비 할 필요가 없으므로 전체 문자 세트의 순열에 대한 중복되지 않은 부분 문자열을 입력으로 사용할 수 있습니다.
HyperNeutrino

답변:


3

파이썬 3 , 289286 바이트

l,u=eval(input())
*_,w,h=map(max,zip(*l))
r=[*map(list,[' '*-~w]*-~h)]
R=range
for x,y,X,Y in l:
 for i in R(x,X+1):
  for j in R(y,Y+1):Q=i<X,y<j,x<i,j<Y;r[j][i]=u[sum(3**o*max(Q[o]*[j in(y,Y),i in(x,X)][o%2]*2,u.index(r[j][i])//3**o%3-Q[o])for o in R(4))]
for l in r:print(''.join(l))

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

(x0, y0, x1, y1)다음과 같이 파이프 그리기 문자와 함께 입력을 4 개의 튜플 목록 으로 가져옵니다." ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

너비 나 높이가 0 인 상자를 지원합니다 (모든 상자 그리기 문자 사용).

이 질문 에 대한 내 대답 을 기반으로 하지만 그림을 그릴 때 기존 상자를 변경하도록 수정되었습니다.

'언 골프 드':

u=" ╶╺╵└┕╹┖┗╴─╼┘┴┶┚┸┺╸╾━┙┵┷┛┹┻╷┌┍│├┝╿┞┡┐┬┮┤┼┾┦╀╄┑┭┯┥┽┿┩╃╇╻┎┏╽┟┢┃┠┣┒┰┲┧╁╆┨╂╊┓┱┳┪╅╈┫╉╋"

#Create array of spaces:
l=eval(input())
w,h=list(map(max,zip(*l)))[2:]
r=[[' ']*w for _ in' '*h]

for x,y,X,Y in l:
 n,m=X-1,Y-1
 for i in range(x,X):
  for j in range(y,Y):
   A,B=j in(y,m),i in(x,n)
   P=(i<n*A,y<j*B,x<i*A,j<m*B)   # Pipe sides of the new box
   Q=(i<n,y<j,x<i,j<m)           # Pipe sides that are inside the new box, and should be thinned.
   # Get new pipe (sides of new box, on top of thinned pipes of existing boxes. (u.index... is existing pipe))
   l=sum(3**o*max(P[o]*2,(u.index(r[j][i])//3**o%3)-Q[o])for o in range(4))
   #Add to 'canvas'
   r[j][i]=u[l]

print('\n'.join(''.join(l)for l in r))

u입력으로 사용할 수 있습니다 .
HyperNeutrino

@HyperNeutrino 감사합니다 :)
TFeld

불필요한 변수를 별표 _,_,w,h=로 바꾸면 바이트를 절약 할 수 있습니다 *_,w,h=.
Jonathan Frech

또한 Q괄호가 필요없는 튜플 할당 은 저장된 바이트 2 개로 Q=(i<X,y<j,x<i,j<Y);대체 될 수 있습니다 Q=i<X,y<j,x<i,j<Y;.
Jonathan Frech


2

자바 스크립트 (ES6), 298 261 바이트

(a,u,m=n=>[...Array(1+Math.max(...a.map(t=>t[n])))])=>m(3).map((_,j)=>m(2).map((_,i)=>u[a.reduce((c,[x,y,v,w])=>i<x|j<y|i>v|j>w?c:(g=n=>c-=c/n%3|0&&n,h=n=>c+=n*(2-(c/n%3|0)),[i>x&&9,i<v].map(j>y&j<w?g:h),[j>y&&3,j<w&&27].map(i>x&i<v?g:h),c),0)]).join``).join`\n`

어디\n 리터럴 개행 문자를 나타냅니다. 유니 코드 사각형 에 대한 내 대답을 기반으로 합니다. 설명 : 공백 문자열 배열을 작성하여 작성합니다. 그런 다음 입력의 모든 상자를 반복하여 각 공백을 처리합니다. 그런 다음 상자 외부에있는 문자는 무시되지만 가장자리 나 내부의 문자는 더 처리됩니다. 캐릭터 (각각 3의 거듭 제곱으로 표시됨)를 구성하는 4 개의 선분 각각에는 3 가지 가능성이 있습니다. a) 세그먼트는 상자 바로 밖에 있으며 무시해야합니다 (3의 거듭 제곱 대신 매개 변수 0을 전달하여 달성). b) 세그먼트는 상자의 가장자리에 있으며 굵게 표시되어야합니다 ( h함수 를 호출하여 달성 ). c) 세그먼트는 상자 안에 놓여 있으며 밝게해야합니다 (g함수). 그런 다음 문자는 유니 코드 문자열로 색인화됩니다. 모든 상자가 처리되면 배열은 개행으로 결합됩니다.

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