Perencanaan Lantai!

11

Penafian: Kisah yang diceritakan dalam pertanyaan ini sepenuhnya fiksi, dan diciptakan semata-mata untuk tujuan memberikan intro.

Saya punya teman yang seorang arsitek, dan, setelah menjelaskan konsep kode-golf dan situs ini kepadanya, dia berkata bahwa saya harus memberi kode sesuatu yang benar-benar berguna untuk perubahan. Saya bertanya kepadanya apa yang dia anggap berguna, dan, sebagai seorang arsitek, dia menjawab bahwa dia akan menikmati memiliki perencana lantai yang memberinya semua kemungkinan pengaturan untuk kamar-kamar dengan ukuran tertentu di dalam rumah dengan ukuran tertentu. Saya pikir saya akan membuktikan bahwa kode-golf tidak berguna sama sekali, dan memberinya program ini dalam jumlah byte terkecil yang mungkin.

Tugas Anda:

Tulis sebuah program atau fungsi yang, ketika diberi larik D yang berisi dimensi seluruh rumah, dan larik kedua R yang berisi dimensi kamar interior, keluaran sebagai seni ASCII, semua kemungkinan konfigurasi kamar di dalam rumah.

Semua kamar dan dinding eksterior rumah harus dibentuk sebagai kotak ASCII standar, menggunakan | simbol untuk dinding vertikal, - simbol sebagai dinding horizontal, dan simbol + untuk sudut. Misalnya, rumah dengan dimensi [4,4] akan terlihat seperti:

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

Seperti yang Anda lihat, sudut tidak dihitung sebagai bagian dari serangkaian dimensi. Jumlah - atau | karakter yang membentuk sisi harus sama dengan angka yang diberikan dalam dimensi. Kamar dapat berbagi dinding, atau berbagi dinding dengan rumah. Sebuah ruangan mungkin tidak mengandung kamar yang lebih kecil di dalamnya.

Misalnya saja konfigurasi

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

berlaku untuk D = [5,8], dan R = [[2,2], [2,3]].

Memasukkan:

Dua array, yang satu berisi dua bilangan bulat, dimensi untuk rumah, dan yang lainnya berisi serangkaian array yang berisi dimensi untuk kamar.

Keluaran:

Entah susunan semua rumah yang mungkin sebagai string, atau string yang berisi semua rumah yang mungkin, dibatasi secara konsisten. Perhatikan bahwa rotasi konfigurasi yang sama persis hanya boleh dihitung satu kali.

Kasus uji:

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

Mencetak:

Ini adalah , skor terendah dalam byte menang!

Gryphon
sumber
Apakah mirroring dihitung sebagai konfigurasi yang sama?
Tidak. Anda harus mereproduksi konfigurasi cermin.
Gryphon
4
Kasing uji pertama Anda tidak salah? D = [4,2], tapi rumahmu ada [4,3], bukan?
HatsuPointerKun
@HatsuPointerKun, terima kasih telah menemukan kesalahan ketik itu. Sekarang sudah diperbaiki.
Gryphon
2
Memang fakta yang terkenal bahwa arsitek melakukan sebagian besar desain mereka dengan seni ASCII di Notepad.
Sanchises

Jawaban:

2

Python 2 , 625 607 602 563 551 byte

  1. -5 byte terima kasih kepada Mr.Xcoder.
  2. -12 byte saat menghindari penyalinan dalam.
  3. -39 byte dengan beberapa penyederhanaan daftar.
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)

Cobalah online!

Beberapa penjelasan Ini adalah pendekatan serakah:

  1. Temukan semua posisi di mana ruang pertama dapat dialokasikan
  2. Temukan semua posisi yang memungkinkan di mana ruangan selanjutnya dapat dialokasikan dari ruang kosong yang tersisa di rumah, dan seterusnya untuk kamar lainnya.
  3. Jika ruang terakhir berhasil dialokasikan kode output konfigurasi jika bukan 180 ° -pengaturan dari konfigurasi sebelumnya.
mdahmoune
sumber
602 byte , menggunakan daftar pemahaman.
Tn. Xcoder