Ist kein Thang! …oder ist es?


24

Einführung

Street Talk kann sehr schwer zu verstehen sein, insbesondere für Programmierer, von denen nicht bekannt ist, dass sie sehr streetwise sind.

Es ist Ihre Aufgabe, einen Dolmetscher zu erstellen, der uns allen hilft, im städtischen Umfeld zu überleben.

Herausforderung

Erstellen Sie mit einem englischen Satz als Eingabe ein Programm oder eine Funktion, die bestimmt, ob das Ergebnis des Satzes positiv oder negativ ist.

Der Satz enthält 0zu 2negativen Worte. Wie jeder Programmierer weiß, führt ein doppeltes Negativ zu einem positiven Ergebnis. Aus diesem Grund muss Ihr Code einen Wert für " truthy / falsey" gemäß der folgenden Regel ausgeben oder zurückgeben :

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

Die Liste der negativen Wörter:

  • no, not,none
  • Alles was endet in n't
  • never, neither,nor
  • nobody, nothing,nowhere

Es gibt einen Randfall. Wann immer ein Satz mit beginnt No,, wird dieses Wort bei der Bestimmung des Ergebnisses nicht als negatives Wort behandelt (es zählt zur Anzahl der negativen Wörter, sodass es nur noch ein Wort geben kann).

Der Satz folgt den grundlegenden Grammatikregeln (Groß- und Kleinschreibung, Zeichensetzung) und enthält nur Wörter, die aus einem Wörterbuch stammen (zum Glück macht dies den Fragentitel nicht ungültig). Der Satz enthält keine Eigennamen (Entschuldigung, Dr. Nein, Sie sind nicht da).

Testfälle

Wahrheit:

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.

Die Ironie hier ist natürlich , dass einige dieser sollte anders interpretiert werden. Aber hey, Sie können dem Lautsprecher nichts vorwerfen, weil er unserer Logik nicht entspricht.

Regeln

Standard Lücken sind verboten. Das ist , also sei kurz und bündig!


1
Niemand ist niemals weder nirgendwo noch nichts gewesen.
Magic Octopus Urn

1
@MagicOctopusUrn: Sie können das beenfür einen 100% negativen Satz verlieren !
Antti29

Antworten:


10

Retina , 63 Bytes

No,

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

Probieren Sie es online!

Erläuterung

No,

No,Vom Eingang entfernen . Aufgrund der Großschreibungsregeln kann dies nur am Anfang der Eingabe erscheinen, daher benötigen wir kein explizites ^.

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

Zählen Sie die Anzahl der Übereinstimmungen des Regex ohne Berücksichtigung der Groß- / Kleinschreibung nach dem `. Es werden nur alle relevanten Wörter gefunden, bei denen die Alternativen durch gemeinsame Präfixe / Suffixe ersetzt wurden.

0|2

Zähle 0oder 2s, also wandeln wir gerade Zählungen in 1und ungerade Zählungen in um 0.


Führen Sie die gemeinsame Buchstabenextraktion von Hand durch oder verwenden Sie ein Programm, das die für Sie optimale Lösung findet?
Jonah

@Jonah Ich habe das von Hand gemacht. Es gibt Tools für den automatisierten Regex-Metagolf, aber in der Regel werden zwei Listen verwendet, eine, die übereinstimmt, und eine, die fehlschlägt. Dazu wird ein Regex erstellt. Mir ist kein Tool bekannt, das eine optimale Regex für eine bestimmte Menge von Teilzeichenfolgen in einer größeren Zeichenfolge generiert.
Martin Ender

3
könnte eine interessante Herausforderung darstellen ...
Jonah

Sie sollten davon ausgehen können, dass n'tdas danach nicht benötigt \bwird, da die Wörter aus einem Wörterbuch stammen müssen. Auch ich hatte das Gleiche, aber ich hatte das Fleisch der Antwort nicht so knapp, mit ein paar Bytes mehr.
mbomb007

8

Bash, 115 107 99 98 97 95 85 Bytes

Verwendet die Pakete Core Utilities (für wc) und grep. Angenommen, der Satz wird über die Standardeingabe eingegeben. Die Verlaufserweiterung ist durch deaktiviert set +o histexpand.

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

Überprüfen Sie das Ergebnis: In Bash steht 0 für true, 1 für false

Wie funktioniert es?

((                       )) # 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 Bytes (115 bis 99) gespeichert durch Inspiration von Qwertiy 's Antwort und Martin Ender ' s Antwort . 1 Byte danke an Nahuel Fouilleul .


Regex ist nicht richtig: Spiele noonund nichtThat's a no, I'm afraid.
Nahuel Fouilleul

@NahuelFouilleul Behoben.
iBug

zu überprüfen: tio konnte jedoch keine tests einfügen, da kommentar längenbegrenzung
nahuel fouilleul

Dies ergibt die richtigen Ergebnisse((~$(grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er)\b|.*n't\b"|wc -l)%2))
Nahuel Fouilleul

Zurück Anführungszeichen statt $(..)1 Byte speichern
Nahuel Fouilleul

5

Javascript ES6, 89 87 86 Zeichen

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

Prüfung:

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.