평면도!


11

면책 조항 :이 질문에서 들었던 이야기는 전적으로 허구이며 소개를 제공하기위한 목적으로 만 고안되었습니다.

저는 건축가 인 친구가 있는데 코드 골프와이 사이트의 개념을 그에게 설명한 후에 실제로 변경에 유용한 코드를 작성해야한다고 말했습니다. 나는 그에게 그가 유용하다고 생각하는 것을 물었고 건축가로서 그는 특정 크기의 집에서 특정 크기의 방에 대해 가능한 모든 준비를 제공하는 평면도를 가질 것이라고 대답했습니다. 코드 골프가 전혀 쓸모가 없다는 것을 증명하고 가능한 한 적은 바이트 수로이 프로그램을 제공한다고 생각했습니다.

당신의 작업 :

집 전체의 크기를 포함하는 배열 D와 실내 공간의 크기를 포함하는 두 번째 배열 R을 제공하면 ASCII 아트로 출력하여 집 내부의 모든 가능한 방 구성을 제공하는 프로그램 또는 함수를 작성하십시오.

집의 모든 방과 외벽은 | 수직 벽의 경우 기호, 수평 벽의 경우-기호, 모서리의 + 기호 예를 들어, 치수가 [4,4] 인 집은 다음과 같습니다.

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

보시다시피 모서리는 치수 세트의 일부로 계산되지 않습니다. -또는 | 변을 형성하는 문자는 치수에 주어진 숫자와 같아야합니다. 방은 벽을 공유하거나 집과 벽을 공유 할 수 있습니다. 방 안에는 더 작은 방이 없을 수 있습니다.

예를 들어, 구성

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

D = [5,8] 및 R = [[2,2], [2,3]]에 유효합니다.

입력:

두 개의 배열 중 하나에는 두 개의 정수, 집의 크기가 있고 다른 하나에는 방의 크기가 포함 된 일련의 배열이 있습니다.

산출:

가능한 모든 주택을 문자열로 배열하거나 가능한 모든 주택을 포함하는 문자열을 일관된 방식으로 구분합니다. 정확히 동일한 구성의 회전은 한 번만 계산해야합니다.

테스트 사례 :

D     R                   ->   Output

[4,3] [[2,1],[4,1]]       -> +-+-+ +-+-+ +-+-+  Note that though there is an option to switch which side the [2,1] room and the [4,1] room are on, doing so would merely be rotating the house by 180 degrees, and therefore these possibilities do not count.  
                             | | | +-+ | | | |
                             +-+ | | | | | | |
                             | | | | | | +-+ |
                             | | | +-+ | | | |
                             +-+-+ +-+-+ +-+-+

[4,7] [[3,1],[4,2],[2,2]  -> +----+--+ +----+--+ +----+--+ +----+--+  There are some more possiblities I didn't feel like adding, but it's the same four again, just with the [4,2] and the [2,2] room switched.  
                             |    |  | |    |  | |    |  | |    |  |
                             |    |  | |    |  | |    |  | |    |  |
                             +---++--+ +--+-+-++ +-+--++-+ ++---+--+
                             |   |   | |  |   || | |   | | ||   |  |
                             +---+---+ +--+---++ +-+---+-+ ++---+--+

채점 :

이것은 이며 바이트 단위의 최저 점수입니다!


미러링은 동일한 구성으로 간주됩니까?

아니요. 미러링 된 구성을 재현해야합니다.
그리폰

4
첫 번째 테스트 사례가 거짓이 아닌가? D = [4,2]하지만 당신의 집 [4,3]은 그렇지 않습니까?
HatsuPointerKun

@HatsuPointerKun, 그 오타를 찾아 주셔서 감사합니다. 이제 수정되었습니다.
그리폰

2
건축가가 메모장에서 ASCII 아트를 사용하여 대부분의 디자인을 수행한다는 것은 실제로 잘 알려진 사실입니다.
Sanchises

답변:


2

파이썬 (2) , 625 (607) 602 563 551 바이트

  1. Mr.Xcoder 덕분에 -5 바이트.
  2. 딥 카피를 피할 때 -12 바이트
  3. 일부 목록 단순화와 -39 바이트.
r,z=range,len
L,C=D;p,q,v,w=['+'],['|'],'*',' '
H=[p+['-']*C+p]
P=[[e[:]for e in H+[q+[w]*C+q]*L+H]]
def g(M,x,y,N):
 m=[e[:]for e in M]
 try:
  for i in r(z(N)):
   for j in r(z(N[0])):
	if v==N[i][j]and w!=M[x+i][y+j]:return[]
	m[x+i][y+j]=m[x+i][y+j]in[w,v,N[i][j]]and N[i][j]or'+'
 except:return[]
 return m
for l,c in R:
 H=[p+['-']*c+p]
 P=[g(U,x,y,[e[:]for e in H+[q+[v]*c+q]*l+H])for U in P for x in r(L+2)for y in r(C+2)]
F=[]
for m in P:
 if[e[::-1]for e in m[::-1]]not in F:F+=[m]
for m in F:
 print
 for e in m:print''.join(e).replace(v,w)

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

약간의 설명 그것은 욕심 많은 접근법입니다.

  1. 첫 번째 방을 할당 할 수있는 모든 위치 찾기
  2. 집의 남은 여유 공간에서 다음 방을 할당 할 수있는 모든 가능한 위치를 찾으십시오.
  3. 마지막 방에 코드가 성공적으로 할당 된 경우 구성이 이전 구성의 180 ° 회전이 아닌 경우 구성을 출력합니다.


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