Pares de exclamação e ponto de interrogação normais e invertidos

13

Desafio

¡Vamos dar pontos de interrogação e pontos de interrogação invertidos!

Dado um corpo de sentenças de texto contendo terminando em ., ?ou !, preceder pontos de interrogação invertido, ¿para frases interrogativas (frases que termina em ?) e pontos de exclamação invertidos, ¡, a exclamativas (frases que terminam em !). As frases terminadas em .devem ser ignoradas.

As frases serão separadas por espaços em branco (espaços, tabulações e / ou novas linhas) e conterão apenas alfanuméricos, vírgulas, apóstrofes e espaços. Cada frase terá pelo menos uma palavra. A primeira palavra de cada frase é garantida em maiúscula. A entrada pode começar e terminar com qualquer espaço em branco.

Exemplo

Entrada:

  Hello there!      What is your name?
My name is Ron. What's your name?
My name is Alex.  Nice to meet you!
Nice to meet you to!  How was your break?
It was great, I spent all my time code golfing!
What's that?
        Wow, you're such a n00b! Here, let me show you.

Resultado:

  ¡Hello there!      ¿What is your name?
My name is Ron. ¿What's your name?
My name is Alex.  ¡Nice to meet you!
¡Nice to meet you to!  ¿How was your break?
¡It was great, I spent all my time code golfing!
¿What's that?
        ¡Wow, you're such a n00b! Here, let me show you.

Regras

  • Todas as regras padrão do Code Golf se aplicam.
  • O programa com a menor quantidade de bytes vence.

Bônus (17% de desconto) - Analise várias marcas

Uma frase também pode terminar em vários pontos de exclamação / interrogação. Atribua a cada uma dessas marcas um ponto de exclamação / interrogação inversa emparelhado, com um desconto adicional de 17% em sua contagem de bytes.

Exemplo

Entrada:

I am a man in a can doing a dance?? Maybe...
              Doing it for the views??!???!

Resultado:

¿¿I am a man in a can doing a dance?? Maybe...
              ¡¿¿¿¡¿¿Doing it for the views??!???!

Saída incorreta :

¿¿I am a man in a can doing a dance?? Maybe...
              ¿¿¡¿¿¿¡Doing it for the views??!???!
usandfriends
fonte
Podemos escolher que tipo de espaço em branco separa as sentenças ou precisamos oferecer suporte aos três tipos?
Mego
@Mego Todos os três tipos devem ser suportados.
usandfriends
Não, uma frase sempre terá pelo menos uma palavra e terminará com um dos três caracteres de pontuação permitidos. Vou acrescentar isso ao desafio.
usandfriends 4/15

Respostas:

5

Retina , 39 37 34 bytes

\w[^.]*?([!?])
$1$0
T`?!`¿¡`\S\b

Experimente online.

Explicação

\w[^.]*?([!?])
$1$0

Corresponde a uma frase que termina em um ponto de exclamação ou interrogação e acrescenta esse caractere de pontuação à frase. Agora sabemos que toda a !ou ?que são imediatamente seguido por um caractere não-espaço devem ser aqueles que inserido, porque os originais deve ser separado do próximo caractere por um espaço.

T`!?`¡¿`\S\b

Esse estágio de transliteração transforma tudo !e ?em ¡e ¿, respectivamente, desde que eles sejam encontrados em uma correspondência de \S\b, que se aplica somente àqueles que acabamos de inserir. Substituindo ambos em duas substituições separadas na mesma contagem de bytes, mas eu prefiro a semântica de um estágio de transliteração aqui.

Martin Ender
fonte
3

Mathematica 137 bytes

Não é o mais curto, mas foi divertido de fazer.

TextSentencesdivide o texto de entrada em sentenças e StringPositionlocaliza as posições inicial e final de cada sentença no texto. A pontuação invertida é inserida no início de cada frase, conforme necessário.

w=StringPosition;f[x_,y_,q_]:=StringInsert[x,q,x~w~y/.{a_,a_}->a/.(x~w~#&/@TextSentences@#&@x/.{{c_,d_}}:>d->c)];f[f[t,"!","¡"],"?","¿"]&

Uso, supondo que o texto seja inserido em t,

f[f[#,"!","¡"],"?","¿"]&[t]

resultado

DavidC
fonte
1
Legal, uma solução que não usa RegExp!
usandfriends
3

Sed, 61 bytes

s/\(\s*\)\([^.!?]*!\)/\1¡\2/g;s/\(\s*\)\([^.!?]*?\)/\1¿\2/g

Execução de teste:

$ echo """Hello there!      What is your name?
My name is Ron. What's your name?
My name is Alex.  Nice to meet you!
Nice to meet you to!  How was your break?
It was great, I spent all my time code golfing!
What's that?
        Wow, you're such a n00b! Here, let me show you.""" | sed 's/\(\s*\)\([^.!?]*!\)/\1¡\2/g;s/\(\s*\)\([^.!?]*?\)/\1¿\2/g'
¡Hello there!      ¿What is your name?
My name is Ron. ¿What's your name?
My name is Alex.  ¡Nice to meet you!
¡Nice to meet you to!  ¿How was your break?
¡It was great, I spent all my time code golfing!
¿What's that?
        ¡Wow, you're such a n00b! Here, let me show you.
Aaron
fonte
1
Tecnicamente, são 61 bytes, pois os caracteres invertidos contam como 2 bytes.
usandfriends
@usandfriends direita, fixa
Aaron
Se você usar o -rsinalizador para (GNU) sed, não precisará escapar do (e o )deverá salvar 8. Você precisa adicionar um ponto extra para usar essa opção não padrão.
Digital Trauma
@DigitalTrauma Eu conheci esse truque e tentei, mas ele não retornou a mesma saída: "¿¡Olá, lá! ¿Qual é o seu nome? ¿" Em vez de "¡Olá, lá! ¿Qual é o seu nome?"
Aaron
3

Javascript (ES6), 86 79 66 63 bytes

i=>i.replace(/\w[^.!?]*[!?]/g,k=>(k.slice(-1)>'>'?'¿':'¡')+k)

Ungolfed:

func = inp => inp.replace(/\w[^.!?]*[!?]/g, sentence => (sentence.slice(-1) > '>' ? '¿' : '¡') + sentence)

Uso:

console.log(func(`Hello there!      What is your name?
My name is Ron. What's your name?
My name is Alex.  Nice to meet you!
Nice to meet you to!  How was your break?
It was great, I spent all my time code golfing!
What's that?
            Wow, you're such a n00b! Here, let me show you.`))

Implementará a solução de bônus em breve.

Graças a:
@ user81655 , 86 => 79 bytes

usandfriends
fonte
1
Algumas melhorias que economizam 9 bytes:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655
@ user81655 Parece que ele salva 7 bytes em vez de 9, mas, independentemente disso, obrigado por isso! Conseguiu remover ainda mais bytes ignorando a verificação de sentenças terminadas em ..
usandfriends
3

Mathematica, 101 92 91 bytes

StringReplace[#,RegularExpression@"[A-Z][^.]*?([?!])":><|"?"->"¿","!"->"¡"|>@"$1"<>"$0"]&
LegionMammal978
fonte
Você explicaria como isso funciona?
DavidC
1
@DavidC É complicado.
LegionMammal978
1

Python 2, 127,82 (154-17%) bytes

import re
print re.sub("([A-Z][\w ,']*)([\.!\?]+)",lambda m:''.join({'!':'¡','?':'¿','.':''}[c]for c in m.group(2))[::-1]+m.group(1)+m.group(2),input())
TFeld
fonte