Normale und umgekehrte Ausrufezeichen- und Fragezeichenpaare

13

Herausforderung

¡Wir werden Ausrufezeichen und Fragezeichen für invertierte Freunde setzen!

Einen Körper aus Text Strafen mit der Endung in ., ?oder !, prepend invertiert Fragezeichen, ¿auf Fragesätze (Sätze der Endung ?) und invertierten Ausrufezeichen ¡, auf exclamatory (Sätze der Endung !). Sätze, die auf enden, .sind zu ignorieren.

Sätze werden durch Leerzeichen (Leerzeichen, Tabulatoren und / oder Zeilenumbrüche) getrennt und enthalten nur alphanumerische Zeichen, Kommas, Apostrophe und Leerzeichen. Jeder Satz enthält mindestens ein Wort. Das erste Wort jedes Satzes wird garantiert großgeschrieben. Die Eingabe kann mit einem beliebigen Leerzeichen beginnen und enden.

Beispiel

Eingang:

  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.

Ausgabe:

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

Regeln

  • Es gelten alle Standardregeln von Code Golf.
  • Das Programm mit der kürzesten Anzahl von Bytes gewinnt.

Bonus (17% Rabatt) - Analysieren Sie mehrere Noten

Ein Satz kann auch mit mehreren Ausrufezeichen / Fragezeichen enden. Weisen Sie jedem dieser Zeichen ein umgekehrtes Ausrufezeichen / Fragezeichen zu, um zusätzliche 17% weniger Byte zu erhalten.

Beispiel

Eingang:

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

Ausgabe:

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

Falsche Ausgabe:

¿¿I am a man in a can doing a dance?? Maybe...
              ¿¿¡¿¿¿¡Doing it for the views??!???!
usandfriends
quelle
Können wir wählen, welche Art von Leerzeichen die Sätze trennt, oder müssen wir alle drei Typen unterstützen?
Mego
@Mego Alle drei Typen sollten unterstützt werden.
Usandfriends
Nein, ein Satz enthält immer mindestens ein Wort und endet mit einem der drei zulässigen Interpunktionszeichen. Ich werde das der Herausforderung hinzufügen.
Usandfriends

Antworten:

5

Retina , 39 37 34 Bytes

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

Probieren Sie es online aus.

Erläuterung

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

Dies stimmt mit einem Satz überein, der mit einem Ausrufezeichen oder Fragezeichen endet, und stellt das Interpunktionszeichen vor den Satz. Jetzt wissen wir, dass alle !oder? die unmittelbar von einem Nicht-Leerzeichen gefolgt werden, diejenigen sein müssen, die wir eingefügt haben, da die ursprünglichen Zeichen durch ein Leerzeichen vom nächsten Zeichen getrennt sein sollten.

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

Diese Umschrift Bühne dreht sich alles !und ?in ¡und ¿jeweils, sofern sie in einem Spiel gefunden sind \S\b, die nur für diejenigen gilt wir gerade eingefügt. Ersetzen Sie beide in zwei getrennten Ersetzungen in derselben Byteanzahl, aber ich bevorzuge hier die Semantik einer Transliterationsstufe.

Martin Ender
quelle
3

Mathematica 137 Bytes

Nicht die kürzeste, aber es hat Spaß gemacht.

TextSentencesZerlegt den eingegebenen Text in Sätze und StringPositionfindet die Anfangs- und Endposition jedes Satzes im Text. Die umgekehrte Interpunktion wird nach Bedarf am Anfang jedes Satzes eingefügt.

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

Verwendung unter der Annahme, dass der Text eingegeben wird bei t,

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

Ausgabe

DavidC
quelle
1
Cool, eine Lösung ohne RegExp!
Usandfriends
3

Sed, 61 Bytes

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

Testlauf :

$ 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
quelle
1
Dies sind technisch gesehen 61 Bytes, da die invertierten Zeichen 2 Bytes betragen.
Usandfriends
@ usandfriends richtig, behoben
Aaron
Wenn Sie die Verwendung - -rFlag (GNU) sed, brauchen Sie nicht die zu entkommen (und )das sollten Sie 8. sparen brauchen Sie allerdings einen Extrapunkt für die Verwendung dieser nicht-Standardoption hinzuzufügen.
Digitales Trauma
@DigitalTrauma Ich kannte diesen Trick und versuchte es, aber es gab nicht die gleiche Ausgabe zurück: "Hallo! Wie heißt du?" Anstelle von "Hallo!" Wie heißt du? "
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)

Verwendung:

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

Wird bald eine Bonuslösung implementieren.

Dank an:
@ user81655 , 86 => 79 Bytes

usandfriends
quelle
1
Einige Verbesserungen, die 9 Bytes einsparen:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655
@ user81655 Es sieht so aus, als würde 7 statt 9 Bytes gespart, aber trotzdem, danke dafür! Konnte durch Überspringen der Suche nach Sätzen, die auf enden, noch mehr Bytes entfernen ..
Usandfriends
3

Mathematica, 101 92 91 Bytes

StringReplace[#,RegularExpression@"[A-Z][^.]*?([?!])":><|"?"->"¿","!"->"¡"|>@"$1"<>"$0"]&
LegionMammal978
quelle
Würden Sie erklären, wie das funktioniert?
DavidC
1
@ DavidC Es ist schwierig.
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
quelle