この投稿はどれほど大胆ですか?


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.

レンダリング:

**クイックブラウンキツネは怠laな犬を飛び越えます。

テキストに単一の円記号がある場合、\太字は有効になりません。

The \**quick brown fox jumps over the lazy dog.**

レンダリング:

**素早い茶色のキツネは怠zyな犬を飛び越えます。**

末尾の空白は、太字のないテキストになります(茶色の後の空白は単一のタブです)。

The** quick** brown fox jumps over the lazy dog.**

レンダリング:

**クイック**ブラウンフォックスは、怠laな犬を飛び越えます。**

太字にも__を使用することもできますが、一度にアクティブにできるのは1つだけであることに注意してください。次に、より複雑な例を示します。

The __quick**__ brown **fox__ jumps** over__ the__ lazy **dog.

レンダリング:

迅速**茶色fox__ジャンプ the__怠惰**犬をover__。

質問:

あなたは、のいずれかのプログラムや機能、与えられたASCIIテキストを書き込むことができString、引数または唯一の特殊文字はSTDIN、上**__\、(エスケープ用)と末尾の空白がありますどのように多くの大胆な文字を決定します。この値は、STDOUTに出力されるか、関数から返される必要があります。非常に長い文字列をサポートする必要はありません。文字列の長さは30K、Stack Exchange投稿の制限であるを超えないことが保証されています。

細字:

  • 1つのケースで例外/他のエラーをスローし、他のケースでは正常に戻ることができますか?
    • いいえ。どちらの場合も、エラーのない明確で明確な戻り値である必要があります。STDERR出力は無視されます。
  • 単語間のスペースは太字と見なされますか?
    • はい。**quick brown**太字が11文字あります。
  • 太字の場合、\inを\**カウントする必要がありますか?
    • いいえ。**として表示されるため、太字にする必要がある場合は2文字のみです。
  • 完全に明確にしてください:キャラクターの数とはどういう意味ですか?
    • 太字で表示される合計文字。この手段**されてレンダリングされていない、それはテキストを変換し、それがない場合、それがレンダリングされている場合。
    • -> **など**、いくつかの方法で太字にすることができることに注意してください。**\****
    • 一部のテキストが斜体に変換される可能性を考慮しないでください。唯一の考慮すべきマークダウンルールがある** =太字*。
  • Stack Exchangeでは、HTML Boldも機能します。すなわち<b> </ b>
    • はい、承知しています。このケースを考慮しないでください、これは通常のテキストです。
  • HTMLエンティティはどうですか?例&lt;-><
    • これらも通常のテキストと見なされる必要があり、HTMLエンティティの変換はありません。
  • あなたが上でカバーしなかった例を考えました!
    • ルールは、コードブロックが特殊文字と見なされないことを除き、テキストがStack Exchangeに回答(コメントではなく)で投稿された場​​合とまったく同じように機能します。4つのスペースタイプとバックティックタイプの両方。テキストのレンダリング方法がわからない場合は、テストとしてテキストを回答ボックスに投げてください。これらは従うべきルールです。

例:

入力:

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

標準の抜け穴は禁止されています。


183番目のテストケースは正しいですか?
ベータ崩壊

@BetaDecay 7 + 11です。どうあるべきだと思いますか?
durron597

私は28歳になりました...私のプログラムを見ます
ベータ崩壊

@BetaDecay **fox__ jumps**は、その特定の太字を終了します。
durron597

1
質問は、\**または\__3文字のエスケープシーケンスを示唆しているようですが、StackExchangeには2文字のエスケープシーケンス\*またはのみがあります\_。したがって\***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\***の文字数が3ではなく2であることを確認するためです。

[^\t\n]/

タブまたは改行以外の文字を削除します。

\n/_

すべての改行をアンダースコアに置き換えます。

\t_?/

タブ(エスケープされた区切り文字を表す)と、その後に続くアンダースコアを削除します。これは、エスケープされた終了区切り文字を使用した文字数の上記の問題に関連しています。

(_*)/(^^\1)

アンダースコアシーケンスをその長さに置き換えます。これは文字数です。


**a****b**出力
2、6

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**

コードには4つの主要なステップがあります。1つ目は、バックスラッシュとそれに続く「x」文字を持つ任意の文字の正規表現置換を行います。2番目のステップでは、4つのアスタリスクまたはアンダースコアのシーケンスを4つの「x」文字に置き換えます。3番目のステップでは、正規表現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、OPによればこれはすべきではありません)。
クリスチャンルパスク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.