Não é nada! …ou é?

24

Introdução

As conversas de rua podem ser realmente difíceis de entender, principalmente para os programadores, que não são conhecidos por serem muito idiotas.

É seu trabalho criar um intérprete para ajudar a todos nós a sobreviver no ambiente urbano.

Desafio

Dada uma frase em inglês como entrada, crie um programa ou uma função que determine se o resultado da sentença é positivo ou negativo.

A sentença conterá 0a 2palavras negativas. Como qualquer programador sabe, um duplo negativo resulta em positivo. Portanto, seu código deve gerar ou retornar um valor truthy / falsey de acordo com a seguinte regra:

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

A lista de palavras negativas:

  • no, not,none
  • Qualquer coisa que termina em n't
  • never, neither,nor
  • nobody, nothing,nowhere

Há um caso extremo. Sempre que uma frase começa No,, essa palavra não é tratada como uma palavra negativa ao determinar o resultado (ela conta para o número de palavras negativas, para que possa haver apenas mais uma).

A frase seguirá as regras gramaticais básicas (letras maiúsculas, pontuação) e conterá apenas palavras que podem ser encontradas em um dicionário (felizmente, isso não invalida o título da pergunta). A frase não conterá nomes próprios (desculpe, Dr. Não, você saiu).

Casos de teste

Verdade:

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.

A ironia aqui, é claro, é que alguns deles devem ser interpretados de maneira diferente. Mas ei, você não pode culpar o orador por não estar em conformidade com a nossa lógica.

Regras

As brechas padrão são proibidas. Isso é , então seja conciso!

Antti29
fonte
1
Ninguém nunca esteve em lugar nenhum nem em nada.
Magic Octopus Urn
1
@MagicOctopusUrn: Você pode perder a beenpena por uma sentença 100% negativa!
Antti29

Respostas:

10

Retina , 63 bytes

No,

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

Experimente online!

Explicação

No,

Retire No,da entrada. Devido às regras de capitalização, isso só pode aparecer no início da entrada, portanto, não precisamos de um explícito ^.

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

Conte o número de correspondências da regex que não diferencia maiúsculas de minúsculas após o `. Apenas combina todas as palavras relevantes, onde extraí prefixos / sufixos comuns com as alternativas.

0|2

Count 0ou 2s, então transformamos contagens 1pares e ímpares em 0.

Martin Ender
fonte
você faz a extração comum de letras manualmente ou usa um programa que encontra a solução ideal para você?
Jonah
@ Jonah eu fiz isso à mão. Existem ferramentas para o metagolf automatizado de regex, mas elas geralmente usam duas listas, uma para corresponder e outra para falhar, e geram uma regex para isso. Não conheço nenhuma ferramenta que gere um regex ideal para corresponder a um conjunto específico de substrings em uma string maior.
Martin Ender
3
poderia fazer um desafio interessante ...
Jonah
Você deve assumir que n'tisso não é necessário \b, pois as palavras precisam vir de um dicionário. Além disso, eu tinha a mesma coisa, mas não tinha a carne da resposta de forma concisa, usando mais alguns bytes.
mbomb007
8

Bash, 115 107 99 98 97 95 85 bytes

Usa os pacotes Utilitários Principais (para wc) e grep. Suponha que a sentença seja dada via Entrada padrão. A expansão do histórico está desativada por set +o histexpand.

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

Verifique o resultado: no Bash 0 é verdadeiro, 1 é falso

Como funciona?

((                       )) # 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 a 99) guardados por inspiração de Qwertiy 'resposta s e Martin Enders ' resposta s . 1 byte graças a Nahuel Fouilleul .

iBug
fonte
regex não está correto: combinações noone nãoThat's a no, I'm afraid.
Nahuel Fouilleul 21/11
@NahuelFouilleul Fixed.
iBug
para verificar: tio , porém, não poderia colar testes, porque comentário comprimento limite
Nahuel FOUILLEUL
isso dá resultados certos((~$(grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er)\b|.*n't\b"|wc -l)%2))
Nahuel FOUILLEUL
citações para trás em vez de $(..)salvar 1 byte
Nahuel FOUILLEUL
5

Javascript ES6, 89 87 86 caracteres

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

Teste:

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
fonte
2

Perl 5 , 74 bytes

Código de 73 bytes + 1 para -p.

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

Experimente online!

Dom Hastings
fonte