Hiç değil! …yoksa öyle mi?


24

Giriş

Sokak konuşmasının, özellikle de caddede çok fazla bilinmeyen programcıların anlaşılması gerçekten zor olabilir.

Kentsel ortamda hayatta kalmamıza yardımcı olacak bir tercüman oluşturmak sizin işinizdir.

Meydan okuma

Giriş olarak İngilizce cümle verildiğinde, cümlenin sonucunun olumlu veya olumsuz olduğunu belirleyen bir program veya işlev oluşturun.

Cümle içerecek 0kadar 2olumsuz kelime. Herhangi bir programcının bildiği gibi, çift negatif bir pozitif sonuçlanır. Bu nedenle, kodunuz aşağıdaki kurala göre bir truthy / falsey değeri vermeli veya vermelidir :

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

Olumsuz kelimelerin listesi:

  • no, not,none
  • Her şey biten n't
  • never, neither,nor
  • nobody, nothing,nowhere

Bir kenar davası var. Bir cümle ne zaman başlasa No,, sonuç belirlenirken bu kelime negatif bir kelime olarak kabul edilmez (negatif kelimelerin sayısına göre sayılır, bu yüzden sadece bir tane daha olabilir).

Cümle temel gramer kurallarını (büyük harf, noktalama işaretleri) izler ve yalnızca bir sözlükten bulunabilecek sözcükler içerecektir (neyse ki, bu soru başlığını geçersiz kılmaz). Cümle herhangi bir özel isim içermez (üzgünüm, Dr.

Test durumları

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.

Buradaki ironi, elbette, bunlardan bazılarının farklı şekilde yorumlanması gerektiğidir . Ancak, konuşmacıya mantığımıza uymadığı için hata yapamazsınız.

kurallar

Standart boşluklar yasaktır. Bu , bu yüzden özlü olun!


1
Kimse hiçbir zaman hiçbir yerde, hiçbir zaman olmamıştır.
Magic Octopus Urn

1
@ MagicOctopusUrn: been% 100 olumsuz bir cümle için kaybedebilirsiniz !
Antti29

Yanıtlar:


10

Retina , 63 bayt

No,

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

Çevrimiçi deneyin!

açıklama

No,

Girişden çıkarın No,. Büyük harf kullanımı kuralları nedeniyle, bu yalnızca girdilerin başında görünebilir, bu nedenle açık bir şekilde ihtiyacımız yoktur ^.

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

'Den sonraki büyük-küçük harf duyarlı regex'in eşleşme sayısını sayın `. Sadece alternatiflerle ortak önekleri / sonekleri çıkardığım ilgili tüm kelimeleri eşleştirir.

0|2

Say 0veya 2s, böylece sayıları bile çeviririz 1ve tek sayıları çeviririz 0.


Ortak mektup çekimlerini elle mi yapıyorsun, yoksa sana en uygun çözümü bulan bir program mı kullanıyorsun?
Jonah

@ Jonah Bunu el ile yaptım. Otomatik regex metagolfu için araçlar vardır, ancak bunlar genellikle biri eşleşecek biri başarısız olan ve bunun için bir regex oluşturan iki liste alır. Belirli bir alt dizgiyi daha büyük bir dizgide eşleştirmek için optimal bir regex üreten herhangi bir aracın farkında değilim.
Martin Ender

3
ilginç bir meydan okuma yapabilir ...
Jonah

Kelimelerin bir sözlükten gelmesi n'tgerektiğinden, \bbundan sonra gerekmediğini varsaymanız gerekir . Ayrıca, ben de aynı şeyi yaptım, ancak cevabın etini bir kaç tane daha bayt kullanarak tam olarak görmedim.
mbomb007

8

Bash, 115 107 99 98 97 95 85 bayt

Paketleri Core Utilities (for wc) ve kullanır grep. Cümlenin Standart Girdi ile verildiğini varsayalım. Geçmiş genişlemesi tarafından devre dışı bırakıldı set +o histexpand.

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

Sonucu kontrol edin: Bash 0'da doğru, 1 yanlış

O nasıl çalışır?

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

İlham tarafından kaydedilen 18 bayt (115 99) Qwertiy 'ın cevabı ve Martin Ender ' in cevabı . Nahuel Fouilleul sayesinde 1 bayt .


regex doğru değil: maçlar noonve değilThat's a no, I'm afraid.
Nahuel Fouilleul

@NahuelFouilleul Sabit.
iBug

kontrol etmek için: ancak tio testleri yapıştıramadı çünkü yorum uzunluğu sınırı
Nahuel Fouilleul

bu doğru sonuçlar verir((~$(grep -Pio "(?!^no,)\b(no(|t|r|ne|body|thing|where)|ne(v|ith)er)\b|.*n't\b"|wc -l)%2))
Nahuel Fouilleul

geri $(..)1 bayt yerine tırnak
Nahuel Fouilleul

5

Javascript ES6, 89 87 86 karakterler

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

Ölçek:

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.