Ce n'est pas rien! …ou est-ce?


24

introduction

Les conversations de rue peuvent être vraiment difficiles à comprendre, en particulier pour les programmeurs, qui ne sont pas connus pour être très streetwise.

C'est votre travail de créer un interprète pour nous aider à survivre en milieu urbain.

Défi

Étant donné une phrase anglaise en entrée, créez un programme ou une fonction qui détermine si le résultat de la phrase est positif ou négatif.

La phrase contiendra 0de 2mots négatifs. Comme tout programmeur le sait, un double négatif se traduit par un positif. Par conséquent, votre code doit générer ou renvoyer une valeur truey / falsey selon la règle suivante:

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

La liste des mots négatifs:

  • no, not,none
  • Tout se terminant par n't
  • never, neither,nor
  • nobody, nothing,nowhere

Il y a un cas de bord. Chaque fois qu'une phrase commence par No,, ce mot n'est pas traité comme un mot négatif lors de la détermination du résultat (il compte pour le nombre de mots négatifs, il ne peut donc y en avoir qu'un de plus).

La phrase suivra les règles de grammaire de base (majuscule, ponctuation) et ne contiendra que des mots qui peuvent être trouvés dans un dictionnaire (heureusement, cela n'invalide pas le titre de la question). La phrase ne contiendra aucun nom propre (désolé, Dr Non, vous êtes absent).

Cas de test

Vérité:

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.

L'ironie ici, bien sûr, est que certains d'entre eux doivent être interprétés différemment. Mais bon, vous ne pouvez pas reprocher au haut-parleur de ne pas se conformer à notre logique.

Règles

Les failles standard sont interdites. C'est du , alors soyez concis!


1
Personne n'a jamais été ni nulle part ni rien.
Urne de poulpe magique

1
@MagicOctopusUrn: Vous pouvez perdre le beenpour une phrase négative à 100%!
Antti29

Réponses:


10

Rétine , 63 octets

No,

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

Essayez-le en ligne!

Explication

No,

Supprimer No,de l'entrée. En raison des règles de capitalisation, cela ne peut apparaître qu'au début de l'entrée, nous n'avons donc pas besoin d'un explicite ^.

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

Comptez le nombre de correspondances de l'expression régulière insensible à la casse après le `. Il correspond juste à tous les mots pertinents, où j'ai extrait les préfixes / suffixes communs avec les alternatives.

0|2

Nombre 0ou 2s, nous transformons donc les nombres pairs en 1nombres impairs 0.


faites-vous l'extraction de lettres courantes à la main ou utilisez-vous un programme qui trouve la solution optimale pour vous?
Jonah

@Jonah, je l'ai fait à la main. Il existe des outils pour le métagolf regex automatisé, mais ils prennent généralement deux listes, une pour correspondre et l'autre pour échouer, et génèrent une expression régulière pour cela. Je ne connais aucun outil qui génère une expression rationnelle optimale pour correspondre à un ensemble particulier de sous-chaînes dans une chaîne plus grande.
Martin Ender

3
pourrait constituer un défi intéressant ...
Jonah

Vous devriez pouvoir supposer que cela n'tn'a pas besoin \baprès, car les mots doivent provenir d'un dictionnaire. De plus, j'avais la même chose, mais je n'avais pas la chair de la réponse aussi concise, en utilisant quelques octets de plus.
mbomb007

8

Bash, 115 107 99 98 97 95 85 octets

Utilise les packages Core Utilities (for wc) et grep. Supposons que la phrase soit donnée via l'entrée standard. L'expansion de l'historique est désactivée par set +o histexpand.

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

Vérifiez le résultat: dans Bash 0 est pour vrai, 1 pour faux

Comment ça marche?

((                       )) # 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 octets (115 à 99) sauvés par l' inspiration de Qwertiy 's réponse et Martin Ender ' s réponse . 1 octet merci à Nahuel Fouilleul .


regex n'est pas correct: matchs noonet nonThat's a no, I'm afraid.
Nahuel Fouilleul

@NahuelFouilleul Fixed.
iBug

à vérifier: tio n'a cependant pas pu coller de tests car limite de longueur des commentaires
Nahuel Fouilleul

cela donne de bons résultats((~$(grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er)\b|.*n't\b"|wc -l)%2))
Nahuel Fouilleul

retour citations au lieu de $(..)sauvegarder 1 octet
Nahuel Fouilleul

5

Javascript ES6, 89 87 86 caractères

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

Tester:

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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.