Tidak, tidak! …atau itu?

24

pengantar

Jalanan bicara bisa sangat sulit untuk dipahami, terutama untuk programmer, yang tidak dikenal sangat jalanan.

Adalah tugas Anda untuk menciptakan seorang juru bahasa untuk membantu kita semua bertahan di lingkungan perkotaan.

Tantangan

Diberikan kalimat bahasa Inggris sebagai input, buat program atau fungsi yang menentukan apakah hasil dari kalimat itu positif atau negatif.

Kalimat itu akan berisi 0untuk 2kata-kata negatif. Seperti yang diketahui oleh setiap programmer, hasil negatif ganda menjadi positif. Oleh karena itu, kode Anda harus menampilkan atau mengembalikan nilai kebenaran / kesalahan menurut aturan berikut:

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

Daftar kata-kata negatif:

  • no, not,none
  • Apa pun yang berakhir dengan n't
  • never, neither,nor
  • nobody, nothing,nowhere

Ada satu ujung case. Setiap kali kalimat dimulai No,, kata itu tidak diperlakukan sebagai kata negatif ketika menentukan hasil (itu dihitung terhadap jumlah kata negatif sehingga hanya ada satu lagi).

Kalimat tersebut akan mengikuti aturan tata bahasa dasar (huruf besar, tanda baca) dan hanya akan berisi kata-kata yang dapat ditemukan dari kamus (untungnya, ini tidak membatalkan judul pertanyaan). Kalimat itu tidak akan mengandung kata benda yang tepat (maaf, Dr. Tidak, Anda keluar).

Uji kasus

Benar:

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 di sini, tentu saja, adalah bahwa beberapa di antaranya harus ditafsirkan secara berbeda. Tapi hei, Anda tidak bisa menyalahkan pembicara karena tidak sesuai dengan logika kami.

Aturan

Celah standar dilarang. Ini , jadi singkat!

Antti29
sumber
1
Tidak ada yang tidak pernah ke mana-mana atau pun tidak sama sekali.
Magic Gurita Guci
1
@MagicOctopusUrn: Anda bisa kehilangan beenuntuk kalimat negatif 100%!
Antti29

Jawaban:

10

Retina , 63 byte

No,

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

Cobalah online!

Penjelasan

No,

Hapus No,dari input. Karena aturan kapitalisasi, ini hanya dapat muncul di awal input, jadi kami tidak perlu eksplisit ^.

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

Hitung jumlah kecocokan dari regex case-insensitive setelah `. Itu hanya cocok dengan semua kata yang relevan, di mana saya telah mengekstrak awalan / sufiks umum dengan alternatifnya.

0|2

Hitung 0atau 2s, jadi kami mengubah hitung genap menjadi 1dan menghitung ganjil 0.

Martin Ender
sumber
apakah Anda melakukan ekstraksi surat biasa dengan tangan atau menggunakan program yang menemukan solusi optimal untuk Anda?
Jonah
@ Jonah saya melakukannya dengan tangan. Ada alat untuk metagolf regex otomatis, tetapi mereka biasanya mengambil dua daftar, satu untuk dicocokkan dan satu gagal, dan menghasilkan regex untuk itu. Saya tidak mengetahui adanya alat yang menghasilkan regex optimal untuk mencocokkan satu set substring tertentu dalam string yang lebih besar.
Martin Ender
3
bisa membuat tantangan yang menarik ...
Jonah
Anda harus bisa berasumsi bahwa n'ttidak perlu \bsetelah itu, karena kata-kata harus berasal dari kamus. Juga, saya memiliki hal yang sama, tetapi saya tidak memiliki daging jawabannya secara ringkas, menggunakan beberapa byte lagi.
mbomb007
8

Bash, 115 107 99 98 97 95 85 byte

Menggunakan paket - paket Utilitas Inti (untuk wc) dan grep. Asumsikan kalimat diberikan melalui Input Standar. Perluasan riwayat dinonaktifkan oleh set +o histexpand.

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

Periksa hasilnya: Dalam Bash 0 adalah benar, 1 adalah untuk salah

Bagaimana cara kerjanya?

((                       )) # 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) diselamatkan oleh inspirasi dari Qwertiy 'jawaban s dan Martin Ender ' jawaban s . 1 byte terima kasih kepada Nahuel Fouilleul .

iBug
sumber
regex tidak benar: cocok noondan tidakThat's a no, I'm afraid.
Nahuel Fouilleul
@NahuelFouilleul Diperbaiki.
iBug
untuk memeriksa: tio namun tidak dapat menempelkan tes karena batas panjang komentar
Nahuel Fouilleul
ini memberikan hasil yang tepat((~$(grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er)\b|.*n't\b"|wc -l)%2))
Nahuel Fouilleul
kutipan kembali alih-alih $(..)menghemat 1 byte
Nahuel Fouilleul
5

Javascript ES6, 89 87 86 karakter

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

Uji:

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

Perl 5 , 74 byte

73 byte kode +1 untuk -p.

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

Cobalah online!

Dom Hastings
sumber