Hayvanat bahçesindeki sahtekârlar


42

Yeni bir hayvanat bahçesi açmak istiyorsun. Muhteşem olacak. Ancak, sizin aldattığınız kopya olarak, sadece üç harfli hayvanlara para vermek istiyorsunuz (herkes bir hayvanın maliyetinin isminin uzunluğu ile orantılı olduğunu bilir). İnsanların görmek için para kazanma hayalini kestik elephant. Ama birdenbire harika bir fikrin var. Eğer hayvanları tam olarak kalemin içine doğru yerleştirirseniz, a elephant! ' Nın optik illüzyonunu yaratabilirsiniz . Yeni "fil bileşiğinin" yukarıdan aşağıya görünümü:

elk
  eel
   pig
    hog
     ant

--------  (fence)
    ^
    | viewing direction

Haha, bu saf ziyaretçiler!

Evet, algı böyle işler.

Meydan okuma

Yalnızca küçük harflerden oluşan İngilizce harflerden oluşan boş olmayan bir kelime göz önüne alındığında, aşağıdaki 30 üç harflik hayvan sözcüğünün üst üste binmesinden oluşup oluşmayacağını belirleyin:

ant ape asp ass bat bee boa cat cod cow 
dab dog eel elk emu fly fox gnu hog ide 
jay kea kob koi olm owl pig rat ray yak

Evet, 30'dan fazla var, ama bu iyi bir tur numarası.

İsteğe bağlı olarak bu listeyi girdi olarak alabilirsiniz (önceden işlenmediği sürece herhangi bir makul listede veya dize biçiminde). Muhtemelen okuma ve bu giriş listeyi kontrol olmadıkça, bunu yapmak isteyeceksiniz çok daha pahalı hardcoding ve seçtiğiniz dilde sıkıştırarak daha. Listeyi girdi olarak kabul etseniz bile, listenin her zaman tam olarak bu liste olacağını varsayabilir, bu nedenle kodunuz geçen listeye 30 öğe uzunluğunda ve bir kelime içermeyen güveniyorsa, zsorun değil.

Her kelime birden çok kez kullanılabilir. Hayvanlar uçlarda kesilemez, sadece kısmen diğer hayvanlar tarafından gizlenirler. Öyle oxolsa bile, mümkün bir dize değil fox.

Eğer bu mümkün ise çıktı truthy , aksi takdirde sahte olabilir .

STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı yoluyla giriş alarak ve sonucu STDOUT (veya en yakın alternatif), fonksiyon dönüş değeri veya function (out) parametresi ile çıktı alarak bir program veya işlev yazabilirsiniz.

Kodunuz birkaç saniye içinde test durumlarından herhangi birini işlemelidir.

Standart kuralları geçerlidir.

Daha fazla örnek

  • Herhangi bir veya iki harfli bir kelime açıkça sahtedir.
  • Yani yukarıdaki listede olmayan herhangi bir üç harfli bir kelimedir.
  • Her ne kadar sadece iki harfini görecek şekilde düzenlemenin bir yolu olmadığından , gnuve aldatmaca olmasına rağmen (hayvanları üçe ayırmak istemiyoruz).ratgnat

Bazı truthy örnekleri:

pigment

    ant
  bee
 olm
pig
antioxidant

   fox
 koi  ide
ant     ant

Test Kılıfları

Test vakalarının çoğu, bir sözlüğe karşı referans uygulaması yürütmekten alınmıştır. Son birkaç "kelime" rasgele üretildi ve gönderimlerin yeterince verimli olmasını sağlamak için oradalar.

Doğru:

ant
owl
bass
pride
bobcat
peafowl
elephant
hedgehogs
crocodile
antidemocrat
aspidoganoidei
biodegradability
angioelephantiasis
propreantepenultimate
acategnukeaidabeleenaspcodcoidyakwakoasshogattkjaypigkobolcodidaskearaywelkwboaxbeeuflapaspoapemaassaaspeewoglmabiemuwjadogacagnuepigjaycownbatjaemuifoxkeaeekekeagratsseeluejdoghogaolmgpigbeaeelemulasphogjaydabemukgnunueifoasdoglrayyadogpewlayroassasslgnuaspyyakkbokeaodxilopgnuasppigkobelratelkolmakob
koigdgaspslycoyakehrdabowbatdkkeapogkobelrowlyarpidepetlfoxeboaiderbeefoxbgnuapeocowgiecowlkoieeltbategspemuideatdogbeeecatgeaoccattbbeassgnasolkeaflyelkaognubeeabrratoccolmobodoglyelraywelkoxantowleedrayflypeappigogatraoyakccpiganaaspkobabjaspkointantybjbeeanolmuijaylratojaynueidflyjarayabatmmpigtfly
eolmantjkobeeaorayogaowldfoxayeassapibatmflylyraelaspsseolmbelkkaoantlmufodasgnueantaidenthyakcodoxuepigodggnuantatlcatnuuelkpemucbapeeoiahdogplkowletbatdrayarayoaelkgrayodcatgkantewkobeljaybeeyfkobtbdabadoghbatfoxtflygaspdeidogtowlkeaolmyraelfleelejayehogowlccatoxeabiemkobpigolmdkobrcidekyakabboyidep

Falsy:

a
ox
ram
bear
koala
antelope
albatross
zookeeper
salamander
caterpillar
hippopotamus
koigdgaspslycoyakehrdabowbatdkkeapogkobelrowlyarpidepetlfoxeboaiderbeefoxbgnuapeocowgiecowlkoieeltbategspemuideatdogbeezcatgeaoccattbbeassgnasolkeaflyelkaognubeeabrratoccolmobodoglyelraywelkoxantowleedrayflypeappigogatraoyakccpiganaaspkobabjaspkointantybjbeeanolmuijaylratojaynueidflyjarayabatmmpigtfly
koigdgaspslycoyakehrdabowbatdkkeapogkobelrowlyarpidepetlfoxeboaiderbeefoxbgnuapeocowgiecowlkoieeltbategspemuideatdogbeeecatgeaoccattbbeassgnasolkeaflxelkaognubeeabrratoccolmobodoglyelraywelkoxantowleedrayflypeappigogatraoyakccpiganaaspkobabjaspkointantybjbeeanolmuijaylratojaynueidflyjarayabatmmpigtfly
beyeodpgspeclxlkbkaylldnceepkocbdmymsaogsowpbawbauaioluaaagaetdoaoialeoxaagspoelegflpylptylnolnatrjabaorkdteeydloiebbptatdtfdfgoodtbkoafmounbduaffcrfelcnawmxaskgaoenaattbaobgbgabnhkesbgaaaaotafkiiieatworginaeowaehuddegooaalowaoososaksahoimkulbtoadyyelkcmkacbuostadppcuglbnmotedfgfkoleldonknemomnmoutykg

Hala daha iyi bir isim için önerilerde bulunuyorum ...
Martin Ender

You may optionally receive this list as input- Bu, puanlamada sayılmadığı anlamına mı geliyor?
marinus,

@marinus Evet. Bu nedenle , eğer giriş üzerine birden fazla string okumak , seçtiğiniz dilde çok hantal olmadıkça, muhtemelen ek giriş olarak almak isteyeceksiniz . (Hardcoding + 'a izin vermek istemiyorum, "yaparsanız puanınızdan çıkartın", çünkü o zaman insanların kodlamasını yapıp sıkıştıracaksınız, bu da aslında skorlarına bir bonus verecek.)
Martin Ender

" Function (out) parametresi " referans olarak parametreler içeriyor mu?
mınxomaτ

5
Sanal alandaki "yuvarlak sayı" yorumunu kaçırdığıma inanamıyorum. Yazıklar olsun efendim! Bu kısımların etrafındaki 32, yuvarlak olmayan bir sayıdır, 30'dur. (Ve tamamen erkek hayvanlar için isimler bıraktığınızı denemeyiniz - bkz. Domuz).
Peter Taylor

Yanıtlar:


7

Japt, 51 48 45 36 33 19 bayt

@PeterTaylor sayesinde 9 bayt kurtardı

;!UeVrE"[$& ]" S² x

Çevrimiçi test edin!

Test edilecek dize olarak girdiyi ve ardından ayrılmış üç harfli kelimelerin listesini alır |. Not: bu tercümanın en son sürümünde çalışmaz, bu yüzden lütfen kodu kopyalamak için bağlantıyı kullanın.

Nasıl çalışır

Temel fikir, giriş dizgisini almak ve 30 sözcükten herhangi birini art arda iki dolgu karakteriyle değiştirmek. Doldurma karakteri olarak boşluk kullanıyorum. Ayrıca, değiştirmek istediğiniz antde elephant, a  in ela   ,  ntiçinde e   ntne yapmak istiyoruz bu kombinasyonlardan herhangi eşleşen bir regex 30 kelimelik dize değiştirmektir So vb:

ant|ape|asp|...
Becomes:
[a ][n ][t ]|[a ][p ][e ]|[a ][s ][p ]|...

Bunu oldukça kolay bir şekilde yapabiliriz:

;VrE"[$& ]"
          // Implicit: V = "ant|ape|asp|..."
;         // Set the vars A-J to various values. E is set to "[a-z]".
VrE       // Take V and replace each lowercase letter with:
"[$& ]"   //  "[" + the char + " ]".

Bununla birlikte, bunun sonucu üzerinde hiçbir etkisi olmayan ve dolayısıyla özyinelemeli değişime son veren üç boşluğu da eşleştirmenin istenmeyen bir etkisi vardır. Bu durumu, üç yerine iki boşlukla değiştirerek çözebiliriz:

Ue    S²  // Take U, and recursively replace matches of the regex with " ".repeat(2).

İşte bunun nasıl ve neden işe yaradığına .dair bir örnek (boşluk yerine kullanarak ):

First match at the end: 
eleant
ele..   (ant)
el..    (eel)
...     (elk)
..      (...)
true

First match at the beginning: 
antmua
..mua   (ant)
...a    (emu)
..a     (...)
..      (boa)
true

First match in the middle: 
cantay
c..ay   (ant)
..ay    (cat)
...     (jay)
..      (...)
true

Truthy test durumları için, bu bizi tüm boşluklardan oluşan bir dizi ile bırakır. Sahte testler için, karışımda bazı mektuplarımız kaldı. Bu, şöyle doğru / yanlış olarak çevrilebilir:

     x   // Trim all spaces off the ends of the resulting string.
!        // Take the logical NOT of the result.
         // Empty string -> true; non-empty string -> false.

Ve bu konuda! Bu yöntemin bir bonusu, en büyük test durumlarının bile 5 milisaniyeden daha az bir sürede bitmesidir. ( Burada test edilmiştir )


" Bu sadece regex ile kolay bir şey değil " - yanlış olan ne (?!,,,)?
Peter Taylor,

@PeterTaylor facepalm Teşekkürler, bu 10 bayt kazandırır ...
ETHproductions

1
@PeterTaylor Çok daha kısa bir yöntem buldum: basitçe üç yerine iki boşlukla değiştirin. 19 bayta kadar!
ETHProductions

O zaman başka bir yüz maskesi anı?
Neil

@Neil Yep, hemen hemen. Üç yerine iki boşluk kullanmayı düşünürdüm ama bu sabaha kadar birçok alternatif stratejiyi düşünürken bu kadar iyi çalışacağının farkında değildim.
ETHProductions

3

GNU grep, 62 + 1 = 63 bayt

^(((.+)(?=.*!\3))*(...)(?=.*\4!)((.+)(?=.*\6!))*([^qvz]\B)?)+ 

Bu Pseçeneği gerektirir . Girişin sentezlenecek hayvan olması ve ardından boşluk bırakması ve ardından ünlem işaretleri ile açılmış, kapanmış ve sınırlandırılmış 3 harfli hayvanların listesi beklenmektedir. Örnek kullanım (program olarak kaydedildiği varsayılarak zoo):

> grep -Pf zoo
hippopotamus !ant!ape!asp!ass!bat!bee!boa!cat!cod!cow!dab!dog!eel!elk!emu!fly!fox!gnu!hog!ide!jay!kea!kob!koi!olm!owl!pig!rat!ray!yak!

Gerçek bir giriş için, giriş satırı geri eklenir. Sahte bir giriş için çıkış yok.

Martin'e bir hata saptadığı ve beni \Bsınır dışı kelimesi için uyardığı için teşekkürler .


Grep'in kelime dışı sınırları yok mu \Byani son bakıştan kurtulabilirsiniz? (Olmazsa, Retina'ya geçmek bir kaç bayt kurtarır. Aslında bir bayt kurtaracağını düşünüyorum, çünkü Pseçeneğe ihtiyacı yok .)
Martin Ender

Şu anda grep ile test edemiyorum, ancak bu gerçekten büyük sahte test durumlarını birkaç saniye içinde ele alıyor mu? Retina'da geri izleme oldukça zaman alıyor.
Martin Ender

1
@ MartinBüttner Son iki sahte dava için, aslında vazgeçti ve basıldı grep: exceeded PCRE's backtracking limit.
Feersum

1
Bunu çözmek için GNU’yu kullanmak oldukça uygun görünüyor.
Antti29

2

ES6, 122 121 119 104 bayt

Bunu ETHproduction'ın cevabına kadar nasıl yapabileceğimi araştırdım ama ,,,* problemi nasıl çözeceğimi düşünemedim , bu yüzden doğal olarak Peter Taylor'ın yorumunu açıkça anladım. Sonra ETHproductions 15 byte tasarruf sağlayan problemi çözmenin daha iyi bir yolunu bulmayı başardı.

Giriş, hedef kelime ve bir hayvan kelimesi dizisidir.

(s,a)=>[...s].map(_=>s=s.replace(RegExp(a.map(a=>a.replace(/./g,"[&$&]")).join`|`),'&&'))&&!/\w/.test(s)

Düzenleme: @ETHproductions sayesinde 1 bayt 3 bayt kaydedildi.

* Kullandığım hariç, çünkü içinde güzel görünüyor replace.


Çok hoş! Bunlardan herhangi biri işe yarar mı: 1) (`(?!&&&)(${a.map...})`)dizi olarak kullanmak , 2) bunu yaptıktan sonra parantezleri kaldırmak, 3) kullanmak eval`/(?!&&&).../` ?
ETHProductions

@ETProductions Çalışmıyor dış dış kaldırılması hata yaptım (); ile ()çalışır ve bana bir bayt kaydeder. evalAyrıca ()s'ye ihtiyacı var, bu yüzden daha fazla bir şey kaydetmiyor, üzgünüm.
Neil

Ayrıca etrafınızda fazladan bir parantez olduğunu düşünüyorum a.replace(...).
ETHProductions

Bir demet kaydedebilirsiniz: s=s.replace(RegExp(a.map(a=>a.replace(/./g,"[&$&]")).join`|`),'&&')Üç yerine iki karakterle değiştirmek, aynı üç karakterin yerine defalarca takılıp sıkışma olasılığını ortadan kaldırır.
ETHProductions

0

JS ES6, 77 bayt

s=>/^(((.+)(?=.*!\3))*(...)(?=.*\4!)((.+)(?=.*\6!))*([^qvz][^\b])?)+/.test(s)

(bu isimsiz fn)

Giriş yukarıdaki grep örneği girişiyle aynıdır


Eğer giriş prompt()alıyorsanız kullanarak çıkış yapmamalısınız alert()? (Alternatif olarak bunu sadece bir işlev haline getirin.)
Neil

@Neil teşekkürler, ben anon kullandım. fn
username.ak, 20
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.