Нормальные и перевернутые пары восклицательных и вопросительных знаков

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.

правила

  • Применяются все правила Code 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??!???!
usandfriends
источник
Нужно ли нам выбирать, какой тип пробела отделяет предложения, или мы должны поддерживать все 3 типа?
Мего
@Mego Все три типа должны поддерживаться.
usandfriends
Нет, предложение всегда будет содержать хотя бы одно слово и будет заканчиваться одним из трех разрешенных знаков препинания. Я добавлю это к проблеме.
usandfriends

Ответы:

5

Сетчатка , 39 37 34 байта

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

Попробуйте онлайн.

объяснение

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

Это соответствует предложению, оканчивающемуся на восклицательный знак или вопросительный знак, и добавляет этот знак препинания к предложению. Теперь мы знаем, что все !или, за ?которыми сразу следует непробельный символ, должны быть теми, которые мы вставили, потому что исходные должны быть отделены от следующего символа пробелом.

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

Эта стадия транслитерации превращает все !и ?в ¡и ¿, соответственно, при условии, что они найдены в совпадении \S\b, которое применяется только к тем, которые мы только что вставили. Замена обоих в двух отдельных подстановках в одном и том же количестве байтов, но я предпочитаю семантику стадии транслитерации здесь.

Мартин Эндер
источник
3

Mathematica 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]

выход

DavidC
источник
1
Круто, решение, которое не использует RegExp!
usandfriends
3

Sed, 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)

Ungolfed:

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 байт

usandfriends
источник
1
Несколько улучшений, которые экономят 9 байтов:i=>i.replace(/[A-Z][^.!?]*[.!?]/g,k=>(r=k.slice(-1))<'.'?'¡'+k:r>'.'?'¿'+k:k)
user81655
@ user81655 Похоже, что он экономит 7 байтов вместо 9, но все равно, спасибо за это! Удалось удалить еще больше байтов, пропустив проверку предложений, заканчивающихся на ..
usandfriends
3

Mathematica, 101 92 91 байт

StringReplace[#,RegularExpression@"[A-Z][^.]*?([?!])":><|"?"->"¿","!"->"¡"|>@"$1"<>"$0"]&
LegionMammal978
источник
Не могли бы вы объяснить, как это работает?
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())
TFeld
источник