Наскільки сміливий цей пост?


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, що є обмеженням для публікації стека.

Дрібний шрифт:

  • Чи можу я викинути виняток / іншу помилку для одного випадку та повернутись нормально для іншого?
    • Ні. Це повинно бути або чітким, однозначним, непомилковим значенням повернення для обох випадків. Вихід STDERR буде ігнорований.
  • Чи пробіли між словами вважаються жирними?
    • Так. **quick brown**в ньому є 11 жирних символів.
  • Чи слід рахувати \в \**, якщо жирним шрифтом?
    • Ні. Він відображається як **, тож якщо його слід виділити жирним шрифтом, він буде мати лише два символи.
  • Будьте абсолютно зрозумілі: що ви маєте на увазі під кількістю символів?
    • Усього символів, які відображатимуться жирним шрифтом. Це означає, що **він не відображається, якщо він перетворює текст, але він надається, якщо він не робить.
    • Зауважте, що можна зробити **жирним шрифтом декілька способів, наприклад **\****-> ** .
    • Не враховуйте можливість того, що якийсь текст може бути перетворений курсивом. Тільки уцінки правило розглянути ** = напівжирний *.
  • На Stack Exchange працює і HTML Bold. тобто <b> </b>
    • Так, я знаю. Не враховуйте цей випадок, це звичайний текст.
  • Що з HTML-елементами? наприклад &lt;-><
    • Вони також повинні розглядатися як звичайний текст, немає перетворення сутності HTML.
  • Я придумав приклад, якого ви не наводили вище!
    • Правила функціонують точно так, як якщо б текст був розміщений на Stack Exchange у відповіді (а не коментарі), за винятком того, що кодові блоки не вважаються спеціальними символами . Як чотири типу простору, так і тип backtick. Якщо ви не впевнені в тому, як слід викладати текст, просто киньте його у поле відповідей десь як тест, це правила, яких слід дотримуватися.

Приклади:

Вхід:

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 ... Я перегляну свою програму
бета-розпад

@BetaDecay **fox__ jumps**припиняє саме цю напівжирність .
durron597

1
Питання , здається, передбачає , що \**або \__є екранують послідовності трьох символів, але в StackExchange є тільки керуючі послідовності двох символів \*або \_. Так \***a**виходить зірочка, за якою слідує жирний шрифт a. Існує також ще один пагін, \\ . Чи повинні ми впоратися з цим?
feersum

Відповіді:


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

Пітон: 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". Другий крок замінює будь-яку послідовність з чотирьох зірочок або підкреслень чотирма символами "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**не працює у полі введення. Bizarre
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.