Exclamación normal e invertida y signos de interrogación

13

Desafío

¡Vamos a dar exclamación y signos de interrogación amigos invertidos!

Dado un cuerpo de texto que contiene oraciones que terminan en ., ?o !, anteponen signos de interrogación invertidos ¿, a oraciones interrogativas (oraciones que terminan en ?) y signos de exclamación invertidos ¡, a exclamativo (oraciones que terminan en !). Las oraciones que terminan en .deben ser ignoradas.

Las oraciones estarán separadas por espacios en blanco (espacios, tabulaciones y / o nuevas líneas) y solo contendrán alfanuméricos, comas, apóstrofes y espacios. Cada oración tendrá al menos una palabra. La primera palabra de cada oración se garantiza con mayúscula. La entrada puede comenzar y finalizar con cualquier espacio en blanco.

Ejemplo

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.

Salida:

  ¡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.

Reglas

  • Se aplican todas las reglas predeterminadas de Code Golf.
  • El programa con la menor cantidad de bytes gana.

Bonificación (17% de descuento): analiza múltiples marcas

Una oración también puede terminar en múltiples signos de exclamación / interrogación. Dé a cada una de estas marcas un signo de exclamación / interrogación inverso emparejado para obtener un 17% adicional de descuento en su recuento de bytes.

Ejemplo

Entrada:

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

Salida:

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

Salida incorrecta :

¿¿I am a man in a can doing a dance?? Maybe...
              ¿¿¡¿¿¿¡Doing it for the views??!???!
usandfriends
fuente
¿Podemos elegir qué tipo de espacio en blanco separa las oraciones, o tenemos que admitir los 3 tipos?
Mego
@Mego Los tres tipos deben ser compatibles.
usandfriends
No, una oración siempre tendrá al menos una palabra y terminará con uno de los tres caracteres de puntuación permitidos. Agregaré eso al desafío.
usandfriends

Respuestas:

5

Retina , 39 37 34 bytes

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

Pruébalo en línea.

Explicación

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

Esto coincide con una oración que termina en un signo de exclamación o de interrogación, y antepone ese carácter de puntuación a la oración. Ahora sabemos que todos los !o ?que son seguidos inmediatamente por un carácter no espacial deben ser aquellos que insertamos, porque los originales deben estar separados del siguiente carácter por un espacio.

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

Esta etapa de transliteración convierte todo !y ?en ¡y ¿, respectivamente, siempre que se encuentren en una coincidencia de \S\b, que se aplica solo a los que acabamos de insertar. Reemplazando ambos en dos sustituciones separadas en el mismo conteo de bytes, pero prefiero la semántica de una etapa de transliteración aquí.

Martin Ender
fuente
3

Mathematica 137 bytes

No es el más corto, pero fue divertido hacerlo.

TextSentencesdivide el texto de entrada en oraciones y StringPositionencuentra las posiciones inicial y final de cada oración en el texto. La puntuación invertida se inserta al comienzo de cada oración según sea necesario.

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, suponiendo que el texto se ingresa en t,

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

salida

DavidC
fuente
1
¡Genial, una solución que no usa RegExp!
usandfriends
3

Sed, 61 bytes

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

Prueba de funcionamiento :

$ 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
fuente
1
Esto es técnicamente 61 bytes ya que los caracteres invertidos cuentan como 2 bytes.
usandfriends
@usandfriends bien, arreglado
Aaron
Si usa el -rindicador para (GNU) sed, no necesita escapar (y )eso debería ahorrarle 8. Sin embargo, debe agregar un punto adicional para usar esta opción no predeterminada.
Trauma digital
@DigitalTrauma Conocía ese truco y lo probé pero no devolvió el mismo resultado: "¿¡Hola! ¿Cuál es tu nombre? ¿" En lugar de "¡Hola! ¿Cuál es tu nombre?"
Aaron
3

Javascript (ES6), 86 79 66 63 bytes

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

Sin golf:

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á una solución de bonificación pronto.

Gracias a:
@ user81655 , 86 => 79 bytes

usandfriends
fuente
1
Algunas mejoras que ahorran 9 bytes:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655
@ user81655 Parece que ahorra 7 bytes en lugar de 9, pero independientemente, ¡gracias por eso! Pude eliminar aún más bytes omitiendo la comprobación de oraciones que terminan en ..
usandfriends
3

Mathematica, 101 92 91 bytes

StringReplace[#,RegularExpression@"[A-Z][^.]*?([?!])":><|"?"->"¿","!"->"¡"|>@"$1"<>"$0"]&
LegionMammal978
fuente
¿Podría explicar cómo funciona esto?
DavidC
1
@DavidC Es 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
fuente