การวางแผนชั้น!


11

ข้อจำกัดความรับผิดชอบ: เรื่องราวที่บอกไว้ในคำถามนี้เป็นเรื่องสมมติทั้งหมดและคิดค้นขึ้นเพื่อวัตถุประสงค์ในการให้คำแนะนำ

ฉันมีเพื่อนที่เป็นสถาปนิกและหลังจากอธิบายแนวคิดของ code-golf และเว็บไซต์นี้ให้เขาแล้วเขาบอกว่าฉันควรเขียนโค้ดบางอย่างที่มีประโยชน์สำหรับการเปลี่ยนแปลง ฉันถามเขาว่าสิ่งใดที่เขาคิดว่ามีประโยชน์และในฐานะสถาปนิกเขาตอบว่าเขาจะสนุกกับการวางแผนพื้นที่ให้การเตรียมการที่เป็นไปได้ทั้งหมดสำหรับห้องขนาดบางขนาดภายในบ้านที่มีขนาดที่แน่นอน ฉันคิดว่าฉันจะพิสูจน์ว่า code-golf ไม่ได้ไร้ประโยชน์เลยและให้โปรแกรมนี้แก่เขาด้วยจำนวนไบต์ที่น้อยที่สุดเท่าที่จะเป็นไปได้

งานของคุณ:

เขียนโปรแกรมหรือฟังก์ชั่นที่เมื่อได้รับอาเรย์ D ที่มีขนาดของทั้งบ้านและอาเรย์ที่สองที่มีขนาดของห้องภายในออกเป็นศิลปะ ASCII การกำหนดค่าที่เป็นไปได้ทั้งหมดของห้องภายในบ้าน

ห้องพักทุกห้องและผนังด้านนอกของบ้านควรสร้างเป็นกล่อง 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 art ใน Notepad
Sanchises

คำตอบ:


2

Python 2 , 625 607 602 563 551 ไบต์

  1. -5 ไบต์ขอบคุณ Mr.Xcoder
  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.