不是不是!…还是?


24

介绍

实话实在很难理解,尤其是对于不熟悉实话的程序员。

创建口译员来帮助我们所有人在城市环境中生存是您的工作。

挑战

给定一个英语句子作为输入,创建一个程序或函数来确定句子的结果是肯定的还是否定的。

这句话包含02否定词。众所周知,双重否定会导致积极。因此,您的代码必须根据以下规则输出或返回true / falsey值:

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

否定词列表:

  • nonotnone
  • 以结尾的任何东西 n't
  • neverneithernor
  • nobodynothingnowhere

有一种情况。每当句子以开头时No,,在确定结果时该词都不会被视为否定词(它确实计入否定词的数量,因此可以再增加一个)。

该句子将遵循基本的语法规则(大写,标点符号),并且仅包含可以从词典中找到的单词(幸运的是,这不会使问题标题无效)。该句子将不包含任何专有名词(对不起,博士,您不在了)。

测试用例

真相:

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年

Answers:


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 02s,因此我们将偶数计数变为1,将奇数计数变为0


您是手工提取常用字母还是使用找到适合您的最佳解决方案的程序?
乔纳

@Jonah我是手工做的。有一些用于自动正则表达式元高尔夫的工具,但它们通常采用两个列表,一个匹配列表,一个失败列表,并为此生成一个正则表达式。我不知道有什么工具可以生成最佳正则表达式来匹配较大字符串中的特定子字符串集。
Martin Ender's

3
可能会带来一个有趣的挑战……
乔纳(Jonah)2017年

您应该能够假定它n't并不需要\b,因为这些单词必须来自字典。另外,我也有同样的事情,但是我并没有那么简明扼要地回答问题,而是使用了另外两个字节。
mbomb007 '17

8

Bash,115 107 99 98 97 95 85字节

使用包核心实用程序(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表示“ 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

Qwertiy的答案Martin Ender的答案中汲取灵感,节省了18个字节(115到99)。感谢Nahuel Fouilleul 1个字节。


正则表达式是不正确的:比赛noon而不是That's a no, I'm afraid.
纳乌艾尔乌Fouilleul

@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))
Nahuel Fouilleul

反引号而不是$(..)保存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)))


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.