Không có thang! …hoặc là nó?


24

Giới thiệu

Nói chuyện đường phố có thể thực sự khó hiểu, đặc biệt là đối với các lập trình viên, những người không được biết đến là rất thích đi đường.

Công việc của bạn là tạo ra một thông dịch viên để giúp tất cả chúng ta tồn tại trong môi trường đô thị.

Thử thách

Đưa ra một câu tiếng Anh làm đầu vào, tạo một chương trình hoặc một hàm xác định xem kết quả của câu là dương hay âm.

Câu sẽ chứa 0đến 2từ tiêu cực. Như bất kỳ lập trình viên nào cũng biết, kết quả âm tính gấp đôi theo chiều dương. Do đó, mã của bạn phải xuất hoặc trả về giá trị trung thực / falsey theo quy tắc sau:

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

Danh sách các từ phủ định:

  • no, not,none
  • Bất cứ điều gì kết thúc bằng n't
  • never, neither,nor
  • nobody, nothing,nowhere

Có một trường hợp cạnh. Bất cứ khi nào một câu bắt đầu No,, từ đó không được coi là một từ phủ định khi xác định kết quả (nó được tính vào số lượng từ phủ định để có thể chỉ còn một từ nữa).

Câu sẽ tuân theo các quy tắc ngữ pháp cơ bản (viết hoa, chấm câu) và sẽ chỉ chứa các từ có thể tìm thấy trong từ điển (may mắn thay, điều này không làm mất hiệu lực tiêu đề câu hỏi). Câu sẽ không chứa bất kỳ danh từ riêng nào (xin lỗi, Tiến sĩ Không, bạn đã ra ngoài).

Các trường hợp thử nghiệm

Sự thật:

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.

Điều trớ trêu ở đây, tất nhiên, là một số trong số này nên được giải thích khác nhau. Nhưng này, bạn không thể lỗi người nói vì đã không tuân thủ logic của chúng tôi.

Quy tắc

Sơ hở tiêu chuẩn bị cấm. Đây là , vì vậy hãy súc tích!


1
Không ai không bao giờ không phải là không có gì và không có gì.
Bạch tuộc ma thuật Urn

1
@MagicOctopusUrn: Bạn có thể mất beenmột câu phủ định 100%!
Antti29

Câu trả lời:


10

Võng mạc , 63 byte

No,

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

Hãy thử trực tuyến!

Giải trình

No,

Xóa No,khỏi đầu vào. Do quy tắc viết hoa, điều này chỉ có thể xuất hiện ở đầu đầu vào, vì vậy chúng tôi không cần một thông tin rõ ràng ^.

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

Đếm số lượng trận đấu của regex không phân biệt chữ hoa chữ thường sau `. Nó chỉ khớp với tất cả các từ có liên quan, trong đó tôi đã trích xuất các tiền tố / hậu tố phổ biến với các từ thay thế.

0|2

Đếm 0hoặc 2s, vì vậy chúng tôi biến số đếm chẵn thành 1và số lẻ thành 0.


Bạn có thực hiện trích xuất thư chung bằng tay hoặc sử dụng chương trình tìm giải pháp tối ưu cho bạn không?
Giô-na

@Jonah Tôi đã làm điều đó bằng tay. Có các công cụ cho metagolf regex tự động, nhưng chúng thường lấy hai danh sách, một để khớp và một để thất bại, và tạo ra một regex cho điều đó. Tôi không biết bất kỳ công cụ nào tạo ra một biểu thức chính quy tối ưu để khớp với một tập hợp các chuỗi con cụ thể trong một chuỗi lớn hơn.
Martin Ender

3
có thể thực hiện một thử thách thú vị ...
Jonah

Bạn sẽ có thể cho rằng n'tkhông cần \bsau nó, vì các từ phải xuất phát từ từ điển. Ngoài ra, tôi cũng có điều tương tự, nhưng tôi không có câu trả lời chính xác bằng cách sử dụng một vài byte nữa.
mbomb007

8

Bash, 115 107 99 98 97 95 85 byte

Sử dụng các gói Core Utility (cho wc) và grep. Giả sử câu được đưa ra thông qua Đầu vào tiêu chuẩn. Mở rộng lịch sử bị vô hiệu hóa bởi set +o histexpand.

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

Kiểm tra kết quả: Trong Bash 0 là đúng, 1 là sai

Làm thế nào nó hoạt động?

((                       )) # 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) cứu bởi cảm hứng từ Qwertiy câu trả lời củaMartin Ender 'câu trả lời s . 1 byte nhờ Nahuel Fouilleul .


regex là không chính xác: trận đấu noonvà khôngThat's a no, I'm afraid.
Nahuel Fouilleul

@NahuelFouilleul Đã sửa.
iBug

để kiểm tra: tio tuy nhiên không thể dán các xét nghiệm vì chiều dài bình luận giới hạn
Nahuel Fouilleul

điều này cho kết quả đúng((~$(grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er)\b|.*n't\b"|wc -l)%2))
Nahuel Fouilleul

quay lại báo giá thay vì $(..)lưu 1 byte
Nahuel Fouilleul

5

Javascript ES6, 89 87 86 ký tự

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

Kiểm tra:

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


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.