이 게시물은 얼마나 대담합니까?


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 개의 굵은 체 문자가 있습니다.
  • \in을 \**굵게 표시 해야합니까 ?
    • 아니요. **로 렌더링되므로 굵은 체로 표시하면 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

@BetaDecay 7 + 11입니다. 어떻게해야한다고 생각하십니까?
durron597

28 살이되었습니다 ... 프로그램을 살펴 보겠습니다
Beta Decay

@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이어야합니다. 참조 : 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**

코드에는 4 가지 주요 단계가 있습니다. 첫 번째는 백 슬래시를 정규식으로 대체하고 뒤에 'x'문자가있는 문자를 대체합니다. 두 번째 단계는 4 개의 별표 또는 밑줄 시퀀스를 4 개의 '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

자바 스크립트 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입니다 (이탤릭체를 고려한 경우 OP에 따라 사용하지 않아야 할 경우 3).
Cristian Lupascu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.