Насколько жирным этот пост?


13

преамбула

В уценке 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? например &lt;-><
    • Они также должны рассматриваться как обычный текст, здесь нет преобразования сущностей 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Правильно ли для третьего контрольного примера?
бета-распад

@BetaDecay Это 7 + 11. Как вы думаете, что это должно быть?
durron597

Я получил 28 ... Я посмотрю свою программу
Beta Decay

@BetaDecay **fox__ jumps**прекращает этот конкретный жирный шрифт.
durron597

1
Кажется, вопрос предполагает, что \**или \__являются трехсимвольными escape-последовательностями, но в StackExchange есть только двухсимвольные escape-последовательности \*или \_. Так что \***a**выдает звездочку, за которой следует жирный шрифт a. Есть еще один побег \\ . Должны ли мы справиться с этим?
февраля

Ответы:


5

RS , 107 байт

\t/ 
(?<!\\)((\*|_){2})((?=\S)(?!\2)(\\\2|.)*?)?(?<=\S)\1/(\n)^^((^^\3))\3
\\(\*|_)/\t
[^\t\n]/
\n/_
\t_?/
(_*)/(^^\1)

Живая демоверсия и тестовые случаи.

Это довольно сумасшедшая ... вещь.

Новейший контрольный пример еще не работает. WIP ...

объяснение

\t/ 

Замените табуляцию пробелами. Они имеют одинаковое количество символов, а вкладки позже используются как специальные символы.

(?<!\\)((\*|_){2})((?=\S)(?!\2)(\\\2|.)*?)?(?<=\S)\1/(\n)^^((^^\3))\3

Замените любой текст длиной, Nкоторый должен быть выделен жирным шрифтом, с Nновыми строками, за которыми следует исходный текст.

\\(\*|_)/\t

Замените все вхождения разделителя, которому непосредственно предшествует косая черта, знаком табуляции. Это сделано для того, чтобы записи, подобные записям, **a\***имели количество символов 2 вместо 3.

[^\t\n]/

Удалите любой символ, который не является символом табуляции или новой строки.

\n/_

Замените все символы новой строки подчеркиванием.

\t_?/

Удалите все вкладки (которые представляют экранированные разделители), а также любые подчеркивания, которые могут следовать за ними. Это связано с вышеупомянутой проблемой количества символов с разделителями в конце.

(_*)/(^^\1)

Замените последовательность подчеркивания его длиной. Это количество символов.


**a****b**выходы 2, должно быть 6. См .: a **** b
durron597

1
@ durron597 Я немного смущен тем, как это должно работать. Не могли бы вы добавить объяснение?
kirbyfan64sos

Как я уже сказал, просто поиграйте с ним в панели ответов. **** - это всегда просто звёздочки, которые могут быть выделены жирным шрифтом или не выделены жирным шрифтом на основании другого текста.
durron597

Итак, @ kirbyfan64sos, насколько жирным является пост?
mbomb007

2

Python: 133 символа

import re
f=lambda s:sum(len(x[0])-4for x in re.findall(r'(([_*])\2\S.*?\2\2+)',re.sub(r'([_*])\1\1\1','xxxx',re.sub(r'\\.','x',s))))

Это должно работать одинаково как в Python 2, так и в 3. Функция fвозвращает количество символов, выделенных жирным шрифтом, которые будут в строке, которую передают при форматировании системой уценки в Stack Overflow.

Я думаю, что я правильно понимаю большинство угловых случаев (включая все те, которые упоминались в комментариях до сих пор), но это все еще не совсем идеально. Я не понимаю, почему x***x**не отображает *xжирным шрифтом (как ***x**делает), поэтому мой код будет по крайней мере несколько неверных входных данных.

Код состоит из четырех основных шагов. Первый выполняет замену любого обратного слеша регулярным выражением, за которым следует любой символ с символом «x». Второй шаг заменяет любую последовательность из четырех звездочек или подчеркиваний четырьмя символами «х». Третий шаг использует регулярное выражение, findallчтобы найти все блоки, которые будут выделены курсивом. Последний шаг - выражение генератора внутриsum вызова, которое складывает длины этих блоков, вычитая по 4 символа из каждого, так как мы не хотим включать разделители в наш счетчик.

Вот некоторые результаты теста:

>>> f('The **quick brown fox jumps over the lazy** dog.')
35
>>> f('The **quick brown fox jumps over the lazy dog.')
0
>>> f('The \**quick brown fox jumps over the lazy dog.**')
0
>>> f('The** quick** brown fox jumps over the lazy dog.**')
0
>>> f('The __quick\____ brown fox **jumps over\** the** lazy \**dog.')
23
>>> f('The****quick brown fox****jumps over **the****lazy** dog.')
11
>>> f('\***a**')
1
>>> f('x***x**') # this one doesn't match the Stack Overflow input box
2

Я понятия не имею, почему x***x**не работает в поле ввода. Причудливый
durron597

1

JavaScript ES6, 91 байт

s=>(o=0,s.replace(/\\(.)\1/g,'..').replace(/(\*\*|__)(?=\S)(.*?\S)\1/g,l=>o+=l.length-4),o)

Разбирается со всеми побегами до этого, затем использует регулярное выражение. Много возможностей для игры в гольф.

объяснение

s=>( // Function with argument s
  o=0, // Set var "o" to 0
  s.replace( // Replace...
    /\\(.)\1/g,  // Matches \ followed by two the same characters. g means "global"
    ".." // Replace with two arbitrary characters
  ).replace( // Replace again...
     /(\*\*|__) // Match ** or __, store in "group 1"
       (?=\S)   // Make sure next character isn't whitespace
       (.*?\S)\1  // Match all characters until "group 1".
                  // Make sure last character isn't whitespace
     /g, l=> // Take the match...
       o+= // Increase o by...
         l.length // the length of the match
         - 4 // minus 4 to account for ** and __
  ), o) // Return o

За **a*b*c**это возвращает 9, что я считаю неверным. Реальное количество составляет 5 (или 3, если вы принимаете во внимание курсив, что в соответствии с ОП не следует).
Кристиан Лупаску,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.