Понедельник Мини-гольф # 5: <s> НЕ </ s> Пробуйте это дома


24

Мини-гольф по понедельникам: серия коротких вопросов о , публикуемых (надеюсь!) Каждый понедельник.

Иногда люди устают от жизненных правил: «не делай этого», «ты не можешь этого делать», «мы не позволим тебе сделать это». Это может показаться действительно ограничивающим время от времени! Но время от времени хорошо немного повеселиться, поэтому давайте напишем некоторый код, чтобы изменить эти правила. И в то время как мы на это, могли бы также изменить и другой негатив. (Конечно, эти изменения не будут носить временный характер, поэтому мы также оставим оригинальную формулировку.)

Вызов

Ваша задача состоит в том, чтобы написать программу или функцию, которая ставит <s>зачеркивание HTML </s>вокруг ограничительных слов, то есть слов, оканчивающихся на n'tили после которых, notи после каждого из них вставляет свой положительный эквивалент в ALL CAPS. В конце, после пробела, должно быть указано количество произведенных замен. Например:

Please don't jump into the pool.

становится

Please <s>don't</s> DO jump into the pool. 1

Для слов, заканчивающихся n'tили сопровождаемых not(а также cannot) положительным эквивалентом является все до вышеупомянутого not(исключая пробелы). Вот что я имею в виду:

  • do not speak становится <s>do not</s> DO speak
  • it doesn't work становится it <s>doesn't</s> DOES work
  • we cannot становится we <s>cannot</s> CAN

Однако есть несколько исключений. Убедитесь, что они обрабатываются правильно.

can't -> <s>can't</s> CAN
won't -> <s>won't</s> WILL
ain't -> <s>ain't</s> AM
shan't -> <s>shan't</s> SHALL
I'm not -> <s>I'm not</s> I AM
you're not -> <s>you're not</s> YOU ARE

Детали

  • Ввод никогда не будет содержать пробелов, кроме обычных пробелов (без вкладок, новых строк и т. Д.).
  • На входе никогда не будет двойных негативов (например we can't not do this).
  • Если notсразу после знака препинания появляется знак «А» или как часть другого слова, оставьте его.
  • Обязательно сохраняйте исходный текст, включая прописные / строчные буквы, между <s></s>тегами.
  • Если вы хотите, вы можете использовать <strike></strike>вместо <s></s>.

Тест-кейсы

Входы:

I'm sorry, but you can't do that.
Driving on the beach isn't allowed.
Driving on the beach is not allowed.
Please don't jump in; I cannot imagine what might come of that.
Don't worry; we won't get into trouble.
I'm not perfect, but you're not either.
You shan't do it 'cause I ain't doin' it!
Can't we capitalize special cases?
I don't like the words can't, shan't, won't, don't, ain't, or ppcgn't.
Oh, this? It's nothing.
Tie a slipknot in the rope.
Would you like Pinot Noir?
This sentence contains none of the replacement words. Not even knot or ca't.
This sentence doesn't contain one of the replacement words.

Выходы:

I'm sorry, but you <s>can't</s> CAN do that. 1
Driving on the beach <s>isn't</s> IS allowed. 1
Driving on the beach <s>is not</s> IS allowed. 1
Please <s>don't</s> DO jump in; I <s>cannot</s> CAN imagine what might come of that. 2
<s>Don't</s> DO worry; we <s>won't</s> WILL get into trouble. 2
<s>I'm not</s> I AM perfect, but <s>you're not</s> YOU ARE either. 2
You <s>shan't</s> SHALL do it 'cause I <s>ain't</s> AM doin' it! 2
<s>Can't</s> CAN we capitalize special cases? 1
I <s>don't</s> DO like the words <s>can't</s> CAN, <s>shan't</s> SHALL, <s>won't</s> WILL, <s>don't</s> DO, <s>ain't</s> AM, or <s>ppcgn't</s> PPCG. 7
Oh, this? It's nothing. 0
Tie a slipknot in the rope. 0
Would you like Pinot Noir? 0
This sentence contains none of the replacement words. Not even knot or ca't. 0
This sentence <s>doesn't</s> DOES contain one of the replacement words. 1

счет

Это , поэтому выигрывает самый короткий действительный код в байтах. Tiebreaker переходит к представлению, которое первым достигло конечного числа байтов. Победитель не будет выбран в следующий понедельник, 26 октября. Удачи!


@FryAmTheEggman Да, если нет других достойных добавления в список. Я бы предпочел быть кратким, но есть ли у вас какие-либо предложения?
ETHproductions

Нет, просто не хотел, чтобы это страдало от синдрома вызова «ты изменил спецификацию, теперь он отстой»: P
FryAmTheEggman

1
Предлагаемый тестовый пример:Can't we capitalize special cases?
DLosc

Нужно ли быть осторожным со строками вроде: Oh this? It's nothing...или I wonder if we'll notice any words like this??
Дом Гастингс

2
Один <strike> не </ strike> просто превращает мемы в конкурсы!
января

Ответы:


7

Пип , 138 140 байт

Иш, что cannot/ knotразличие сложно.

x:"ca wo ai sha i'm you're"^sY"CAN0WILL0AM0SHALL0I AM0YOU ARE"^0OqR-`([\w']+)( no|n'|(?<=can)no)t\b`{++i"<s>".a."</s>".s.((yx@?LCb)|UCb)}s.i

Читает строку из стандартного ввода, выводит в стандартный вывод. Регулярное выражение:

`([\w']+)( no|n'|(?<=can)no)t\b`

соответствует слову (включая апострофы), за которым следует одно из трех:

  • not
  • n't
  • not без пробела, при условии, что первая половина слова была can

-Оператор на регулярном выражении делает его нечувствительным к регистру.

Матчи заменяются результатом следующей функции. (Примечание: внутри функции a- все совпадение и bгруппа захвата 1.)

{++i"<s>".a."</s>".s.((yx@?LCb)|UCb)}
 ++i                                   Increment counter
    "<s>".a."</s>"                     Return entire match wrapped in HTML tags...
                  .s.(             )   plus space, plus the following:
                           LCb         Lowercase first capture group
                        x@?            Find its index in list x of special cases (nil if
                                         not in list)
                      (y      )        Use that as index into list y of replacements
                               |UCb    If it wasn't a special case, this is nil, and we
                                         instead use uppercase(b)

Как только измененная строка завершена, мы также выводим пробел и количество замен i.


3

GNU Sed, 321 байт

(включая +1 за -r)

:
s!(can('|no)t)([^<])!<s>\1</s> CAN\3!i
s!(won't)([^<])!<s>\1</s> WILL\2!i
s!(ain't)([^<])!<s>\1</s> AM\2!i
s!(shan't)([^<])!<s>\1</s> SHALL\2!i
s!(I'm not)([^<])!<s>\1</s> I AM\2!i
s!(you're not)([^<])!<s>\1</s> YOU ARE\2!i
t
s!(([^ .!?]+)(n't| not))([^<])!<s>\1</s> \U\2\4!i
t
h
s/1//g
s/<s>/1/g
s/[^1]//g
x
G
s/\n/ /

«Замена струн - работа для седа!» Я думал. Но это было удивительно сложно, и я продолжал поддаваться замене исходного текста. И считать! По крайней мере, нет запрета на унарный в вопросе ...


2

Perl, 153 байта

150 сценариев + 3 за -p

$c=0|s!\b((ca)nnot|([\w']+)(?: not|n't))\b!"<s>$&</s> ".uc({ai,AM,ca,CAN,wo,WILL,sha,SHALL,"i'm","I AM","you're","YOU ARE"}->{lc$+}||$+)!egi;s/
/ $c
/

Итак, пока я сопоставляю все тестовые случаи, но это регулярное выражение дорого обошлось мне ... Я подумаю над этим!

Пример вывода:

$perl -p can.pl <<< "I'm sorry, but you can't do that.
Driving on the beach isn't allowed.
Driving on the beach is not allowed.
Please don't jump in; I cannot imagine what might come of that.
Don't worry; we won't get into trouble.
I'm not perfect, but you're not either.
You shan't do it 'cause I ain't doin' it!
Can't we capitalize special cases?
I don't like the words can't, shan't, won't, don't, ain't, or ppcgn't.
Oh, this? It's nothing.
This sentence contains none of the replacement words. Not even knot or ca't.
This sentence doesn't contain one of the replacement words.
Tie a slipknot in the rope.
Would you like Pinot Noir?
You cannot be serious\!"
I'm sorry, but you <s>can't</s> CAN do that. 1
Driving on the beach <s>isn't</s> IS allowed. 1
Driving on the beach <s>is not</s> IS allowed. 1
Please <s>don't</s> DO jump in; I <s>cannot</s> CAN imagine what might come of that. 2
<s>Don't</s> DO worry; we <s>won't</s> WILL get into trouble. 2
<s>I'm not</s> I AM perfect, but <s>you're not</s> YOU ARE either. 2
You <s>shan't</s> SHALL do it 'cause I <s>ain't</s> AM doin' it! 2
<s>Can't</s> CAN we capitalize special cases? 1
I <s>don't</s> DO like the words <s>can't</s> CAN, <s>shan't</s> SHALL, <s>won't</s> WILL, <s>don't</s> DO, <s>ain't</s> AM, or <s>ppcgn't</s> PPCG. 7
Oh, this? It's nothing. 0
This sentence contains none of the replacement words. Not even knot or ca't. 0
This sentence <s>doesn't</s> DOES contain one of the replacement words. 1
Tie a slipknot in the rope. 0
Would you like Pinot Noir? 0
You <s>cannot</s> CAN be serious\! 1

Вау, это компактно! Одна проблема: I'm notне работает должным образом - это должно быть I AMвместо I'M. Но я думаю , что вам просто нужно изменить , I'mчтобы i'mв коде , чтобы исправить это.
DLosc

О - также, попробуйте это на предложениях как Tie a slipknot in the rope.или Would you like Pinot Noir?. Они еще не в тестовых случаях, но намерение ОП состояло в том, чтобы исключить любое слово, оканчивающееся на, notкроме cannot.
DLosc

@DLosc Отличные тестовые случаи! Я не мог придумать больше слов, оканчивающихся на not! Это I'mбыл плохой промах, спасибо за место!
Дом Гастингс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.