Нормальні та перевернуті парами оклику та знака питання


13

Виклик

¡Ми збираємось давати вигуки та знаки запитання перевернутих приятелів!

З огляду на тіло тексту , що містять пропозиції , що закінчується ., ?або !, перед ім'ям перевернутих знаків питання, ¿до питальним пропозицій (пропозиції закінчуються в ?) і перевернутих оклику знаки, ¡до знаком оклику (пропозицій , що закінчується !). Присуди, що закінчуються ., ігноруються.

Речення будуть розділені пробілом (пробіли, вкладки та / або нові рядки) і містять лише буквено-цифрові цифри, коми, апострофи та пробіли. Кожне речення матиме хоча б одне слово. Перше слово кожного речення гарантовано з великої літери. Введення може починатися і закінчуватися будь-яким пробілом.

Приклад

Вхід:

  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.

Вихід:

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

Правила

  • Всі правила Кодексу Golf Golf застосовуються.
  • Виграє програма з найменшою кількістю байтів.

Бонус (знижка 17%) - Проаналізуйте кілька знаків

Речення також може закінчуватися кількома знаками оклику / питання. Надайте кожному з цих знаків парний зворотний знак оклику / питання для додаткових 17% знижок.

Приклад

Вхід:

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

Вихід:

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

Неправильний вихід:

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

Чи можемо ми вибрати, який тип пробілу розділяє речення, чи нам потрібно підтримувати всі 3 типи?
Мего

@Mego Усі три типи повинні підтримуватися.
usandfriends

Ні, у реченні завжди буде принаймні одне слово і закінчуватиметься одним із трьох дозволених знаків пунктуації. Я додам це до виклику.
usandfriends

Відповіді:


5

Сітківка , 39 37 34 байт

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

Спробуйте в Інтернеті.

Пояснення

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

Це відповідає реченню, що закінчується знаком оклику чи питання, і подає цей розділовий знак до речення. Тепер ми знаємо, що всі !або за ?якими відразу слідує непробільний символ, повинні бути тими, які ми вставили, оскільки оригінали повинні бути відокремлені пробілом від наступного символу.

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

Цей етап транслітерації перетворює все !і ?в ¡і ¿, відповідно, при умови , що вони знайшли в матчі \S\b, який застосовується тільки до тих , кого ми тільки що вставили. Заміняючи обидві на дві заміни в одному байті, але я віддаю перевагу семантиці етапу транслітерації.


3

Математика 137 байт

Не найкоротший, але це було цікаво робити.

TextSentencesрозбиває введений текст на речення та StringPositionзнаходить початкові та кінцеві положення кожного речення в тексті. Знаки пунктуації перевернуті на ногу вставляються на початку кожного речення, якщо потрібно.

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

Використання, якщо припустимо, що текст введено в t,

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

вихід


1
Класно, рішення, яке не використовує RegExp!
usandfriends

3

Сід, 61 байт

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

Пробіг:

$ 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
Технічно це 61 байт, оскільки перевернуті символи вважаються 2 байтами.
usandfriends

@usandfriends праворуч, виправлено
Аарон

Якщо ви використовуєте -rпрапор для (GNU) sed, вам не потрібно бігти (та, )що може заощадити вас 8. Вам потрібно додати додаткову точку, щоб використовувати цю опцію за замовчуванням.
Цифрова травма

@DigitalTrauma Я знав цей трюк і спробував його, але він не повернув однаковий результат: "¿¡Привіт там! ¿Як тебе звати? ¿" Замість "¡Привіт, там! ¿Як тебе звати?"
Аарон

3

Javascript (ES6), 86 79 66 63 байт

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

Безголівки:

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

Використання:

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

Незабаром буде впроваджено бонусне рішення.

Завдяки:
@ user81655 , 86 => 79 байт


1
Кілька вдосконалень, які заощаджують 9 байт:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655

@ user81655 Схоже, що це економить 7 байт замість 9, але незалежно, дякую за це! Вдалося видалити ще більше байтів, пропустивши перевірку на пропозиції, що закінчуються на ..
usandfriends

3

Математика, 101 92 91 байт

StringReplace[#,RegularExpression@"[A-Z][^.]*?([?!])":><|"?"->"¿","!"->"¡"|>@"$1"<>"$0"]&

Ви б пояснили, як це працює?
DavidC

1
@DavidC Це складно.
LegionMammal978

1

Python 2, 127,82 (154-17%) байт

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.