смотреть! Это лабиринт ASCII! Су кулзоры, амазонки и прочее.
+-+-----+---+
| | | |
| | ++ | |
| | ++ +-+ |
| | |
+-------+ | |
| | |
+---------+-+
Но, но, но ... тяжело понять, в каком направлении движутся все части лабиринта. Я просто хочу нарисовать макет лабиринта и сделать себя супер-куль без нагрузки времени.
Что если бы я мог просто нарисовать это в ...
#############
# # # #
# # ## # #
# # ## ### #
# # #
######### # #
# # #
#############
Это было бы так мило!
Правила (потому что правила это охлаждение):
- Напишите код для преобразования строки в ascii-лабиринт и вывода результата.
- Любой непробельный символ будет читаться как стена.
- Каждый символ стены будет определять, какой персонаж будет основан на его соседях (только в северном, южном, восточном и западном направлениях).
- Если у символа нет соседей, не являющихся пробелами, это будет знак плюс (+).
- Если у символа есть соседи как в вертикальном (север-юг), так и в горизонтальном (восток-запад) направлениях, это будет знак плюс (+).
- Если символ имеет соседей только в вертикальном (север-юг) направлении, он будет символом трубы (|).
- Если у символа есть соседи только в горизонтальном (восток-запад) направлении, это будет знак минус (-).
- Входные данные могут быть одной строкой (со строками, разделенными символами новой строки, или массивом строк).
- Все входные символы будут печатными символами ASCII, вам не нужно иметь дело с расширенными кодировками.
- Используйте любой старый язык, пожалуйста.
- Если перед строкой есть пробел, он должен быть одинаковым в каждой строке. Любой пробел после каждой строки вывода в порядке.
- Попытайтесь решить это с наименьшим количеством байтов.
Тестовые случаи:
1: рамка
Входные данные:
##########
# #
# #
# #
##########
Выход:
+--------+
| |
| |
| |
+--------+
2: классический лабиринт
Входные данные:
#################
# #
# ##### # ##### #
# # # # # #
# # # # ##### # #
# # # # #
### # ####### # #
# # # # # #
# ### # ## # ##
# # ## #
#################
Выход:
--------+-------+
| |
| --+-+ | ----+ |
| | | | | |
| + | | +---- | |
| | | | |
+-- | +----+- | |
| | | | | |
| --+ | ++ | -+
| | ++ |
+-----+-++----+--
3: Зеленые яйца, человек.
Входные данные:
I do not like green eggs and ham.
I do not like them, sam I am.
Would you like them here or there?
I would not like them anywhere!
Выход:
| ++ +++ ++++ +++++ +++- -++ ----
| ++ +++ ++++ +++++ +++ + +++
+-+++ +++ ++++ ++++ ++++ ++ +++---
| +++-+ +++ ++++ ++-+ +++++++++
4: Сосульки
Входные данные:
Word Icicle!
Word Icicle
Word cicle
ord cicle
ord icle
ord i le
or i le
or i l
or l
or
r
Выход:
++++ ++++++-
++++ ++++++
++++ +++++
+++ +++++
+++ ++++
+++ | ++
++ | ++
++ | |
++ |
++
|
---
?-
s или почему у классического лабиринта нет четырех+
s в нижнем ряду.smallest number of characters
, а не байты?+
в середине 1-го ряда 2)!
Сосульки должны быть заменены на-
. Не могли бы вы еще раз проверить эти?whitespace
, ты имеешь в виду просто пространство? Я не хочу поддерживать вкладки, и вы, вероятно, не хотите, чтобы я также трансформировал переводы строкОтветы:
APL (Dyalog Unicode) ,
5735 байт SBCS–22 благодаря новому решению от ngn .
Анонимная молчаливая функция, принимающая символьную матрицу в качестве аргумента.
Попробуйте онлайн!
{
… В}⌺3 3
каждом районе 3 на 3 примените следующую функцию:,⍵
Равель (сплющить)' '≠
Логическое, где не пробел⍱∘⌽⍨
что NOR все наоборот (вкл. ни сверху, ни снизу, ни слева, ни справа)5 4 2⊃¨⊂
выбрать 5- й , 4- й и 2- й элементы из этого списка,то есть пустое «я», без вертикали, без горизонтали
2⊥
оценивать в base-2 (двоичное),т.е. ≥4: пустое «я»; 3: нет соседей; 2: нет горизонтальных соседей; 1: нет вертикали; 0: имеет оба
'+-|+'↓⍨
уронить , что многие элементы из этой строки ,т.е. пустых себя:
; один
+
:; вертикальный сосед (ы) только:|+
; горизонтальный-|+
:; и то и другое:+-|+
⊃
выбрать первый элемент (pad с пробелом, если они недоступны),т.е. пустое self
+
:; вертикальный сосед (ы) только:|
; горизонтальный-
:; и то и другое:+
Старое решение
Анонимная молчаливая функция, принимающая символьную матрицу в качестве аргумента.
Попробуйте онлайн!
{
… В}⌺3 3
каждом районе 3 на 3 примените следующую функцию:,⍵
Равель (сплющить)(
…)/
Фильтровать, используя следующую маску:9⍴0 1
циклически изменить[0,1]
до длины 9 (выбирает N, W, E, S)' '≠
Логическое, где не пробел1⌽
поверните на один шаг влево;[W,E,S,N]
2 2⍴
преобразовать в матрицу 2 на 2;[[W,E],[S,N]]
∨/
построчное ИЛИ сокращение:[horizontal,vertical]
(
…)
Применить следующую молчаливую функцию:⊢
личность;[horizontal,vertical]
∧/,
предшествует его сокращение И;[both,horizontal,vertical]
(
…),
Добавьте следующее:,⍵
расплющить окрестности5⊃
выбрать 5- й элемент (сам)' '=
Булево, если пробел (т.е. пустой)Теперь у нас есть
[empty,both,horizontal,vertical]
1⍳⍨
индекс крайнего левого 1 (дает 5, если соседей нет вообще)' +-|+'⊃⍨
используйте это, чтобы выбрать символисточник
JavaScript (ES6), 110 байт
Формат ввода / вывода: массив строк.
Попробуйте онлайн!
Или 108 байтов , используя вместо этого матрицу символов.
источник
Python 2 ,
181168 байтспасибо Leaky Nun за -13 байтов
Попробуйте онлайн!
источник
MATLAB,
113110101 байтПреобразует входные данные в логические, применяет свертку по горизонтали и вертикали и объединяет выходные данные для создания соответствующих символов.
@Adriaan сохранил 3 байта для сообщения, что вы можете засорять вывод в PPCG: P
9 байтов сохранено благодаря многочисленным комментариям @flawr!
источник
J ,
4947 байтСпасибо FrownyFrog за -2 байта!
Попробуйте онлайн!
источник
Retina 0.8.2 , 92 байта
Попробуйте онлайн! Требуется прямоугольный ввод. Ссылка включает в себя тестовые случаи. Объяснение:
Измените все не пробелы на
0
s.Найдите все
0
s с другим0
непосредственно выше или ниже в том же столбце и измените их на 1. Теперь1
s - это места с вертикальными соседями, в то время как у0
s нет вертикальных соседей.Ищите все цифры без горизонтальных соседей. У
0
s тоже нет вертикальных соседей, поэтому они становятся+
s, а у1
s вертикальные соседи, поэтому они становятся|
s.Остальные цифры имеют горизонтальных соседей. У
1
s также есть вертикальные соседи, поэтому они становятся+
s, в то время как у0
s есть только горизонтальные соседи, поэтому они становятся-
s.источник
Python 3 , 336 байт
Попробуйте онлайн!
Мне пришлось использовать много кода, чтобы справиться с ошибками в крайнем случае.
источник
C (gcc) , 143 байта
Попробуйте онлайн!
Функция f изменяет массив строк на месте. Область вокруг массива должна быть дополнена пробелами (немного ограничена). Хотя это не совсем соответствует требованиям, используемым большинством решений, оно соответствует правилам, если мы говорим, что представляем новую строку с двумя пробелами (и принимаем массив строк, оканчивающихся на новые строки).
Ungolfed
Это было забавное испытание арифметики указателей. Используя итерацию указателя в стиле C, легко получить горизонтальных соседей, но вертикальные были более жесткими. К счастью, указатель y все еще присутствует (что указывает на начальное значение z), поэтому я могу вывести из него свой индекс и использовать его для доступа к тому же элементу в другой строке. Это было очень неправильно писать,
y[-1][z-*y]
поскольку это бросает вызов любому разумному стилю!источник