Segunda-feira Mini-Golfe # 5: <s> Não </s> Tente fazer isso em casa

24

Mini-golfe de segunda-feira: Uma série de perguntas curtas sobre , postadas (espero!) Toda segunda-feira.

Às vezes, as pessoas se cansam das regras da vida: "não faça isso", "você não pode fazer isso", "não vamos deixar você fazer isso". Às vezes pode parecer realmente restritivo! Mas de vez em quando é bom se divertir um pouco, então vamos escrever um código para modificar essas regras. E enquanto estamos nisso, também pode modificar outra negatividade. (É claro que essas modificações não serão apenas temporárias, portanto deixaremos o texto original também.)

Desafio

Seu desafio é escrever um programa ou função que coloque <s>rasuras em HTML em </s>torno de palavras restritivas - ou seja, palavras terminadas em n'tou seguidas de not- e depois de cada uma delas, insira seu equivalente positivo em TODOS OS CAPS. No final, após um espaço, o número de substituições feitas deve ser incluído. Por exemplo:

Please don't jump into the pool.

torna-se

Please <s>don't</s> DO jump into the pool. 1

Para palavras que terminam em n'tou são seguidas por not(assim como cannot), o equivalente positivo é tudo até o acima mencionado not(excluindo espaços). Aqui está o que eu quero dizer:

  • do not speak torna-se <s>do not</s> DO speak
  • it doesn't work torna-se it <s>doesn't</s> DOES work
  • we cannot torna-se we <s>cannot</s> CAN

No entanto, existem algumas exceções. Certifique-se de que eles sejam manuseados corretamente.

can't -> <s>can't</s> CAN
won't -> <s>won't</s> WILL
ain't -> <s>ain't</s> AM
shan't -> <s>shan't</s> SHALL
I'm not -> <s>I'm not</s> I AM
you're not -> <s>you're not</s> YOU ARE

Detalhes

  • A entrada nunca conterá nenhum espaço em branco, exceto os espaços normais (sem guias, novas linhas etc.).
  • A entrada nunca conterá nenhum duplo negativo (por exemplo we can't not do this).
  • Se a notaparecer imediatamente após um sinal de pontuação ou como parte de outra palavra, deixe-o como está.
  • Certifique-se de preservar o texto original, incluindo maiúsculas / minúsculas, entre as <s></s>tags.
  • Se desejar, você pode usar <strike></strike>no lugar de <s></s>.

Casos de teste

Entradas:

I'm sorry, but you can't do that.
Driving on the beach isn't allowed.
Driving on the beach is not allowed.
Please don't jump in; I cannot imagine what might come of that.
Don't worry; we won't get into trouble.
I'm not perfect, but you're not either.
You shan't do it 'cause I ain't doin' it!
Can't we capitalize special cases?
I don't like the words can't, shan't, won't, don't, ain't, or ppcgn't.
Oh, this? It's nothing.
Tie a slipknot in the rope.
Would you like Pinot Noir?
This sentence contains none of the replacement words. Not even knot or ca't.
This sentence doesn't contain one of the replacement words.

Saídas:

I'm sorry, but you <s>can't</s> CAN do that. 1
Driving on the beach <s>isn't</s> IS allowed. 1
Driving on the beach <s>is not</s> IS allowed. 1
Please <s>don't</s> DO jump in; I <s>cannot</s> CAN imagine what might come of that. 2
<s>Don't</s> DO worry; we <s>won't</s> WILL get into trouble. 2
<s>I'm not</s> I AM perfect, but <s>you're not</s> YOU ARE either. 2
You <s>shan't</s> SHALL do it 'cause I <s>ain't</s> AM doin' it! 2
<s>Can't</s> CAN we capitalize special cases? 1
I <s>don't</s> DO like the words <s>can't</s> CAN, <s>shan't</s> SHALL, <s>won't</s> WILL, <s>don't</s> DO, <s>ain't</s> AM, or <s>ppcgn't</s> PPCG. 7
Oh, this? It's nothing. 0
Tie a slipknot in the rope. 0
Would you like Pinot Noir? 0
This sentence contains none of the replacement words. Not even knot or ca't. 0
This sentence <s>doesn't</s> DOES contain one of the replacement words. 1

Pontuação

Este é o , pelo que o código válido mais curto em bytes vence. O desempatador vai para o envio que atingiu sua contagem final de bytes primeiro. O vencedor não será escolhido na próxima segunda-feira, 26 de outubro. Boa sorte!

ETHproductions
fonte
@FryAmTheEggman Sim, a menos que haja outros que valham a pena adicionar à lista. Prefiro mantê-lo breve, mas você tem alguma sugestão?
ETHproductions
Não, apenas não queria que isso sofrem com o "você mudou a especificação agora é uma porcaria" síndrome desafio: P
FryAmTheEggman
11
Caso de teste sugerido:Can't we capitalize special cases?
DLosc
Precisamos ter cuidado com seqüências de caracteres como: Oh this? It's nothing...ou I wonder if we'll notice any words like this??
Dom Hastings
2
Um <strike> não </strike> simplesmente converte memes em concursos!
Janeiro

Respostas:

7

Pip , 138 140 bytes

Yeesh, que cannot/ knotdistinção é complicado.

x:"ca wo ai sha i'm you're"^sY"CAN0WILL0AM0SHALL0I AM0YOU ARE"^0OqR-`([\w']+)( no|n'|(?<=can)no)t\b`{++i"<s>".a."</s>".s.((yx@?LCb)|UCb)}s.i

Lê uma linha de stdin, sai para stdout. A regex:

`([\w']+)( no|n'|(?<=can)no)t\b`

corresponde a uma palavra (incluindo apóstrofes) seguida por uma das três coisas:

  • not
  • n't
  • not sem espaço, desde que a primeira metade da palavra fosse can

O -operador em uma regex torna essa distinção entre maiúsculas e minúsculas.

As correspondências são substituídas pelo resultado da seguinte função. (Nota: dentro da função, aé a correspondência inteira e bé o grupo de captura 1.)

{++i"<s>".a."</s>".s.((yx@?LCb)|UCb)}
 ++i                                   Increment counter
    "<s>".a."</s>"                     Return entire match wrapped in HTML tags...
                  .s.(             )   plus space, plus the following:
                           LCb         Lowercase first capture group
                        x@?            Find its index in list x of special cases (nil if
                                         not in list)
                      (y      )        Use that as index into list y of replacements
                               |UCb    If it wasn't a special case, this is nil, and we
                                         instead use uppercase(b)

Depois que a string modificada é concluída, também produzimos um espaço e o número de substituições i.

DLosc
fonte
3

GNU Sed, 321 bytes

(incluindo +1 para -r)

:
s!(can('|no)t)([^<])!<s>\1</s> CAN\3!i
s!(won't)([^<])!<s>\1</s> WILL\2!i
s!(ain't)([^<])!<s>\1</s> AM\2!i
s!(shan't)([^<])!<s>\1</s> SHALL\2!i
s!(I'm not)([^<])!<s>\1</s> I AM\2!i
s!(you're not)([^<])!<s>\1</s> YOU ARE\2!i
t
s!(([^ .!?]+)(n't| not))([^<])!<s>\1</s> \U\2\4!i
t
h
s/1//g
s/<s>/1/g
s/[^1]//g
x
G
s/\n/ /

"Substituição de cordas - um trabalho para sed!" Eu pensei. Mas isso foi surpreendentemente difícil, e eu continuei inflando com a substituição do texto original. E a contagem! Pelo menos não há proibição de unário na questão ...

Toby Speight
fonte
2

Perl, 153 bytes

150 scripts + 3 para -p

$c=0|s!\b((ca)nnot|([\w']+)(?: not|n't))\b!"<s>$&</s> ".uc({ai,AM,ca,CAN,wo,WILL,sha,SHALL,"i'm","I AM","you're","YOU ARE"}->{lc$+}||$+)!egi;s/
/ $c
/

Então, enquanto eu jogo todos os casos de teste agora, mas esse regex me custou muito ... vou pensar nisso!

Exemplo de saída:

$perl -p can.pl <<< "I'm sorry, but you can't do that.
Driving on the beach isn't allowed.
Driving on the beach is not allowed.
Please don't jump in; I cannot imagine what might come of that.
Don't worry; we won't get into trouble.
I'm not perfect, but you're not either.
You shan't do it 'cause I ain't doin' it!
Can't we capitalize special cases?
I don't like the words can't, shan't, won't, don't, ain't, or ppcgn't.
Oh, this? It's nothing.
This sentence contains none of the replacement words. Not even knot or ca't.
This sentence doesn't contain one of the replacement words.
Tie a slipknot in the rope.
Would you like Pinot Noir?
You cannot be serious\!"
I'm sorry, but you <s>can't</s> CAN do that. 1
Driving on the beach <s>isn't</s> IS allowed. 1
Driving on the beach <s>is not</s> IS allowed. 1
Please <s>don't</s> DO jump in; I <s>cannot</s> CAN imagine what might come of that. 2
<s>Don't</s> DO worry; we <s>won't</s> WILL get into trouble. 2
<s>I'm not</s> I AM perfect, but <s>you're not</s> YOU ARE either. 2
You <s>shan't</s> SHALL do it 'cause I <s>ain't</s> AM doin' it! 2
<s>Can't</s> CAN we capitalize special cases? 1
I <s>don't</s> DO like the words <s>can't</s> CAN, <s>shan't</s> SHALL, <s>won't</s> WILL, <s>don't</s> DO, <s>ain't</s> AM, or <s>ppcgn't</s> PPCG. 7
Oh, this? It's nothing. 0
This sentence contains none of the replacement words. Not even knot or ca't. 0
This sentence <s>doesn't</s> DOES contain one of the replacement words. 1
Tie a slipknot in the rope. 0
Would you like Pinot Noir? 0
You <s>cannot</s> CAN be serious\! 1
Dom Hastings
fonte
Uau, isso é compacto! Um problema: I'm notnão está funcionando corretamente - deveria estar em I AMvez de I'M. Mas acho que você só precisa mudar I'mpara i'mno código para corrigi-lo.
21815 DLosc #
Ah - também tente em frases como Tie a slipknot in the rope.ou Would you like Pinot Noir?. Eles ainda não estão nos casos de teste, mas a intenção do OP era excluir qualquer palavra que terminasse em notexceto cannot.
DLosc
@DLosc Excelentes casos de teste! Eu não conseguia pensar em mais palavras terminando em not! O I'mera um mau perder, graças para o local!
Dom Hastings