사각형에서 대칭 찾기


14

양의 정수 목록을 취하는 프로그램이나 함수를 작성하십시오. 이러한 각 정수는 2D 평면에서 사각형의 측면 길이를 나타냅니다. 각 사각형은 평면의 정수 좌표로 이동할 수 있지만 회전 할 수 없으며 다른 사각형과 겹칠 수 없습니다.

각 사각형에 대해 다른 인쇄 가능한 ASCII 문자를 사용하여 (공백에 사용되는 공간 제외) 프로그램 / 기능은 가로 또는 세로의 반사 대칭 선이있는 사각형의 단일 배열을 인쇄해야합니다. 그러한 배열이 존재하지 않으면 아무것도 인쇄되지 않아야합니다.

사각형은 다른 문자이므로 구별 할 수 있습니다. 모든 사각형의 결합으로 만들어진 모양 만 대칭이어야합니다. 목록에 94 개 이상의 요소가 포함되어 있지 않다고 가정 할 수 있습니다 (94자가 있으므로).

예를 들어 입력이 [2, 1, 2, 2, 2]인 경우 가능한 출력은 다음과 같습니다.

DD--
DD--
Z
FFPP
FFPP

이 모양은 수평선의 반사 대칭 선을 가지고 있습니다. 상단과 하단은 미러 이미지입니다. 다른 가능성은 다음과 같습니다. (사각형을 만질 필요가 없으며 두 개의 사각형이 동일한 문자로 구성되지 않는 한 모든 문자를 사용할 수 있습니다.)

  55
  55
  %%
  %%
@
  HH
  HH
  ((
  ((
       G

     11 33
     11 33

    22   44
    22   44

대칭 선은 다음과 같이 문자 사이의 경계가 될 수도 있습니다 [2, 4].

!!!!
!!!!  ++
!!!!  ++
!!!!

일부 정사각형 집합은 대칭 적으로 배열 할 수 없습니다. 예 [1, 2, 3]:

AAA BB C
AAA BB         (these can't be vertically or horizontally symmetric => no output)
AAA

그리고 사각형 경계가 아닌 경우에도 전체 모양이 대칭 일 수 있습니다. 예를 들어 유효한 출력 [2, 1, 1, 1, 1, 4]은 다음과 같습니다.

AA----
AA----
BC----
DE----

마찬가지로 유효한 출력 [1, 1, 2, 3, 5]은 다음과 같습니다.

44444
44444
44444
44444
44444
33301
33322
33322

노트

  • 입력 목록에는 항상 1에서 94 개의 요소가 있습니다.
  • stdin, command line, text file, function arg와 같은 합리적인 방식으로 입력하십시오. 필요에 맞게 약간 형식을 지정할 수 있습니다 (예 : {1, 2, 3, 4}또는) [1 2 3 4].
  • stdout 또는 유사한 출력. 결과 모양에 대칭 선이있는 한 선행 / 트레일 공간 또는 줄 바꿈은 충분합니다.
  • 대각선의 대칭 선은 포함되지 않습니다 (그렇지 않으면 매우 쉬울 것입니다). 또한 회전 또는 전이가 아닌 반사 대칭이어야합니다.
  • 솔직히이 작업이 얼마나 어려운지 잘 모르겠습니다. 문제의 일부 하위 세트를 해결하는 부분 답변을 게시 할 수 있습니다 (특히 특히 영리한 알고리즘을 과시하려는 경우). 이들은 이길 수 없습니다.
    • 예를 들어, 입력에 항상 하나 이상의 대칭 배열이 있다고 가정 할 수 있습니다 (따라서 같은 목록 [1, 2, 3]은 입력되지 않습니다).
    • 또는 예를 들어 전체 모양뿐만 아니라 사각형 경계가 대칭 인 배열 만 고려할 수 있습니다. 이 경우 [1, 1, 2, 3, 5]출력이 없습니다.
    • 미쳐 가고 싶다면 아이디어를 사각형이나 폴리 아미노 로 확장 할 수 있습니다 .

채점

점수는 프로그램의 크기 ( 바이트) 입니다. 가장 낮은 점수가 이깁니다. Tiebreaker는 먼저 게시 된 답변을 따릅니다.


2
[2, 4, 6, 7, 8, 9, 11, 15, 16, 17, 18, 19, 24, 25, 27, 29, 33, 35, 37, 42, 50, 112]문제에 대한 더 많은 자유가 있기 때문에 다른 솔루션이있을 수 있지만 해결을위한 보너스 포인트 .
Sp3000

답변:


4

파이썬 2, 460 452 437 바이트

exec"""def f(L):
 if[]==L:
  X{2}[map(" ".__lt__,q)for q in G]);Z{2}zip(*X));C=Z==Z[::-1]or X==X[::-1]
  if C:print"\\n".join(map("".join,G))
  return C
 x=L[-1];T=S-x+1;R=range(x)
 for n in range(T*T):
  i=n%T;j=n/T
  if all({1}=" "{0}):
{0}:{1}chr(32+len(L))
   r=f(L[:-1])
{0}:{1}" "
   if r:return r""".format("   for a,b in[(a,b)for a in R for b in R]","G[i+a][j+b]=","=filter(sum,")
L=input()
S=sum(L)
G=[S*[" "]for _ in[0]*S]
f(L)

지금은 가볍게 골프를 쳤지 만 여기에 시작해야 할 것이 있습니다. 나는 exec라인 10과 12에 사용하려고 시도 했지만 어떤 이유로 든 나를 허용하지 않았습니다.

LSTDIN을 통해 목록 을 입력하십시오 ( 예 :) [2, 1, 2, 2, 2]. 이 프로그램은 단순히 사각형에 사각형을 배치 할 수있는 모든 가능성을 시도 sum(L) x sum(L)합니다.

샘플 출력 (압축성을 위해 빈 줄이 제거됨) :

[2, 1, 2, 2, 2]

%%       
%%       
$$       
$$       
"        
##       
##       
!!       
!!      

[2, 4]

""""  
""""  
""""  
""""  
 !!   
 !!   

[2, 1, 1, 1]

$!!  
#!!  
 "   

[1, 1, 2, 3, 5]

%%%%%       
%%%%%       
%%%%%       
%%%%%       
%%%%%       
$$$##       
$$$##       
$$$"!       

[1, 4, 1, 8]

$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
$$$$$$$$      
# """" !      
  """"        
  """"        
  """"        

[8, 1, 4, 1]

$   !!!!!!!!  
    !!!!!!!!  
####!!!!!!!!  
####!!!!!!!!  
####!!!!!!!!  
####!!!!!!!!  
    !!!!!!!!  
"   !!!!!!!!  

(The algorithm starts placing from the last square first, prioritising left then up)

약간 덜 혼란스러운 버전 (452 ​​바이트) :

def f(L):
 if[]==L:
  X=filter(sum,[map(" ".__lt__,q)for q in G]);Z=filter(sum,zip(*X));C=Z==Z[::-1]or X==X[::-1]
  if C:print"\n".join(map("".join,G))
  return C
 x=L[-1];T=S-x+1;R=range(x);V=[(a,b)for a in R for b in R]
 for n in range(T*T):
  i=n%T;j=n/T
  if all(G[i+a][j+b]<"!"for a,b in V):
   for a,b in V:G[i+a][j+b]=chr(32+len(L))
   r=f(L[:-1])
   for a,b in V:G[i+a][j+b]=" "
   if r:return r
L=input()
S=sum(L)
G=[S*[" "]for _ in[0]*S]
f(L)

@ Calvin'sHobbies 방금 빈 행과 열을 제거하는 것을 잊었다는 것을 깨달았습니다 (이는 구성도 보드 와 관련하여 대칭이어야 함을 의미했습니다 ). [1, 1, 2, 3, 5]이제 잘 작동합니다.
Sp3000

아 나는 무차별적인 힘이 영원히 사라지고 있다고 생각했다.
Calvin 's Hobbies

@ Calvin'sHobbies 더 큰 보드에는 적용되지만 추가 제약 조건을 적용하면 상황이 더 악화됩니다 .P
Sp3000

들여 쓰기 트릭을 사용하여 일부 문자를 저장할 수 있다고 생각합니다 .
Calvin 's Hobbies
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.