преамбула
В уценке Stack Exchange мы используем ** для выделения текста. Например, эта уценка:
The **quick brown fox jumps over the lazy** dog.
Представляет как:
Булки через ленивую собаку.
Конечно, мы используем **, чтобы закрыть смелость, а также. Так что меньше ответа будет жирным. Например:
The **quick** brown fox jumps over the **lazy** dog.
Представляет как:
Быстро коричневая лиса перепрыгивает через ленивую собаку.
Однако, если жирность не закрыта, она отображается как не жирная :
The **quick brown fox jumps over the lazy dog.
Представляет как:
Быстрая коричневая лиса прыгает через ленивую собаку.
Если текст имеет одну обратную косую черту \
, жирность также не вступает в силу:
The \**quick brown fox jumps over the lazy dog.**
Представляет как:
Быстрая коричневая лиса прыгает через ленивую собаку.**
Конечный пробел приводит к появлению пустого текста (обратите внимание, пробел после коричневого цвета - это одна вкладка):
The** quick** brown fox jumps over the lazy dog.**
Представляет как:
Быстрая коричневая лиса прыгает через ленивую собаку.**
Мы также можем использовать __ для жирного шрифта, но учтите, что одновременно может быть активен только один. Вот более сложный пример:
The __quick**__ brown **fox__ jumps** over__ the__ lazy **dog.
Представляет как:
Быстро ** коричневый fox__ скачка over__ the__ ленивого ** собаки.
Вопрос:
Вы можете написать программу или функцию, данный текст ASCII либо в качестве String
аргумента или на STDIN, где только специальные символы **
, __
, \
(для выхода) и конечные пробелы, определить , сколько символов полужирный есть. Это значение должно быть напечатано в STDOUT или возвращено из вашей функции. Вам не нужно поддерживать очень длинные строки; Длина строки гарантированно не должна превышать 30K
, что является пределом для сообщения Stack Exchange.
Хорошая печать:
- Могу ли я выдать исключение / другую ошибку для одного случая и вернуть нормально для другого?
- Нет. Это должно быть либо ясное, однозначное, не ошибочное возвращаемое значение для обоих случаев. Вывод STDERR будет игнорироваться.
- Являются ли пробелы между словами жирными?
- Да.
**quick brown**
имеет 11 смелых символов в нем.
- Да.
- Если
\
в\**
, если жирным шрифтом, подсчитываются?- Нет. Он отображается как **, поэтому, если он будет выделен жирным шрифтом, он будет содержать только 2 символа.
- Будьте совершенно ясны: что вы подразумеваете под количеством символов?
- Всего символов, которые будут выделены жирным шрифтом. Это означает , что
**
это не оказало , если он преобразует текст, но оказывается , если он не делает. - Обратите внимание, что это можно сделать
**
жирным шрифтом несколькими способами, например**\****
-> ** . - Не думайте, что какой-то текст может быть переведен в курсив. Только уценки правило рассмотреть ** = полужирный *.
- Всего символов, которые будут выделены жирным шрифтом. Это означает , что
- На Stack Exchange работает HTML Bold. то есть <b> </ b>
- Да, я в курсе. Не рассматривайте этот случай, это обычный текст.
- А как насчет HTML? например
<
-><
- Они также должны рассматриваться как обычный текст, здесь нет преобразования сущностей HTML.
- Я подумал о примере, который вы не описали выше!
- Правила действуют точно так же, как если бы текст был размещен на Stack Exchange в ответе (не в комментарии), за исключением того, что блоки кода не считаются специальными символами . И четыре типа пробела и тип обратного удара. Если вы не уверены в том, как должен отображаться текст, просто бросьте его в поле для ответов где-нибудь в качестве теста, вот правила, которым вы должны следовать.
Примеры:
Входные данные:
The **quick brown fox jumps over the lazy** dog.
Выход:
35
Входные данные:
The **quick brown fox jumps over the lazy dog.
Выход:
0
Входные данные:
The __quick**__ brown **fox__ jumps** over__ the__ lazy **dog.
Выход:
18
Входные данные:
The __quick\____ brown fox **jumps over\** the** lazy \**dog.
Выход:
23
Входные данные:
The****quick brown fox****jumps over **the****lazy** dog.
Выход:
11
Стандартные лазейки запрещены.
18
Правильно ли для третьего контрольного примера?**fox__ jumps**
прекращает этот конкретный жирный шрифт.\**
или\__
являются трехсимвольными escape-последовательностями, но в StackExchange есть только двухсимвольные escape-последовательности\*
или\_
. Так что\***a**
выдает звездочку, за которой следует жирный шрифтa
. Есть еще один побег\\
. Должны ли мы справиться с этим?Ответы:
RS , 107 байт
Живая демоверсия и тестовые случаи.
Это довольно сумасшедшая ... вещь.
Новейший контрольный пример еще не работает. WIP ...
объяснение
Замените табуляцию пробелами. Они имеют одинаковое количество символов, а вкладки позже используются как специальные символы.
Замените любой текст длиной,
N
который должен быть выделен жирным шрифтом, сN
новыми строками, за которыми следует исходный текст.Замените все вхождения разделителя, которому непосредственно предшествует косая черта, знаком табуляции. Это сделано для того, чтобы записи, подобные записям,
**a\***
имели количество символов 2 вместо 3.Удалите любой символ, который не является символом табуляции или новой строки.
Замените все символы новой строки подчеркиванием.
Удалите все вкладки (которые представляют экранированные разделители), а также любые подчеркивания, которые могут следовать за ними. Это связано с вышеупомянутой проблемой количества символов с разделителями в конце.
Замените последовательность подчеркивания его длиной. Это количество символов.
источник
**a****b**
выходы 2, должно быть 6. См .: a **** bPython: 133 символа
Это должно работать одинаково как в Python 2, так и в 3. Функция
f
возвращает количество символов, выделенных жирным шрифтом, которые будут в строке, которую передают при форматировании системой уценки в Stack Overflow.Я думаю, что я правильно понимаю большинство угловых случаев (включая все те, которые упоминались в комментариях до сих пор), но это все еще не совсем идеально. Я не понимаю, почему
x***x**
не отображает*x
жирным шрифтом (как***x**
делает), поэтому мой код будет по крайней мере несколько неверных входных данных.Код состоит из четырех основных шагов. Первый выполняет замену любого обратного слеша регулярным выражением, за которым следует любой символ с символом «x». Второй шаг заменяет любую последовательность из четырех звездочек или подчеркиваний четырьмя символами «х». Третий шаг использует регулярное выражение,
findall
чтобы найти все блоки, которые будут выделены курсивом. Последний шаг - выражение генератора внутриsum
вызова, которое складывает длины этих блоков, вычитая по 4 символа из каждого, так как мы не хотим включать разделители в наш счетчик.Вот некоторые результаты теста:
источник
x***x**
не работает в поле ввода. ПричудливыйJavaScript ES6, 91 байт
Разбирается со всеми побегами до этого, затем использует регулярное выражение. Много возможностей для игры в гольф.
объяснение
источник
**a*b*c**
это возвращает 9, что я считаю неверным. Реальное количество составляет 5 (или 3, если вы принимаете во внимание курсив, что в соответствии с ОП не следует).