这篇文章有多大胆?


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参数或标准输入,其中唯一的特殊字符**__\(转义)和结尾的空白,确定有多少粗体字有。此值应打印到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正确的第三个测试案例?
Beta Decay's

@BetaDecay现在是7 +11。您认为应该是什么?
durron597

我已经28岁了...我要看一下我的程序
Beta Decay

@BetaDecay **fox__ jumps**终止该特定的粗体。
durron597

1
这个问题似乎表明\**或是\__三个字符的转义序列,但是在StackExchange中只有两个字符的转义序列\*\_。因此\***a**产生一个星号,后跟一个粗体a。还有另一个逃生路线\\ 。我们应该处理那个吗?
feersum

Answers:


5

rs,107字节

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

现场演示和测试案例。

这太疯狂了……

最新的测试用例尚不可用。在制品...

说明

\t/ 

用空格替换选项卡。它们具有相同的字符数,以后使用制表符作为特殊字符。

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

NN换行符替换任何应加粗的长度文本,然后替换原始文本。

\\(\*|_)/\t

用制表符替换出现在斜杠前的定界符。这是为了确保类似这样的条目**a\***的字符数为2而不是3。

[^\t\n]/

删除所有不是制表符或换行符的字符。

\n/_

用下划线替换所有换行符。

\t_?/

删除所有制表符(代表转义的定界符)以及可能在其后的所有下划线。这与上述带有转义的结束定界符的字符计数问题有关。

(_*)/(^^\1)

将下划线序列替换为其长度。这是字符数。


**a****b**输出2,应该为6。请参见:a **** b
durron597'9

1
@ durron597我对应该如何工作有些困惑。您能补充说明吗?
kirbyfan64sos

就像我说的那样,只需在答案窗格中进行操作即可。****始终只是星号,根据其他文本可以在粗体内部显示,也可以不在粗体内部显示。
durron597

因此,@ kirbyfan64sos,有多大胆这个职位吗?
mbomb007'9

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的markdown系统格式化时所传递的字符串中的粗体字符数。

我认为我能正确处理大多数极端情况(包括到目前为止评论中提到的所有情况),但它仍然不是十分完美。我不明白为什么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**在输入框中不起作用。古怪
durron597'9

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,根据OP,您不应这样做)。
Cristian Lupascu 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.