Planowanie pięter!

11

Uwaga: Historia opowiedziana w tym pytaniu jest całkowicie fikcyjna i wymyślona wyłącznie w celu wprowadzenia wstępu.

Mam przyjaciela, który jest architektem i po wyjaśnieniu mu koncepcji gry w golfa kodu i tej strony powiedział, że powinienem napisać coś naprawdę przydatnego do zmiany. Zapytałem go, co uzna za użyteczny, a jako architekt odpowiedział, że z przyjemnością skorzysta z planisty podłogi, która zapewni mu wszelkie możliwe aranżacje pomieszczeń o określonych rozmiarach w domu o określonej wielkości. Pomyślałem, że udowodnię, że kod-golf nie był bezużyteczny, i dam mu ten program w jak najmniejszej liczbie bajtów.

Twoje zadanie:

Napisz program lub funkcję, która otrzyma tablicę D zawierającą wymiary całego domu i drugą tablicę R zawierającą wymiary wewnętrznych pomieszczeń, wyprowadzoną jako grafika ASCII, wszystkie możliwe konfiguracje pokoi w domu.

Wszystkie pokoje i ściany zewnętrzne domu powinny być uformowane jako standardowe skrzynki ASCII, przy użyciu | symbol pionowych ścian, symbol - jako poziome ściany oraz symbol + dla narożników. Na przykład dom o wymiarach [4,4] będzie wyglądał następująco:

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

Jak widać, narożniki nie liczą się jako część zestawu wymiarów. Liczba - lub | znaki tworzące bok powinny być równe liczbie podanej w wymiarach. Pokoje mogą dzielić ściany lub ściany z domem. Pokój nie może zawierać w sobie mniejszych pomieszczeń.

Na przykład konfiguracja

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

obowiązuje dla D = [5,8] i R = [[2,2], [2,3]].

Wejście:

Dwie tablice, z których jedna zawiera dwie liczby całkowite, wymiary dla domu, a druga zawiera szereg tablic zawierających wymiary dla pokoi.

Wynik:

Albo tablica wszystkich możliwych domów jako ciągi, albo ciąg zawierający wszystkie możliwe domy, rozdzielone w jakiś spójny sposób. Pamiętaj, że obroty dokładnie tej samej konfiguracji należy policzyć tylko raz.

Przypadki testowe:

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

Punktacja:

To jest , najniższy wynik w bajtach wygrywa!

Gryf
źródło
Czy dublowanie liczy się jako ta sama konfiguracja?
Nie. Musisz odtworzyć konfiguracje lustrzane.
Gryphon
4
Twój pierwszy przypadek testowy nie jest fałszywy? D = [4,2], ale twój dom jest [4,3], prawda?
HatsuPointerKun
@HatsuPointerKun, dziękuję za znalezienie tej literówki. Zostało to naprawione.
Gryphon
2
Jest to dobrze znany fakt, że architekci wykonują większość swoich projektów za pomocą grafiki ASCII w Notatniku.
Sanchises,

Odpowiedzi:

2

Python 2 , 625 607 602 563 551 bajtów

  1. -5 bajtów dzięki Mr.Xcoder.
  2. -12 bajtów podczas unikania głębokiego kopiowania.
  3. -39 bajtów z pewnymi uproszczeniami listy.
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)

Wypróbuj online!

Kilka wyjaśnień Jest to chciwe podejście:

  1. Znajdź wszystkie pozycje, do których można przypisać pierwszy pokój
  2. Znajdź wszystkie możliwe pozycje, w których można przypisać następny pokój z pozostałej wolnej przestrzeni domu i tak dalej dla innych pokoi.
  3. Jeśli ostatnie pomieszczenie zostało pomyślnie przydzielone, kod wyjściowy konfiguruje, jeśli nie jest to obrót o 180 ° w stosunku do poprzedniej konfiguracji.
mdahmoune
źródło
602 bajty , przy użyciu listy.
Pan Xcoder,