感謝していません!…またはそれは?


24

前書き

ストリートトークは、特にプログラマーにとっては理解するのが非常に難しい場合があります。

私たち全員が都市環境で生き残るのを助ける通訳を作成するのはあなたの仕事です。

チャレンジ

入力として英語の文を指定して、文の結果が正か負かを決定するプログラムまたは関数を作成します。

文には否定的な単語が含ま02ます。プログラマなら誰でも知っているように、二重の負は正になります。したがって、コードは、次の規則に従って、true / falsey値を出力または返す必要があります。

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

否定的な単語のリスト:

  • nonotnone
  • で終わるもの n't
  • neverneithernor
  • nobodynothingnowhere

エッジケースが1つあります。文がで始まるときはいつでも、No,結果を決定するときにその単語は否定的な単語として扱われません(否定的な単語の数にカウントされるので、もう1つだけあります)。

文は基本的な文法規則(大文字、句読点)に従い、辞書から検索できる単語のみを含みます(幸いなことに、これは質問のタイトルを無効にしません)。この文には固有名詞は含まれません(申し訳ありませんが、Dr。いいえ、あなたは外出しています)。

テストケース

真実:

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
誰もどこにも行かなかったこともない。
魔法のタコUr

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

カウント0または2sであるため1、偶数カウントを奇数カウントに変換し0ます。


手で一般的な文字を抽出しますか、それとも最適な解決策を見つけるプログラムを使用しますか?
ジョナ

@ジョナ私はそれを手でやった。自動化された正規表現メタゴルフ用のツールがありますが、通常、一致するリストと失敗するリストの2つのリストを取得し、そのための正規表現を生成します。大きな文字列の特定の部分文字列セットに一致する最適な正規表現を生成するツールを知りません。
マーティンエンダー

3
興味深い挑戦をすることができ
ジョナ

単語は辞書から取得しなければならn'tないので\b、その後は必要ないと仮定できるはずです。また、私は同じことをしていましたが、私は答えの肉を簡潔に持っていませんでした。
mbomb007

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

以下からのインスピレーションで保存された18バイト(115〜99)Qwertiyの答えマーティン・エンダーの答えNahuel Fouilleulに 1バイト感謝します。


正規表現が正しくnoonありません:一致していないThat'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バイトを保存する代わりに引用符を戻す
ナウエル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)))


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.