Не буває тангажу! …або це?


24

Вступ

Вуличні розмови можуть бути дуже важкими для розуміння, зокрема програмістам, які, як відомо, не дуже вуличні.

Ваша робота створити перекладача, який допоможе нам усім вижити в міському середовищі.

Виклик

Давши англійське речення як вхідне, створіть програму або функцію, яка визначає, чи є результат речення позитивним чи негативним.

Вирок буде містити 0до 2негативних слів. Як знає будь-який програміст, подвійний негатив призводить до позитивного. Тому ваш код повинен виводити або повертати значення truthy / 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.

Фальсі:

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.

Іронія тут, звичайно, полягає в тому, що деякі з них слід трактувати по-різному. Але ей, ви не можете звинуватити оратора за те, що він не відповідав нашій логіці.

Правила

Стандартні лазівки заборонені. Це , тому будьте лаконічними!


1
Ніхто ніколи не був ні ніде, ні нічого.
Чарівний восьминіг Урна

1
@MagicOctopusUrn: Ви можете втратити значення beenза 100% негативний вирок!
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

Підрахунок 0або 2s, тому ми перетворюємо парні підрахунки в 1непарні і рахуємо 0.


Ви робите звичайне вилучення листів вручну або використовуєте програму, яка знайде оптимальне для вас рішення?
Йона

@Jonah Я зробив це вручну. Існують інструменти для автоматизованого метагельфінгу регулярних вирівнювань, але вони, як правило, беруть два списки, один для узгодження та один для відмови, і генерують для цього регулярний вираз. Мені не відомий жоден інструмент, який генерує оптимальний регулярний вираз для відповідності певному набору підрядків у більшому рядку.
Мартін Ендер

3
міг зробити цікавий виклик ...
Іона

Ви повинні мати можливість припустити, що n'tце не потрібно \bпісля цього, оскільки слова мають походити зі словника. Крім того, у мене було те саме, але я не мав відповіді так стисло, використовуючи ще пару байтів.
mbomb007

8

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

Використовує пакети Core Utilities (for 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 - це правда, 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 байт завдяки Nahuel Fouilleul .


noonThat's a no, I'm afraid.
Регекс

Виправлено @NahuelFouilleul.
iBug

щоб перевірити: tio проте не зміг вставити тести, оскільки обмеження тривалості коментарів
Nahuel Fouilleul

це дає правильні результати((~$(grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er)\b|.*n't\b"|wc -l)%2))
Науель Фуле

зворотні котирування замість $(..)збереження 1 байт
Nahuel Fouilleul

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


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