Non è niente! …o è?


24

introduzione

Le chiacchiere di strada possono essere davvero difficili da capire, in particolare per i programmatori, che non sono noti per essere molto streetwise.

Il tuo compito è creare un interprete per aiutare tutti noi a sopravvivere nell'ambiente urbano.

Sfida

Data una frase inglese come input, crea un programma o una funzione che determina se il risultato della frase è positivo o negativo.

La frase conterrà 0a 2parole negative. Come ogni programmatore sa, un doppio negativo si traduce in un positivo. Pertanto, il codice deve generare o restituire un valore di verità / falsità secondo la seguente regola:

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

L'elenco delle parole negative:

  • no, not,none
  • Qualunque cosa finisca in n't
  • never, neither,nor
  • nobody, nothing,nowhere

C'è un caso limite. Ogni volta che inizia una frase No,, quella parola non viene trattata come una parola negativa quando si determina il risultato (conta per il numero di parole negative, quindi può essercene solo un'altra).

La frase seguirà le regole grammaticali di base (maiuscole, punteggiatura) e conterrà solo parole che possono essere trovate da un dizionario (per fortuna, questo non invalida il titolo della domanda). La frase non conterrà nomi propri (scusate, Dr. No, siete fuori).

Casi test

Truthy:

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'ironia qui, ovviamente, è che alcuni di questi dovrebbero essere interpretati in modo diverso. Ma hey, non puoi criticare l'altoparlante per non essere conforme alla nostra logica.

Regole

Sono vietate le scappatoie standard . Questo è , quindi sii conciso!


1
Nessuno non è mai stato né da nessuna parte né niente.
Magic Octopus Urn

1
@MagicOctopusUrn: puoi perdere la beenfrase negativa al 100%!
Antti29,

Risposte:


10

Retina , 63 byte

No,

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

Provalo online!

Spiegazione

No,

Rimuovi No,dall'input. A causa delle regole di capitalizzazione, questo può apparire solo all'inizio dell'input, quindi non abbiamo bisogno di un esplicito ^.

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

Conta il numero di corrispondenze della regex senza distinzione tra maiuscole e minuscole dopo il `. Corrisponde solo a tutte le parole pertinenti, in cui ho estratto prefissi / suffissi comuni con le alternative.

0|2

Count 0o 2s, quindi trasformiamo i conteggi pari in 1e conteggi dispari in 0.


fai l'estrazione di lettere comuni a mano o usi un programma che trova la soluzione ottimale per te?
Giona il

@Jonah l'ho fatto a mano. Ci sono strumenti per regex automatizzato metagolf, ma di solito prendono due elenchi, uno da abbinare e uno da fallire, e generano un regex per quello. Non sono a conoscenza di alcuno strumento che generi una regex ottimale per abbinare una particolare serie di sottostringhe in una stringa più grande.
Martin Ender,

3
potrebbe essere una sfida interessante ...
Giona il

Dovresti essere in grado di supporre che n'tnon sia necessario \bdopo, poiché le parole devono provenire da un dizionario. Inoltre, avevo la stessa cosa, ma non avevo la carne della risposta in modo conciso, usando un altro paio di byte.
mbomb007,

8

Bash, 115 107 99 98 97 95 85 byte

Utilizza i pacchetti Core Utilities (per wc) e grep. Supponiamo che la frase sia data tramite Input standard. L'espansione della cronologia è disabilitata da set +o histexpand.

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

Controlla il risultato: in Bash 0 è vero, 1 è falso

Come funziona?

((                       )) # 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 byte (115-99) salvati con ispirazione da Qwertiy 'risposta s e Martin Ender ' risposta s . 1 byte grazie a Nahuel Fouilleul .


regex non è corretto: partite noone nonThat's a no, I'm afraid.
Nahuel Fouilleul

@NahuelFouilleul Fixed.
iBug

da controllare: tio tuttavia non è riuscito a incollare i test a causa del limite di lunghezza dei commenti
Nahuel Fouilleul

questo dà i giusti risultati((~$(grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er)\b|.*n't\b"|wc -l)%2))
Nahuel Fouilleul

virgolette invece di $(..)salvare 1 byte
Nahuel Fouilleul

5

Javascript ES6, 89 87 86 caratteri

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.