Python 2.6 (251 символ)
Я немного опоздал, во всяком случае, повеселился.Python, используя регулярные выражения.Чтобы сохранить оператор print и остаться короче, чем у Fredb219, он ничего не напечатает, если вы запустите его как скрипт, но если в интерпретаторе вводить по одной строке за раз, это покажет результат.Не очень надежный, он не будет обрабатывать вложенные блоки и в большинстве случаев более сложный, чем те, которые дает DavidX.Не закончил тестирование, но я думаю, что он может показывать результаты в неправильном порядке, если происходит что-то «странное».
import re
l,a,o=s.index("\n")+1,re.finditer,sorted
o(o(set((m.start(),m.end())for m in a(r'\+-* *-*\+',s)for n in a(r'\|.+\|',s)if(m.start()%l,m.end()%l)==(n.start()%l,n.end()%l)if m.start()+l==n.start()or m.start()-l==n.start())),key=lambda x:x[0]%l)
Ввод - одна строка, строки (все одинаковой длины), разделенные новой строкойперсонаж.Результатами являются срезы строк сверху и снизу для каждого «хорошего» прямоугольника, начиная сверху слева.Это также позволяет «сломанные» коробки (то есть с некоторым пространством в середине одной стороны, не без одной целой стороны).Это был просто способ исправить нежелательное поведение, создав много новых побочных эффектов!:-)
ввод:
>>>s = """+-+ +--+ +--+
| | | | | |
+-+ | | + -+
| |
+--+ +-+
+--+ |
+--+ +-+ """
или:
>>>s = "+-+ +--+ +--+\n| | | | | |\n+-+ | | + -+\n | | \n +--+ +-+ \n +--+ | \n +--+ +-+ "
затем:
>>>import re
>>>l,a,o=s.index("\n")+1,re.finditer,sorted
>>>o(o(set((m.start(),m.end())for m in a(r'\+-* *-*\+',s)for n in a(r'\|.+?\|',s)if(m.start()%l,m.end()%l)==(n.start()%l,n.end()%l)if m.start()+l==n.start()or m.start()-l==n.start())),key=lambda x:x[0]%l)
вывод:
[(0, 3), (30, 33), (4, 8), (64, 68), (10, 14), (40, 44)]
т. (0,3) верх 1-го ящика (30,33) дно того же ящика, (4,8) верх второго ящика и т. Д.