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 String
argumento 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.
- Sim.
- 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 *.
- Total de caracteres que seriam exibidos em negrito. Isso significa que não
- 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
<
-><
- 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.
18
correto para o terceiro caso de teste?**fox__ jumps**
finaliza esse negrito específico.\**
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 negritoa
. Há também outra fuga\\
. Devemos lidar com isso?Respostas:
rs , 107 bytes
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
Substitua guias por espaços. Eles têm a mesma contagem de caracteres e as guias são usadas posteriormente como um caractere especial.
Substitua qualquer texto de tamanho
N
que deva ser destacado em negrito porN
novas linhas seguidas pelo texto original.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.Remova qualquer caractere que não seja uma guia ou nova linha.
Substitua todas as novas linhas por sublinhados.
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.
Substitua a sequência de sublinhado pelo seu comprimento. Esta é a contagem de caracteres.
fonte
**a****b**
saídas 2, ele deve ser 6. Veja: a **** bPython: 133 caracteres
Isso deve funcionar de forma idêntica no Python 2 e 3. A função
f
retorna 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*x
negrito (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
findall
para encontrar todos os blocos que serão colocados em itálico. A etapa final é uma expressão geradora dentro de umasum
chamada, 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:
fonte
x***x**
que não funciona na caixa de entrada. EstranhoJavaScript ES6, 91 bytes
Lida com todas as fugas antes da mão e depois usa uma expressão regular. Muito potencial de golfe.
Explicação
fonte
**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).