Normalne i odwrócone pary wykrzykników i znaków zapytania

13

Wyzwanie

¡Odwrócimy kumpli wykrzykniki i znaki zapytania!

Biorąc pod uwagę tekst zawierający zdania kończące się na ., ?lub !poprzedzające odwrócone znaki zapytania, na pytania pytające ¿(zdania kończące się na ?) i odwrócone wykrzykniki ¡, na wykrzyknik (zdania kończące się na !). Zdania kończące się na .są ignorowane.

Zdania będą oddzielone spacjami (spacje, tabulatory i / lub znaki nowej linii) i będą zawierać tylko znaki alfanumeryczne, przecinki, apostrofy i spacje. Każde zdanie będzie zawierało co najmniej jedno słowo. Pierwsze słowo każdego zdania gwarantuje wielkie litery. Wprowadzanie danych może rozpoczynać się i kończyć dowolną spacją.

Przykład

Wejście:

  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.

Wynik:

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

Zasady

  • Obowiązują wszystkie domyślne reguły Code Golf.
  • Program z najmniejszą ilością bajtów wygrywa.

Bonus (17% zniżki) - Analizuj wiele znaków

Zdanie może również kończyć się wieloma wykrzyknikami / znakami zapytania. Daj każdemu z tych znaków odwrotny wykrzyknik / znak zapytania za dodatkowe 17% zniżki na liczbę bajtów.

Przykład

Wejście:

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

Wynik:

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

Niepoprawna wydajność:

¿¿I am a man in a can doing a dance?? Maybe...
              ¿¿¡¿¿¿¡Doing it for the views??!???!
usandfriends
źródło
Czy możemy wybrać rodzaj białych znaków oddzielających zdania, czy też musimy obsługiwać wszystkie 3 typy?
Mego
@Mego Wszystkie trzy typy powinny być obsługiwane.
usandfriends
Nie, zdanie zawsze będzie zawierało co najmniej jedno słowo i zakończy się jednym z trzech dozwolonych znaków interpunkcyjnych. Dodam to do wyzwania.
usandfriends

Odpowiedzi:

5

Retina , 39 37 34 bajtów

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

Wypróbuj online.

Wyjaśnienie

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

Dopasowuje zdanie kończące się wykrzyknikiem lub znakiem zapytania i dołącza do niego ten znak interpunkcyjny. Teraz wiemy, że wszystkie !lub ?które są następnie natychmiast ma charakteru przestrzeni muszą być te my włożona, ponieważ oryginalne powinny być oddzielone od następnego znaku spacją.

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

Ten etap transliteracji zamienia wszystko !i ?na ¡i ¿, odpowiednio, o ile są one znaleźć w meczu \S\b, który ma zastosowanie tylko do tych, które po prostu włożone. Zamieniając oba na dwa oddzielne podstawienia w tej samej liczbie bajtów, ale wolę tutaj semantykę etapu transliteracji.

Martin Ender
źródło
3

Mathematica 137 bajtów

Nie najkrótszy, ale było fajnie.

TextSentencesdzieli tekst wejściowy na zdania i StringPositionznajduje pozycję początkową i końcową każdego zdania w tekście. Interpunkcja do góry nogami jest wstawiana na początku każdego zdania zgodnie z wymaganiami.

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

Zastosowanie, przy założeniu, że tekst jest wprowadzany w t,

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

wynik

DavidC
źródło
1
Cool, rozwiązanie, które nie korzysta z RegExp!
usandfriends
3

Sed, 61 bajtów

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

Testowe uruchomienie :

$ 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
źródło
1
Technicznie jest to 61 bajtów, ponieważ znaki odwrócone liczą się jako 2 bajty.
usandfriends
@usandfriends racja, naprawiono
Aaron
Jeśli użyjesz -rflagi do (GNU) sed, nie musisz uciekać od, (a to )powinno cię uratować 8. Musisz jednak dodać dodatkowy punkt, aby skorzystać z tej domyślnej opcji.
Digital Trauma
@DigitalTrauma Znałem tę sztuczkę i wypróbowałem ją, ale nie zwróciła tego samego wyniku: „¿¡Witaj! ¿Jak masz na imię? ¿” Zamiast „¡Cześć! ¿Jak masz na imię?”
Aaron,
3

JavaScript (ES6), 86 79 66 63 bajtów

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

Nie golfowany:

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

Stosowanie:

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

Wkrótce wprowadzi rozwiązanie premiowe.

Dzięki:
@ user81655 , 86 => 79 bajtów

usandfriends
źródło
1
Kilka ulepszeń, które oszczędzają 9 bajtów:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655
@ user81655 Wygląda na to, że oszczędza 7 bajtów zamiast 9, ale niezależnie, dziękuję za to! Był w stanie usunąć jeszcze więcej bajtów, pomijając sprawdzanie zdań kończących się na ..
usandfriends
3

Mathematica, 101 92 91 bajtów

StringReplace[#,RegularExpression@"[A-Z][^.]*?([?!])":><|"?"->"¿","!"->"¡"|>@"$1"<>"$0"]&
LegionMammal978
źródło
Czy wyjaśniłbyś, jak to działa?
DavidC
1
@DavidC To trudne.
LegionMammal978
1

Python 2, 127,82 (154-17%) bajtów

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
źródło