Nie ma sprawy! …Albo to jest?

24

Wprowadzenie

Rozmowa uliczna może być naprawdę trudna do zrozumienia, szczególnie dla programistów, którzy nie są znani z tego, że są bardzo uliczni.

Twoim zadaniem jest stworzenie tłumacza, który pomoże nam wszystkim przetrwać w środowisku miejskim.

Wyzwanie

Biorąc pod uwagę zdanie angielskie jako dane wejściowe, utwórz program lub funkcję, która określa, czy wynik zdania jest pozytywny czy negatywny.

Zdanie może zawierać 0do 2negatywnych słów. Jak każdy programista wie, podwójne ujemne wyniki dają pozytywne. Dlatego kod musi wyświetlać lub zwracać wartość true / falsey zgodnie z następującą regułą:

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

Lista negatywnych słów:

  • no, not,none
  • Wszystko, co kończy się na n't
  • never, neither,nor
  • nobody, nothing,nowhere

Jest jeden przypadek krawędzi. Ilekroć zdanie zaczyna się od No,słowa, słowo to nie jest traktowane jako słowo negatywne przy określaniu wyniku (liczy się do liczby słów negatywnych, więc może być jeszcze jedno).

Zdanie będzie zgodne z podstawowymi zasadami gramatyki (wielkie litery, interpunkcja) i będzie zawierać tylko słowa, które można znaleźć w słowniku (na szczęście nie unieważnia to tytułu pytania). W zdaniu nie będzie żadnych właściwych rzeczowników (przepraszam, dr. Nie, nie ma cię w domu).

Przypadki testowe

Prawda:

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.

Ironią tutaj jest oczywiście to, że niektóre z nich należy interpretować inaczej. Ale hej, nie można winić głośnika za niezgodność z naszą logiką.

Zasady

Standardowe luki są zabronione. To jest , więc zwięźle!

Antti29
źródło
1
Nikt nigdy nie był ani nigdzie, ani niczym.
Magic Octopus Urn
1
@MagicOctopusUrn: Możesz stracić been100% negatywnego zdania!
Antti29,

Odpowiedzi:

10

Siatkówka , 63 bajty

No,

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

Wypróbuj online!

Wyjaśnienie

No,

Usuń No,z wejścia. Ze względu na reguły wielkich liter może to pojawiać się tylko na początku danych wejściowych, więc nie potrzebujemy wyraźnego ^.

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

Policz liczbę dopasowań wyrażenia regularnego bez rozróżniania wielkości liter po `. Po prostu pasuje do wszystkich odpowiednich słów, w których wyodrębniłem wspólne przedrostki / sufiksy z alternatywami.

0|2

Liczba 0lub 2s, więc zmieniamy liczby parzyste na 1nieparzyste 0.

Martin Ender
źródło
robisz zwykłą ekstrakcję listu ręcznie czy używasz programu, który znajdzie dla Ciebie optymalne rozwiązanie?
Jonasz
@Jonah Zrobiłem to ręcznie. Istnieją narzędzia do zautomatyzowanego wyrażania regularnego metagolf, ale zwykle pobierają dwie listy, jedną do dopasowania, a drugą do niepowodzenia i generują wyrażenie regularne w tym celu. Nie znam żadnego narzędzia, które generuje optymalne wyrażenie regularne w celu dopasowania określonego zestawu podciągów w większym ciągu.
Martin Ender
3
może podjąć interesujące wyzwanie ...
Jonasz
Powinieneś być w stanie założyć, że po tym n'tnie trzeba \b, ponieważ słowa muszą pochodzić ze słownika. Poza tym miałem tę samą rzecz, ale nie znałem odpowiedzi tak zwięźle, używając jeszcze kilku bajtów.
mbomb007,
8

Bash, 115 107 99 98 97 95 85 bajtów

Korzysta z pakietów Core Utilities (for wc) i grep. Załóżmy, że zdanie zostało wydane za pomocą standardowego wejścia. Rozszerzanie historii jest wyłączone przez set +o histexpand.

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

Sprawdź wynik: w Bash 0 oznacza true, 1 oznacza false

Jak to działa?

((                       )) # 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 bajtów (115 do 99) zapisane przez inspiracji Qwertiy 's odpowiedź i Martin Ender ' s odpowiedź . 1 bajt dzięki Nahuelowi Fouilleulowi .

iBug
źródło
Wyrażenie regularne jest niepoprawne: pasuje nooni nieThat's a no, I'm afraid.
Nahuel Fouilleul
@NahuelFouilleul Naprawiono.
iBug
do sprawdzenia: tio nie mogło jednak wkleić testów, ponieważ limit długości komentarzy
Nahuel Fouilleul
daje to prawidłowe wyniki((~$(grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er)\b|.*n't\b"|wc -l)%2))
Nahuel Fouilleul
cofnij cytaty zamiast $(..)zapisać 1 bajt
Nahuel Fouilleul
5

JavaScript ES6, 89 87 86 znaków

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

Test:

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
źródło
2

Perl 5 , 74 bajtów

73 bajtowy kod + 1 dla -p.

s/No,//;$_=!(s/(\bn(o(r|t|ne|body|thing|where)?|e(v|ith)er)|n't)\b//gi%2)

Wypróbuj online!

Dom Hastings
źródło