Ручки великие и все такое, но когда вы открываете дверь, она всегда вдавливает стены вокруг нее. Мне нужно, чтобы вы взяли вход ASCII искусства комнаты, как это:
+---------+--X --X --+-----+
| \ \ |\ | \ |
| \ \ | \ | \|
| X | \ | X
| / | | \ X
| / | \ /
| / | \ / |
+---X --+-------X------+-----+
И выведите комнату с дверными проемами, вот так:
+---------+--X --X --+-----+
| \ . \ |\ | \.|
| \ \ | \ .| \|
| X | \ | X
| / | |. \ X
| / .| \ /
|. / | .\ / |
+---X --+-------X------+-----+
Спецификация:
- ASCII - зал (вход) будет состоять из
+
,-
, и|
. Эти персонажи чисто косметические; они все могут быть+
с, но это будет выглядеть ужасно. Он также будет содержать петли (X
) и двери (/
или\
). - Двери состоят из
/
или\
. Начиная с символа «шарнир», то естьX
они будут идти прямо по диагонали (изменение 1 вx
и 1 вy
) для 2 или более единиц (символов). Чтобы найти, где разместить дверную дверцу (всегда есть только одна дверная дверь), найдите дверной проем для двери. Дверной проем всегда будет начинаться с одной петли и будет занимать то же количество пробелов, что и длина двери, вверх, вниз, влево или вправо оттуда. Следующим пространством после этого всегда будет стена. Например, в этой двери дверной проем помечен
D
s:\ \ ---DDX-----
Когда найден дверной проем, выясните, нужно ли идти по часовой стрелке или против часовой стрелки, чтобы добраться до двери. Например, в приведенном выше примере двери вы должны идти по часовой стрелке, а в этом - против часовой стрелки:
\ <- \ ) -----X ---
Как только вы знаете, в какую сторону идти, продолжайте идти по ней (игнорируя дверь), пока не дойдете до стены.
Вот визуализация этого для примера двери выше:
Синий - это дверной проем, оранжевый - что вы должны идти по часовой стрелке, а красный продолжает идти по часовой стрелке, пока не будет достигнута стена.
Как только вы достигнете стены, пройдите (длина двери) пробелы от петли (
X
) на этой стене, отодвиньте одно пространство от стены к двери (чтобы вы не поместили дверную стопорку прямо на стену) и вставьте.
там. Вот тот же пример двери, показывающий, как расположена дверная остановка:\ \ . ---DDX12---
Повторите для каждой двери, и выведите результат! Используйте пример ввода в верхней части этого поста в качестве контрольного примера для проверки правильности вашей программы.
Обратите внимание, что вам не нужно обрабатывать двери, которые не подходят к их стенам, такие как:
| / | / | / | / +-X --
Или:
/ / / +-X -- | |
- Это код-гольф , поэтому выиграет самый короткий код в байтах.
Ответы:
Scala, 860 байт
Гольф :
Без гольфа :
Оглядываясь назад, использование ООП было определенно неправильным подходом. Если бы я мог сделать это снова, я бы определенно пошел с кучей жестко закодированных таблиц правды.
источник