ไม่มีทาง! …หรือเปล่า


24

บทนำ

การพูดคุยตามสตรีทอาจเป็นเรื่องยากที่จะเข้าใจโดยเฉพาะอย่างยิ่งโปรแกรมเมอร์ที่ไม่รู้ว่าเป็นสตรีทมาก

เป็นหน้าที่ของคุณในการสร้างล่ามเพื่อช่วยให้เราทุกคนอยู่รอดในสภาพแวดล้อมในเมือง

ท้าทาย

ให้ประโยคภาษาอังกฤษเป็นอินพุตให้สร้างโปรแกรมหรือฟังก์ชันที่พิจารณาว่าผลลัพธ์ของประโยคนั้นเป็นบวกหรือลบ

ประโยคที่จะมี0การ2คำเชิงลบ ดังที่โปรแกรมเมอร์คนใดรู้ดีว่าผลลัพธ์เชิงลบสองเท่าจะส่งผลในเชิงบวก ดังนั้นรหัสของคุณจะต้องส่งออกหรือส่งกลับค่าความจริง / เท็จตามกฎต่อไปนี้:

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

รายการคำศัพท์เชิงลบ:

  • no, not,none
  • สิ่งที่ลงท้ายด้วย n't
  • never, neither,nor
  • nobody, nothing,nowhere

มีเคสขอบหนึ่งอัน เมื่อใดก็ตามที่ประโยคเริ่มต้นด้วยNo,คำนั้นจะไม่ถือว่าเป็นคำเชิงลบเมื่อพิจารณาผลลัพธ์ (จะนับรวมกับจำนวนคำที่เป็นลบ

ประโยคจะเป็นไปตามกฎไวยากรณ์พื้นฐาน (ตัวพิมพ์ใหญ่, เครื่องหมายวรรคตอน) และจะมีเฉพาะคำที่สามารถพบได้ในพจนานุกรม (โชคดีที่สิ่งนี้ไม่ได้ทำให้ชื่อคำถามผิด) ประโยคจะไม่มีคำนามที่เหมาะสม (ขออภัยดร. ไม่คุณไม่อยู่)

กรณีทดสอบ

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.

แน่นอนประชดที่นี่คือบางสิ่งเหล่านี้ควรตีความแตกต่างกัน แต่เฮ้คุณไม่สามารถพูดผิดกับลำโพงไม่สอดคล้องกับตรรกะของเรา

กฎระเบียบ

ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม นี่คือดังนั้นโปรดรัดกุม!


1
ไม่มีใครไม่เคยไม่มีที่ไหนเลยหรือไม่มีอะไรเลย
Magic Octopus Urn

1
@MagicOctopusUrn: คุณสามารถแพ้beenประโยคลบได้ 100%!
Antti29

คำตอบ:


10

เรติน่า 63 ไบต์

No,

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

ลองออนไลน์!

คำอธิบาย

No,

ลบออกNo,จากอินพุต ^เนื่องจากกฎทุนนี้สามารถปรากฏที่จุดเริ่มต้นของการป้อนข้อมูลเพื่อให้เราไม่จำเป็นต้องชัดเจน

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

นับจำนวนของการแข่งขันของ regex `กรณีตายหลังจากที่ มันตรงกับคำที่เกี่ยวข้องทั้งหมดซึ่งฉันได้แยกคำนำหน้า / คำต่อท้ายทั่วไปกับทางเลือก

0|2

นับ0หรือ2s ดังนั้นเราจึงหันไปนับเข้าและจำนวนคี่เข้า10


คุณทำการแยกจดหมายทั่วไปด้วยมือหรือใช้โปรแกรมที่ค้นหาทางออกที่ดีที่สุดสำหรับคุณหรือไม่?
Jonah

@ โจนาห์ฉันทำอย่างนั้นด้วยมือ มีเครื่องมือสำหรับ metagolf regex อัตโนมัติ แต่พวกเขามักจะใช้สองรายการหนึ่งรายการเพื่อจับคู่และอีกรายการหนึ่งล้มเหลวและสร้าง regex สำหรับรายการนั้น ฉันไม่ได้ตระหนักถึงเครื่องมือใด ๆ ที่สร้าง regex ที่ดีที่สุดเพื่อให้ตรงกับชุดของ substrings ในสตริงที่ใหญ่ขึ้น
Martin Ender

3
สามารถสร้างความท้าทายที่น่าสนใจ ...
Jonah

คุณควรจะสามารถสันนิษฐานได้ว่าn'tไม่ต้องการ\bหลังจากนั้นเพราะคำต้องมาจากพจนานุกรม นอกจากนี้ฉันมีสิ่งเดียวกัน แต่ฉันไม่ได้เนื้อของคำตอบที่รัดกุมโดยใช้สองสามไบต์เพิ่มเติม
mbomb007

8

Bash, 115 107 99 98 97 95 85 ไบต์

แพคเกจการใช้งานหลักของยูทิลิตี้ (สำหรับwc) grepและ สมมติว่าประโยคได้รับผ่านอินพุตมาตรฐาน การขยายตัวของประวัติศาสตร์ถูกปิดใช้งานโดยset +o histexpand

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

ตรวจสอบผลลัพธ์: ใน Bash 0 มีค่าเป็นจริง, 1 มีค่าเป็นเท็จ

มันทำงานยังไง?

((                       )) # 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 ไบต์ (115-99) บันทึกไว้โดยแรงบันดาลใจจากQwertiy 's คำตอบและมาร์ตินเอนเดอร์คำตอบ' s 1 ไบต์ขอบคุณที่Nahuel Fouilleul


regex ไม่ถูกต้อง: จับคู่noonและไม่That's a no, I'm afraid.
Nahuel Fouilleul

@NahuelFouilleul แก้ไขแล้ว
iBug

เพื่อตรวจสอบ: tioแต่ไม่สามารถวางการทดสอบได้เนื่องจากข้อจำกัดความยาวของความคิดเห็น
Nahuel Fouilleul

สิ่งนี้ให้ผลลัพธ์ที่ถูกต้อง((~$(grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er)\b|.*n't\b"|wc -l)%2))
Nahuel Fouilleul

เครื่องหมายคำพูดย้อนกลับแทน$(..)บันทึก 1 ไบต์
Nahuel Fouilleul

5

Javascript ES6, 89 87 86 ตัวอักษร

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

ทดสอบ:

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.