Не тхан! …либо это?

24

Введение

Уличные разговоры могут быть действительно трудными для понимания, особенно программистам, которые, как известно, не очень уличны.

Ваша задача - создать переводчика, который поможет нам выжить в городской среде.

Вызов

Учитывая предложение на английском языке, создайте программу или функцию, которая определяет, будет ли результат предложения положительным или отрицательным.

Приговор будет содержать 0до 2отрицательных слов. Как знает любой программист, двойной отрицательный результат приводит к положительному. Следовательно, ваш код должен выводить или возвращать значение true / falsey согласно следующему правилу:

No negative words  -> truthy
One negative word  -> falsey
Two negative words -> truthy

Список негативных слов:

  • no, not,none
  • Все, что заканчивается в n't
  • never, neither,nor
  • nobody, nothing,nowhere

Есть один крайний случай. Всякий раз, когда предложение начинается с No,, это слово не рассматривается как отрицательное слово при определении результата (оно учитывается в количестве отрицательных слов, поэтому может быть только одно).

Предложение будет следовать основным правилам грамматики (использование заглавных букв, пунктуация) и будет содержать только те слова, которые можно найти в словаре (к счастью, это не делает недействительным заголовок вопроса). Предложение не будет содержать имен собственных (извините, доктор Нет, вы вышли).

Контрольные примеры

Truthy:

Yes.
It's noon.
Hello, World!
What is this?
Ain't no thang!
Never say never.
No, it's noon now.
Neither me nor you.
I didn't do nothing!
No, I am your father.
A non-alcoholic drink.
I can't get no satisfaction.
All your base are belong to us.

Falsey:

No.
No, no!
Not today.
Neither am I.
Don't do that!
That's no moon!
And none survived.
Is this not my car?
No man is an island.
Nosebleeds are no fun.
Nothing compares to you.
That's a no, I'm afraid.
No, I am not your mother.

Ирония здесь, конечно, заключается в том, что некоторые из них следует интерпретировать по-разному. Но эй, ты не можешь обвинить говорящего в том, что он не соответствует нашей логике.

правила

Стандартные лазейки запрещены. Это , так что будьте лаконичны!

Antti29
источник
1
Никто никогда не был ни нигде, ни ничем.
Волшебная Осьминог Урна
1
@MagicOctopusUrn: Вы можете потерять been100% отрицательное предложение!
Antti29

Ответы:

10

Сетчатка , 63 байта

No,

Mi`\bn(e(ith|v)er|o(|body|ne|r|t|thing|where))\b|n't\b
0|2

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

объяснение

No,

Удалить No,из ввода. Из-за правил использования заглавных букв, это может появиться только в начале ввода, поэтому нам не нужно явно указывать ^.

Mi`\bn(e(ith|v)er|o(|body|ne|r|t|thing|where))\b|n't\b

Подсчитайте количество совпадений регулярного выражения без учета регистра после `. Он просто сопоставляет все релевантные слова, где я извлек общие префиксы / суффиксы с альтернативами.

0|2

Count 0или 2s, поэтому мы превращаем четные 1и нечетные числа в 0.

Мартин Эндер
источник
Вы делаете обычное извлечение букв вручную или используете программу, которая находит оптимальное решение для вас?
Иона
@ Джона, я сделал это вручную. Существуют инструменты для автоматического метаголфа регулярных выражений, но они обычно берут два списка, один для сопоставления и один для сбоя, и генерируют регулярное выражение для этого. Я не знаю ни одного инструмента, который генерирует оптимальное регулярное выражение для соответствия определенному набору подстрок в большей строке.
Мартин Эндер
3
может сделать интересный вызов ...
Иона
Вы должны быть в состоянии предположить, что n'tэто не нужно \bпосле него, так как слова должны прийти из словаря. Кроме того, у меня было то же самое, но я не имел смысла ответа так кратко, используя еще пару байтов.
mbomb007
8

Баш, 115 107 99 98 97 95 85 байт

Использует пакеты Core Utilities (для wc) и grep. Предположим, что предложение дается через стандартный ввод. Расширение истории отключено set +o histexpand.

((~`grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er|.*n't)\b"|wc -l`%2))

Проверьте результат: в Bash 0 для true, 1 для false

Как это работает?

((                       )) # Logical evaluation: non-zero to TRUE, zero to FALSE
  ~                    %2   # C-style arithmetic: Bit-Negate and Modulus 2
   $(                 )     # Output of the program chain
     grep -Pio "regex"      # PCRE match, ignore case, output matching part one-per-line
     | wc -l                # Pipe to `wc` and count number of lines

18 байт (115 до 99) , хранимых вдохновения из Qwertiy «s ответа и Мартин Эндер » s ответа . 1 байт благодаря Науэлю Фуйе .

iBug
источник
регулярное выражение не правильно: совпадения noonи нетThat's a no, I'm afraid.
Науэль Fouilleul
@NahuelFouilleul Исправлено.
iBug
проверить: tio, тем не менее, не смог вставить тесты, потому что ограничение длины комментария
Науэль Фуий
это дает правильные результаты((~$(grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er)\b|.*n't\b"|wc -l)%2))
Науэль Фуйе
кавычки вместо $(..)сохранения 1 байта
Науэль Фуий
5

Javascript ES6, 89 87 86 символов

s=>s.match(/(?!^no,)\bn(o(|t|r|ne|body|thing|where)|e(v|ith)er)\b|n't\b|$/ig).length&1

Тест:

f=s=>s.match(/(?!^no,)\bn(o(|t|r|ne|body|thing|where)|e(v|ith)er)\b|n't\b|$/ig).length&1

console.log(`Yes.
It's noon.
Hello, World!
Never say never.
Ain't no thang!
No, it's noon now.
Neither me nor you.
I didn't do nothing!
No, I am your father.
A non-alcoholic drink.
I can't get no satisfaction.
All your base are belong to us.`.split`
`.every(f))

console.log(`No.
No, no!
Not today.
Neither am I.
Don't do that!
That's no moon!
And none survived.
No man is an island.
Nosebleeds are no fun.
Nothing compares to you.
That's a no, I'm afraid.
No, I am not your mother.`.split`
`.every(s=>!f(s)))

Qwertiy
источник