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??!???!

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.


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


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.

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


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"]&

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.