Exclamation normale et inversée et paires de points d'interrogation

13

Défi

¡Nous allons donner des copains d'exclamation et de points d'interrogation inversés!

Étant donné un corps de texte contenant des phrases se terminant par ., ?ou !, préfixe les points d'interrogation inversés,, ¿aux phrases interrogatives (phrases se terminant par ?) et aux points d'exclamation inversés,, ¡à exclamatoire (phrases se terminant par !). Les peines se terminant par .doivent être ignorées.

Les phrases seront séparées par des espaces (espaces, tabulations et / ou sauts de ligne) et ne contiendront que des caractères alphanumériques, des virgules, des apostrophes et des espaces. Chaque phrase aura au moins un mot. Le premier mot de chaque phrase est garanti en majuscule. L'entrée peut commencer et se terminer avec n'importe quel espace.

Exemple

Contribution:

  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.

Production:

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

Règles

  • Toutes les règles par défaut de Code Golf s'appliquent.
  • Le programme avec le plus petit nombre d'octets gagne.

Bonus (17% de réduction) - Analyser plusieurs notes

Une phrase peut également se terminer par plusieurs points d'exclamation / d'interrogation. Donnez à chacun de ces points un point d'exclamation / d'interrogation inversé pour une remise supplémentaire de 17% sur votre nombre d'octets.

Exemple

Contribution:

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

Production:

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

Sortie incorrecte :

¿¿I am a man in a can doing a dance?? Maybe...
              ¿¿¡¿¿¿¡Doing it for the views??!???!
usandfriends
la source
Pouvons-nous choisir quel type d'espace blanc sépare les phrases, ou devons-nous prendre en charge les trois types?
Mego
@Mego Les trois types doivent être pris en charge.
usandfriends
Non, une phrase contiendra toujours au moins un mot et se terminera par l'un des trois caractères de ponctuation autorisés. J'ajouterai cela au défi.
usandfriends

Réponses:

5

Rétine , 39 37 34 octets

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

Essayez-le en ligne.

Explication

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

Cela correspond à une phrase se terminant par un point d'exclamation ou un point d'interrogation et ajoute ce caractère de ponctuation à la phrase. Maintenant, nous savons que tous les !ou ?qui sont immédiatement suivis d'un caractère non espace doivent être ceux que nous avons insérés, car les caractères originaux doivent être séparés du caractère suivant par un espace.

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

Cette étape de translittération se transforme tous !et ?en ¡et ¿, respectivement, à condition qu'ils se trouvent dans une correspondance de \S\b, qui s'applique uniquement à ceux que nous venons d'insérer. Remplacer les deux dans deux substitutions distinctes dans le même nombre d'octets, mais je préfère ici la sémantique d'une étape de translittération.

Martin Ender
la source
3

Mathematica 137 octets

Pas le plus court, mais c'était amusant à faire.

TextSentencesdécompose le texte d'entrée en phrases et StringPositiontrouve les positions de début et de fin de chaque phrase dans le texte. La ponctuation à l'envers est insérée au début de chaque phrase selon les besoins.

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,"!","¡"],"?","¿"]&

Utilisation, en supposant que le texte est entré à t,

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

production

DavidC
la source
1
Cool, une solution qui n'utilise pas RegExp!
usandfriends
3

Sed, 61 octets

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

Essai :

$ 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
la source
1
Cela représente techniquement 61 octets car les caractères inversés comptent pour 2 octets.
usandfriends
@usandfriends right, fixed
Aaron
Si vous utilisez le -rdrapeau de (GNU) sed, vous n'avez pas besoin d'échapper à (et )qui devrait vous faire économiser 8. Vous devez cependant ajouter un point supplémentaire pour l'utilisation de cette option non par défaut.
Digital Trauma
@DigitalTrauma J'ai connu cette astuce et l'ai essayée mais elle n'a pas renvoyé la même sortie: "¿¡Bonjour là! ¿Quel est ton nom? ¿" Au lieu de "¡Bonjour là! ¿Quel est ton nom?"
Aaron
3

Javascript (ES6), 86 79 66 63 octets

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

Non golfé:

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

Usage:

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.`))

Implémentera bientôt une solution de bonus.

Merci à:
@ user81655 , 86 => 79 octets

usandfriends
la source
1
Quelques améliorations qui économisent 9 octets:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655
@ user81655 On dirait qu'il économise 7 octets au lieu de 9, mais peu importe, merci pour ça! A pu supprimer encore plus d'octets en ignorant la recherche de phrases se terminant par ..
usandfriends
3

Mathematica, 101 92 91 octets

StringReplace[#,RegularExpression@"[A-Z][^.]*?([?!])":><|"?"->"¿","!"->"¡"|>@"$1"<>"$0"]&
LegionMammal978
la source
Pourriez-vous expliquer comment cela fonctionne?
DavidC
1
@DavidC C'est délicat.
LegionMammal978
1

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

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
la source