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

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.


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


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.

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


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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.