Планировка этажей!


11

Отказ от ответственности: история, рассказанная в этом вопросе, является полностью вымышленной и придумана исключительно с целью ознакомления.

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

Твое задание:

Напишите программу или функцию, которые, когда дан массив 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 в Notepad.
Санчиз

Ответы:


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.