Esclamazioni normali e invertite e coppie di punti interrogativi


13

Sfida

¡Daremo esclamativi e punti interrogativi amici invertiti!

Dato un corpo di testo contenente frasi che terminano in ., ?o !, anteporre punti interrogativi invertiti ¿, a frasi interrogative (frasi che terminano in ?) e punti esclamativi invertiti ¡, a esclamativo (frasi che terminano in !). Le frasi che finiscono .devono essere ignorate.

Le frasi saranno separate da spazi bianchi (spazi, tabulazioni e / o nuove righe) e conterranno solo caratteri alfanumerici, virgole, apostrofi e spazi. Ogni frase avrà almeno una parola. La prima parola di ogni frase è garantita in maiuscolo. L'input può iniziare e terminare con qualsiasi spazio bianco.

Esempio

Ingresso:

  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.

Produzione:

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

Regole

  • Si applicano tutte le regole predefinite di Code Golf.
  • Vince il programma con il minor numero di byte.

Bonus (sconto del 17%) - Analizza più voti

Una frase può anche terminare con più punti esclamativi / punti interrogativi. Assegna a ciascuno di questi segni un punto esclamativo / punto interrogativo inverso accoppiato per un ulteriore sconto del 17% sul conteggio dei byte.

Esempio

Ingresso:

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

Produzione:

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

Uscita errata :

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

Dobbiamo scegliere quale tipo di spazio bianco separa le frasi o dobbiamo supportare tutti e 3 i tipi?
Mego

@Mego Dovrebbero essere supportati tutti e tre i tipi.
usandfriends

No, una frase avrà sempre almeno una parola e terminerà con uno dei tre caratteri di punteggiatura consentiti. Lo aggiungerò alla sfida.
usandfriends

Risposte:


5

Retina , 39 37 34 byte

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

Provalo online.

Spiegazione

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

Questo corrisponde a una frase che termina con un punto esclamativo o un punto interrogativo e antepone quel carattere di punteggiatura alla frase. Ora sappiamo che tutti !o ?che sono immediatamente seguiti da un carattere non spaziale devono essere quelli che abbiamo inserito, perché quelli originali dovrebbero essere separati dal carattere successivo da uno spazio.

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

Questa fase di traslitterazione trasforma tutto !e ?in ¡e ¿, rispettivamente, a condizione che siano trovati in una corrispondenza \S\b, che si applica solo a quelli che abbiamo appena inserito. Sostituendo entrambi in due sostituzioni separate nello stesso numero di byte, ma preferisco qui la semantica di una fase di traslitterazione.


3

Mathematica 137 byte

Non il più breve, ma è stato divertente da fare.

TextSentencessuddivide il testo di input in frasi e StringPositiontrova le posizioni iniziale e finale di ciascuna frase nel testo. La punteggiatura capovolta viene inserita all'inizio di ogni frase come richiesto.

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

Utilizzo, supponendo che il testo sia inserito in t,

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

produzione


1
Fantastico, una soluzione che non utilizza RegExp!
usandfriends

3

Sed, 61 byte

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

Prova :

$ 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
Si tratta tecnicamente di 61 byte poiché i caratteri invertiti contano come 2 byte.
usandfriends

@usandfriends right, fixed
Aaron

Se si utilizza il -rflag per (GNU) sed, non è necessario sfuggire a (e )ciò dovrebbe salvarti 8. Tuttavia, è necessario aggiungere un punto in più per utilizzare questa opzione non predefinita.
Digital Trauma,

@DigitalTrauma Conoscevo quel trucco e l'ho provato ma non ha restituito lo stesso risultato: "¿¡Ciao a tutti! ¿Come ti chiami? ¿" Invece di "¡Ciao a tutti! ¿Come ti chiami?"
Aaron,

3

Javascript (ES6), 86 79 66 63 byte

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

Implementerà presto una soluzione bonus.

Grazie a:
@ user81655 , 86 => 79 byte


1
Alcuni miglioramenti che i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
consentono di

@ user81655 Sembra che risparmi 7 byte anziché 9, ma a prescindere, grazie per quello! È stato in grado di rimuovere ancora più byte saltando il controllo delle frasi che terminavano ..
usandfriends


1

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.