フロアプランニング!


11

免責事項:この質問の中で語られたストーリーは完全に架空のものであり、イントロを提供する目的でのみ発明されました。

私には建築家の友人がいて、コードゴルフの概念とこのサイトを彼に説明した後、彼は実際に変更に役立つものをコーディングすべきだと言った。私は彼に何が役に立つと思うかを尋ねました、そして、建築家である彼は、彼が特定のサイズの家の中で特定のサイズの部屋のためのすべての可能な配置を彼に与えたフロアプランナーを持つことを楽しむと答えました。code-golfは結局役に立たないということを証明し、このプログラムを可能な限り最小のバイト数で提供すると思った。

あなたのタスク:

家全体の大きさを含む配列Dと、室内の部屋の大きさを含む2番目の配列Rが与えられたときに、ASCIIアートとして、家の中の部屋のすべての可能な構成を出力するプログラムまたは関数を記述します。

すべての部屋と家の外壁は、標準のASCIIボックスとして形成する必要があります。垂直壁の場合はシンボル、水平壁の場合は-シンボル、角の場合は+シンボル。たとえば、寸法が[4,4]の家は次のようになります。

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

ご覧のとおり、角は一連の寸法の一部としてカウントされません。-または|の数 辺を形成する文字は、寸法で指定された数と等しくなければなりません。部屋は壁を共有したり、家と壁を共有したりできます。部屋には小さな部屋を含めることはできません。

たとえば、構成

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

D = [5,8]およびR = [[2,2]、[2,3]]に有効です。

入力:

2つの配列。1つには家の寸法である2つの整数が含まれ、もう1つには部屋の寸法を含む一連の配列が含まれます。

出力:

文字列として可能なすべての家の配列、または一貫した方法で区切られたすべての可能な家を含む文字列。まったく同じ構成のローテーションは1回しかカウントされないことに注意してください。

テストケース:

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アートで行うことはよく知られている事実です。
-Sanchises

回答:


2

パイソン2625の 607 602 563 551バイト

  1. Mr.Xcoderのおかげで-5バイト。
  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.