Bodenplanung!

11

Haftungsausschluss: Die in dieser Frage erzählte Geschichte ist völlig fiktiv und wurde ausschließlich zum Zweck der Bereitstellung eines Intro erfunden.

Ich habe einen Freund, der Architekt ist, und nachdem er ihm das Konzept des Code-Golfs und diese Seite erklärt hatte, sagte er, dass ich etwas programmieren sollte, das für eine Änderung tatsächlich nützlich ist. Ich fragte ihn, was er für nützlich halten würde, und als Architekt antwortete er, dass er gerne einen Grundrissplaner hätte, der ihm alle möglichen Vorkehrungen für Räume bestimmter Größen in einem Haus einer bestimmten Größe treffen würde. Ich dachte, ich würde beweisen, dass Code-Golf doch nicht nutzlos ist, und ihm dieses Programm in der kleinstmöglichen Anzahl von Bytes geben.

Deine Aufgabe:

Schreiben Sie ein Programm oder eine Funktion, die, wenn ein Array D die Abmessungen des gesamten Hauses enthält, und ein zweites Array R, das die Abmessungen der Innenräume enthält, alle möglichen Konfigurationen der Räume im Haus als ASCII-Kunst ausgibt.

Alle Räume und die Außenwände des Hauses sollten als Standard-ASCII-Boxen mit dem | gestaltet werden Symbol für vertikale Wände, das Symbol - als horizontale Wände und das Symbol + für Ecken. Ein Haus mit den Abmessungen [4,4] sieht beispielsweise folgendermaßen aus:

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

Wie Sie sehen können, zählen Ecken nicht als Teil einer Reihe von Bemaßungen. Die Anzahl von - oder | Zeichen, die eine Seite bilden, sollten der in den Abmessungen angegebenen Zahl entsprechen. Die Zimmer können sich Wände teilen oder Wände mit dem Haus teilen. Ein Raum darf keine kleineren Räume in sich enthalten.

Zum Beispiel die Konfiguration

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

gilt für D = [5,8] und R = [[2,2], [2,3]].

Eingang:

Zwei Arrays, von denen eines zwei Ganzzahlen enthält, die Abmessungen für das Haus, und das andere eine Reihe von Arrays enthält, die die Abmessungen für Räume enthalten.

Ausgabe:

Entweder ein Array aller möglichen Häuser als Zeichenfolgen oder eine Zeichenfolge mit allen möglichen Häusern, die auf konsistente Weise abgegrenzt sind. Beachten Sie, dass Rotationen mit genau derselben Konfiguration nur einmal gezählt werden sollten.

Testfälle:

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

Wertung:

Dies ist , niedrigste Punktzahl in Bytes gewinnt!

Greif
quelle
Zählt die Spiegelung zur selben Konfiguration?
Nein. Sie müssen gespiegelte Konfigurationen reproduzieren.
Gryphon
4
Ihr erster Testfall ist nicht falsch? D = [4,2], aber dein Haus ist [4,3], nicht wahr?
HatsuPointerKun
@HatsuPointerKun, danke, dass du diesen Tippfehler gefunden hast. Es ist jetzt behoben.
Gryphon
2
Es ist in der Tat eine bekannte Tatsache, dass Architekten die meisten ihrer Entwürfe mit ASCII-Kunst in Notepad machen.
Sanchises

Antworten:

2

Python 2 , 625 607 602 563 551 Bytes

  1. -5 Bytes dank Mr.Xcoder.
  2. -12 Bytes beim Vermeiden von Tiefkopien.
  3. -39 Bytes mit einigen Listenvereinfachungen.
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)

Probieren Sie es online aus!

Einige Erklärungen Es ist ein gieriger Ansatz:

  1. Finden Sie alle Positionen, an denen der erste Raum zugewiesen werden kann
  2. Finden Sie alle möglichen Positionen, an denen der nächste Raum aus dem verbleibenden freien Raum des Hauses zugewiesen werden kann, und so weiter für die anderen Räume.
  3. Wenn dem letzten Raum erfolgreich der Code zugewiesen wurde, wird die Konfiguration ausgegeben, wenn es sich nicht um eine 180 ° -Drehung einer vorherigen Konfiguration handelt.
mdahmoune
quelle
602 Bytes unter Verwendung eines Listenverständnisses.
Herr Xcoder