Quy hoạch sàn!


11

Tuyên bố miễn trừ trách nhiệm: Câu chuyện được kể trong câu hỏi này hoàn toàn hư cấu và được phát minh chỉ nhằm mục đích cung cấp phần giới thiệu.

Tôi có một người bạn là một kiến ​​trúc sư, và sau khi giải thích khái niệm về môn đánh gôn và trang web này với anh ta, anh ta nói rằng tôi nên viết một cái gì đó thực sự hữu ích cho một sự thay đổi. Tôi hỏi anh ta những gì anh ta cho là hữu ích, và, là một kiến ​​trúc sư, anh ta trả lời rằng anh ta sẽ thích có một kế hoạch sàn cho anh ta tất cả các sắp xếp có thể cho các phòng có kích thước nhất định trong một ngôi nhà có kích thước nhất định. Tôi nghĩ rằng tôi sẽ chứng minh rằng golf-code hoàn toàn không vô dụng, và đưa cho anh ta chương trình này với số byte nhỏ nhất có thể.

Nhiệm vụ của bạn:

Viết chương trình hoặc chức năng, khi được cung cấp một mảng D chứa các kích thước của toàn bộ ngôi nhà và một mảng R thứ hai chứa các kích thước của các phòng bên trong, xuất ra dưới dạng nghệ thuật ASCII, tất cả các cấu hình có thể có của các phòng trong nhà.

Tất cả các phòng và các bức tường bên ngoài của ngôi nhà nên được hình thành dưới dạng hộp ASCII tiêu chuẩn, sử dụng | biểu tượng cho các bức tường thẳng đứng, biểu tượng - là các bức tường ngang và biểu tượng + cho các góc. Ví dụ: một ngôi nhà có kích thước [4,4] sẽ trông như sau:

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

Như bạn có thể thấy, các góc không được tính là một phần của tập hợp các kích thước. Số lượng - hoặc | các ký tự tạo thành một bên phải bằng số được cho trong các kích thước. Phòng có thể chia sẻ tường, hoặc chia sẻ tường với ngôi nhà. Một căn phòng có thể không chứa các phòng nhỏ hơn trong chính nó.

Ví dụ: cấu hình

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

có giá trị cho D = [5,8] và R = [[2,2], [2,3]].

Đầu vào:

Hai mảng, một trong số đó chứa hai số nguyên, kích thước cho ngôi nhà và một trong số đó chứa một loạt các mảng chứa kích thước cho các phòng.

Đầu ra:

Hoặc là một mảng của tất cả các ngôi nhà có thể là chuỗi hoặc chuỗi chứa tất cả các ngôi nhà có thể, được phân định theo một cách nhất quán. Lưu ý rằng các phép quay của cùng một cấu hình chính xác chỉ nên được tính một lần.

Các trường hợp thử nghiệm:

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.  
                             |    |  | |    |  | |    |  | |    |  |
                             |    |  | |    |  | |    |  | |    |  |
                             +---++--+ +--+-+-++ +-+--++-+ ++---+--+
                             |   |   | |  |   || | |   | | ||   |  |
                             +---+---+ +--+---++ +-+---+-+ ++---+--+

Ghi điểm:

Đây là , điểm số thấp nhất tính bằng byte!


Có phản chiếu tính như cùng một cấu hình?

Không. Bạn phải sao chép các cấu hình được nhân đôi.
Gryphon

4
Trường hợp thử nghiệm đầu tiên của bạn không sai? D = [4,2]Nhưng nhà của bạn [4,3]thì không?
HatsuPulumKun

@HatsuPulumKun, cảm ơn bạn đã tìm ra lỗi đánh máy đó. Bây giờ nó đã được sửa.
Gryphon

2
Đó thực sự là một thực tế nổi tiếng rằng các kiến ​​trúc sư thực hiện hầu hết các thiết kế của họ với nghệ thuật ASCII trong Notepad.
Sanchise

Câu trả lời:


2

Python 2 , 625 607 602 563 551 byte

  1. -5 byte nhờ Mr.Xcoder.
  2. -12 byte khi tránh sao chép sâu.
  3. -39 byte với một số đơn giản hóa danh sách.
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)

Hãy thử trực tuyến!

Một số giải thích Đó là một cách tiếp cận tham lam:

  1. Tìm tất cả các vị trí mà phòng đầu tiên có thể được phân bổ
  2. Tìm tất cả các vị trí có thể, nơi phòng tiếp theo có thể được phân bổ từ không gian trống còn lại của ngôi nhà, và như vậy cho các phòng khác.
  3. Nếu phòng cuối cùng được phân bổ thành công, đầu ra mã sẽ cấu hình nếu nó không phải là 180 ° của cấu hình trước đó.


602 byte , sử dụng một danh sách hiểu.
Ông Xcoder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.