Вы должны написать программу или функцию, которая получает строку, представляющую искусство ASCII, в качестве входных данных и выводит или возвращает количество конечных точек во входных данных.
Ввод будет состоять из символов space - | +
(с 0, 2, 2 и 4 конечными точками соответственно) и разрывов строк. Например:
-|++-
+
Два смежных символа связаны и, следовательно, теряют 1 конечную точку каждый в следующих случаях:
-- -+ +- | | + + ++
| + | +
Первый пример имеет
2+2+2+2+1+
3 = 12
конечные точки.
вход
- Ввод будет строка , состоящая из символов пространства,
-
,|
,+
и символ новой строки. - Длина ввода может быть равна 0, и любой вход, соответствующий приведенному выше описанию, действителен (в регулярных выражениях ввод
[ -+|\n]*
). - Трейлинг новой строки не является обязательным.
Выход
- Одно неотрицательное целое число, количество конечных точек.
Примеры
Выходы идут после последнего ряда их входов.
+
4
-|++-
+
12
+--+
| |
+--+
8
| |
+--+-- |||
12
--++
|||--
10
<empty input>
0
|
|
2
--
++--
++
--+
+++ ||
----
30
Это код гольф, поэтому выигрывает самый короткий вход.
["",...s.split("\n"),""]
это дольше @ETHproductionsPython 2, 123
Однопроходной метод. Принимает в качестве ввода строку с переносами строк.
Для горизонталей идея состоит в том, чтобы подсчитать количество горизонтальных сегментов, каждый из которых имеет две конечные точки. Сегмент начинается всякий раз, когда персонаж является одним из
+-
(булевоh
), но предыдущий не является (булевоp
).Для вертикалей мы хотели бы сделать то же самое с транспонированным вводом, просматривая серии
+|
. К сожалению, транспонирование Python действительно неуклюже. Требуется что-то вродеmap(None,*s.split('\n'))
заполнения пробелов, сNone
которыми тоже приходится иметь дело.Вместо этого мы делаем вертикальный подсчет, итерируя по горизонтали. Мы храним список
l
индексов столбцов, которые все еще «работают», то есть где предыдущий символ в этом столбце соединяется вниз. Затем мы делаем то же самое, что и с горизонтальным, считая новые начальные вертикальные сегменты. Когда мы нажимаем на новую строку, мы обрезаем список справа от того места, где мы находимся, поскольку все сегменты справа были разбиты, и сбрасываем текущий индекс на0
.источник
CJam,
666261 байтПопробуйте онлайн в интерпретаторе CJam .
идея
Мы можем вычислить конечные точки следующим образом:
-
s,|
s и+
s на входе.--
s,-+
s,+-
s и++
s в строках.||
с.|+
s,+|
s и++
s в столбцах.Код
источник