Quão ousada é essa postagem?

13

Preâmbulo

Na marcação de Stack Exchange, usamos ** para negritar o texto. Por exemplo, esta redução:

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

Renderiza como:

A rápida raposa marrom pula sobre o cachorro preguiçoso .

Obviamente, usamos ** para fechar a ousadia também. Portanto, menos da resposta será em negrito. Por exemplo:

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

Renderiza como:

A rápida raposa marrom pula sobre o cachorro preguiçoso .

No entanto, se a ousadia não for fechada, ela será renderizada como não ousada :

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

Renderiza como:

A raposa marrom rápida salta sobre o cachorro preguiçoso.

Se o texto tiver uma única barra invertida \, a ousadia não terá efeito:

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

Renderiza como:

A rápida raposa marrom pula sobre o cachorro preguiçoso.

O espaço em branco à direita resulta em texto não dobrado (observe que o espaço em branco após o marrom é uma única guia):

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

Renderiza como:

A ** raposa ** raposa marrom pula sobre o cachorro preguiçoso. **

Também podemos usar __ para negrito também, mas observe que apenas um pode estar ativo por vez. Aqui está um exemplo mais complicado:

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

Renderiza como:

A rápida raposa marrom pula sobre o cachorro preguiçoso.

A questão:

Você pode escrever um programa ou função, dado texto ASCII ou como um Stringargumento ou em STDIN, onde os únicos caracteres especiais são **, __, \(para escapar) e espaços em branco, determinar quantos caracteres em negrito existem. Este valor deve ser impresso em STDOUT ou retornado da sua função. Você não precisa suportar seqüências muito longas; É garantido que o comprimento da string não exceda 30K, que é o limite para uma postagem do Stack Exchange.

Impressão fina:

  • Posso lançar uma exceção / outro erro para um caso e retornar normalmente para o outro?
    • Não. Ele deve ser um valor de retorno claro, inequívoco e sem erros para os dois casos. A saída STDERR será ignorada.
  • Os espaços entre as palavras são considerados em negrito?
    • Sim. **quick brown**possui 11 caracteres em negrito.
  • Caso o \em \**, se em negrito, ser contado?
    • Não. É renderizado como **; portanto, se estiver em negrito, terá apenas 2 caracteres.
  • Seja completamente claro: o que você quer dizer com quantos caracteres?
    • Total de caracteres que seriam exibidos em negrito. Isso significa que não** é renderizado se transformar texto, mas é renderizado se não transformar.
    • Observe que é possível fazer **negrito de várias maneiras, por exemplo **\****- - ** .
    • Não considere a possibilidade de converter algum texto em itálico. A única regra de remarcação a considerar é ** = negrito *.
  • No Stack Exchange, o HTML Bold também funciona. ou seja, <b> </b>
    • Sim, eu estou ciente. Não considere este caso, este é um texto normal.
  • E quanto ao HTML? por exemplo &lt;-><
    • Estes também devem ser considerados como texto normal, não há conversão de entidade HTML.
  • Pensei em um exemplo que você não abordou acima!
    • As regras funcionam exatamente como se o texto tivesse sido postado no Stack Exchange, em uma resposta (não um comentário), exceto que os blocos de código não são considerados caracteres especiais . Tanto o tipo de quatro espaços quanto o tipo de bastão. Se você não tiver certeza de como o texto deve ser renderizado, basta jogá-lo em uma caixa de resposta em algum lugar como teste, essas são as regras que você deve seguir.

Exemplos:

Entrada:

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

Resultado:

35

Entrada:

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

Resultado:

0

Entrada:

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

Resultado:

18

Entrada:

The __quick\____ brown fox **jumps over\** the** lazy \**dog.

Resultado:

23

Entrada:

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

Resultado:

11

As brechas padrão são proibidas.

durron597
fonte
Está 18correto para o terceiro caso de teste?
Beta Decay
@BetaDecay São 7 + 11. O que você acha que deveria ser?
precisa saber é o seguinte
Eu tenho 28 anos ... Vou dar uma olhada no meu programa
Decay Beta
@BetaDecay **fox__ jumps**finaliza esse negrito específico.
precisa saber é o seguinte
1
A pergunta parece sugerir que \**ou \__existem seqüências de escape de três caracteres, mas no StackExchange existem apenas sequências de escape de dois caracteres \*ou \_. Então, \***a**produz um asterisco seguido de um negrito a. Há também outra fuga \\ . Devemos lidar com isso?
feersum

Respostas:

5

rs , 107 bytes

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

Demonstração ao vivo e casos de teste.

Isso é uma coisa muito louca.

O caso de teste mais recente ainda não funciona. WIP ...

Explicação

\t/ 

Substitua guias por espaços. Eles têm a mesma contagem de caracteres e as guias são usadas posteriormente como um caractere especial.

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

Substitua qualquer texto de tamanho Nque deva ser destacado em negrito por Nnovas linhas seguidas pelo texto original.

\\(\*|_)/\t

Substitua quaisquer ocorrências de um delimitador imediatamente precedido por uma barra com uma guia. Isso é para garantir que entradas como **a\***tenham uma contagem de caracteres 2 em vez de 3.

[^\t\n]/

Remova qualquer caractere que não seja uma guia ou nova linha.

\n/_

Substitua todas as novas linhas por sublinhados.

\t_?/

Remova todas as guias (que representam delimitadores com escape), juntamente com os sublinhados que possam segui-los. Isso está relacionado à questão acima da contagem de caracteres com delimitadores finais escapados.

(_*)/(^^\1)

Substitua a sequência de sublinhado pelo seu comprimento. Esta é a contagem de caracteres.

kirbyfan64sos
fonte
**a****b**saídas 2, ele deve ser 6. Veja: a **** b
durron597 01/09/2015
1
@ durron597 Estou um pouco confuso sobre como isso deve funcionar. Você poderia adicionar uma explicação?
Kirbyfan64sos #
Como eu disse, apenas brinque com ele em um painel de respostas. **** é sempre apenas asteriks, que pode estar em negrito ou não em negrito com base no outro texto.
durron597
Então, @ kirbyfan64sos, quão ousada é a publicação?
Mbomb007
2

Python: 133 caracteres

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

Isso deve funcionar de forma idêntica no Python 2 e 3. A função fretorna o número de caracteres em negrito que estarão na string em que ele é passado quando formatado pelo sistema de marcação do Stack Overflow.

Acho que acertei a maioria dos casos de canto (incluindo todos os mencionados nos comentários até agora), mas ainda não é totalmente perfeito. Eu não entendo por x***x**que não renderiza o *xnegrito (como o ***x**faz), então meu código errará pelo menos algumas entradas.

O código possui quatro etapas principais. O primeiro faz uma substituição regex de qualquer barra invertida seguida por qualquer caractere com um caractere 'x'. A segunda etapa substitui qualquer sequência de quatro asteriscos ou sublinhados por quatro caracteres 'x'. A terceira etapa usa uma regex findallpara encontrar todos os blocos que serão colocados em itálico. A etapa final é uma expressão geradora dentro de uma sumchamada, que soma os comprimentos desses blocos, subtraindo 4 caracteres de cada um, pois não queremos incluir os delimitadores em nossa contagem.

Aqui estão alguns resultados de teste:

>>> 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
Blckknght
fonte
Não faço ideia por x***x**que não funciona na caixa de entrada. Estranho
durron597
1

JavaScript ES6, 91 bytes

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

Lida com todas as fugas antes da mão e depois usa uma expressão regular. Muito potencial de golfe.

Explicaçã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
Downgoat
fonte
Para **a*b*c**isso retorna 9, que acredito estar incorreto. A contagem real é 5 (ou 3, se você considerar o itálico, o que, de acordo com o OP, você não deve).
Cristian Lupascu 02/09/2015