Планування поверхів!


11

Відмова: Історія, розказана в цьому питанні, є повністю вигаданою та придумана виключно для того, щоб забезпечити вступ.

У мене є друг, який є архітектором, і, пояснивши йому поняття код-гольф і цей сайт, він сказав, що я повинен кодувати щось дійсно корисне для зміни. Я запитав у нього, що він вважає корисним, і, будучи архітектором, він відповів, що йому сподобається мати планувальник підлоги, який дасть йому всі можливі розташування кімнат певних розмірів в будинку певного розміру. Я думав, що докажу, що код-гольф не виявився марним, і дам йому цю програму в найменшій кількості можливих байтів.

Ваше завдання:

Напишіть програму або функцію, яка при заданому масиві D, що містить розміри всього будинку, та другому масиві R, що містить розміри внутрішніх приміщень, виводять як арт 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 мистецтва в Блокноті.
Санчіз

Відповіді:


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 байти , використовуючи розуміння списку.
Містер Xcoder
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.