動物園での詐欺師


42

新しい動物園を開きたい。すごいでしょう。しかし、あなたは安っぽいスケートであるため、3文字の動物しか買えません(動物のコストがその名前の長さに比例することは誰もが知っています)。あなたの夢がありますelephant。しかし、突然あなたは素晴らしいアイデアを思いつきました。動物をペンに正しく配置するだけで、elephant!の錯視を作成できます。新しい「エレファントコンパウンド」のトップダウンビューを次に示します。

elk
  eel
   pig
    hog
     ant

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

ハハ、それらのだまされやすい訪問者!

はい、これが知覚の仕組みです。

挑戦

小文字の英字のみで構成される空ではない単語が与えられた場合、次の30文字の3文字の動物の単語の重複から形成できるかどうかを判断します。

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

はい、30以上ありますが、それは素晴らしいラウンド数です。

オプションとして、このリストを入力として受け取ることができます(前処理されていない限り、妥当なリストまたは文字列形式で)。この入力リストの読み取りと処理が、選択した言語でのハードコーディングと圧縮よりもはるかに高価でない限り、おそらくこれを行うことをお勧めします。リストを入力として受け取ったとしても、それが常にこのリストであると仮定する場合があるため、コードが渡されたリストの長さが30要素でz、を含む単語を含まない場合は、問題ありません。

各単語は複数回使用できます。動物は端で切断することはできず、他の動物によって部分的に隠されます。ですからox、可能な文字列ではありませんfox

出力があるべきtruthyこれが可能であるならば、そしてfalsyそう。

プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。

コードは、数秒でテストケースのいずれかを処理する必要があります。

標準の規則が適用されます。

その他の例

  • 1文字または2文字の単語は明らかに虚偽です。
  • 上記のリストにない3文字の単語も同様です。
  • 我々が持っているにもかかわらずgnuratgnat彼らは、そのようなあなただけのそれぞれの2文字が表示されることをアレンジする方法は(私たちは三分のに動物をカットする必要はありません)がないので、falsyです。

いくつかの真実の例:

pigment

    ant
  bee
 olm
pig
antioxidant

   fox
 koi  ide
ant     ant

テストケース

ほとんどのテストケースは、ディクショナリに対する参照実装の実行から取得されました。最後のいくつかの「単語」はランダムに生成され、提出物が十分に効率的であることを確認するためだけにあります。

真実:

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

偽物:

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

私はまだ...より良いタイトルのための提案を取っている
マーティン・エンダー

You may optionally receive this list as input-それはスコアにカウントされないことを意味しますが、ハードコーディングはスコアにカウントされますか?
マリナス

@marinusはい。したがって、選択した言語で入力で複数の文字列を読み取ることが本当に面倒でない限り、おそらく追加の入力として使用することをお勧めします。(ハードコーディングと「スコアから差し引く」を許可したくありません。それは、人々にハードコーディングと圧縮を行わせるためです。これにより、基本的にスコアにボーナスが与えられます。)
Martin Ender

関数(出力)パラメーター」には参照によるパラメーターが含まれますか?
mınxomaτ

5
サンドボックスの「ラウンド番号」コメントを見逃したとは信じられません。恥を知れ、先生!これらの部分の周りには、32ではなく30の丸い数字があります(そして、雄の動物の名前を省略したわけではありません-豚を参照)。
ピーターテイラー

回答:


7

Japt、51 48 45 36 33 19バイト

@PeterTaylorのおかげで9バイト節約

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

オンラインでテストしてください!

入力をテストする文字列として受け取り、その後にで区切られた3文字の単語のリストが続き|ます。注:これは最新バージョンのインタープリターでは機能しないため、コードをコピーして貼り付ける代わりにリンクを使用してください。

使い方

基本的な考え方は、入力文字列を取得し、その中の30個の単語のいずれかを2つのフィラー文字で繰り返し置換することです。フィラー文字としてスペースを使用します。また、antin elephanta  in ela    ntin e   ntなどを置き換えたいので、30ワードの文字列をこれらの組み合わせのいずれかに一致する正規表現に変更します。

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

これは非常に簡単に行えます。

;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 + " ]".

ただし、これには3つのスペースを一致させるという望ましくない効果があり、結果に影響を与えないため、再帰的な置換が終了します。これを回避するには、一致を3つではなく2つのスペースに置き換えます。

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

これがどのように、なぜ機能するかの基本的なデモンストレーションです(.スペースの代わりに使用):

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

真実のテストケースの場合、これによりすべてのスペースの文字列が残ります。偽のテストケースについては、ミックスにいくつかの文字が残っています。これは、次のようにtrue / falseに変換できます。

     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.

そしてそれはそれについてです!この方法の利点は、最大のテストケースでも5ミリ秒未満で終了することです。(ここでテスト済み


これは正規表現だけでは簡単なことではありません」-何が問題なの(?!,,,)ですか?
ピーターテイラー

@PeterTaylor 手のひらを顔に当てる 10バイト程度節約おかげで、...
ETHproductions

1
@PeterTaylorはるかに短い方法を見つけました:3つではなく2つのスペースに置き換えるだけです。19バイトまで!
ETHproductions

それから別のフェイスパームの瞬間?
ニール

@Neil Yep、ほとんど。3つではなく2つのスペースを試すことを考えていましたが、多くの代替戦略を考える今朝まで、それがそれほどうまくいくとは思いませんでした。
ETHproductions

3

GNU grep、62 + 1 = 63バイト

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

これにはPオプションが必要です。入力は、合成される動物であり、その後にスペースが続き、続いて感嘆符で区切られた3文字の動物のリストが開かれ、閉じられ、区切られます。使用例(プログラムがとして保存されていると仮定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!

真の入力の場合、入力行がエコーバックされます。誤った入力の場合、出力はありません。

バグを発見し、\B非境界の単語の存在を警告してくれたMartinに感謝します。


grepには非ワード境界が\Bないので、最後の先読みを取り除くことができますか?(そうでない場合、Retinaに切り替えると数バイト節約されます。実際、Pオプションを必要としないため、とにかく1バイト節約できると思います。)
マーティンエンダー

現在grepでテストすることはできませんが、これは実際には数秒で大きな偽のテストケースを処理しますか?Retinaでは、バックトラックにかなり時間がかかります。
マーティンエンダー

1
@MartinBüttner最後のいくつかの偽のケースでは、実際にgaveめて印刷されましたgrep: exceeded PCRE's backtracking limit
feersum

1
これを解決するためにGNU何かを使用することは非常に適切なようです。
Antti29

2

ES6、122の 121 119 104バイト

私はETHproductionの答えまでこれを行う方法を考え出しましたが、,,,問題を処理する方法を考えることができなかったので、Peter Taylorのコメントを見たとき、それはすべて明らかになりました。その後、ETHproductionsは15バイトを節約する問題を処理するより良い方法を見つけることができました。

入力は、ターゲットの単語と動物の単語の配列です。

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

編集:@ETHproductionsのおかげで1バイト 3バイトを保存しました。

* .sを使用した場合を除きreplaceます。


非常に素晴らしい!次のいずれかが機能しますか?1)(`(?!&&&)(${a.map...})`)文字列として使用する、2)それを行った後に括弧を削除する、3)使用するeval`/(?!&&&).../`
-ETHproductions

@ETHproductionsうまく()いかないアウターを削除するというミスを犯しました。で()、それが動作し、私のバイトを保存します。s evalも必要な()ので、これ以上保存することはありません。ごめんなさい。
ニール

あなたの周りに余分な括弧もあると思いますa.replace(...)
ETHproductions

束を保存できますs=s.replace(RegExp(a.map(a=>a.replace(/./g,"[&$&]")).join`|`),'&&')。3文字ではなく2文字で置き換えると、同じ3文字を何度も置き換えてスタックする可能性がなくなります。
ETHproductions

0

JS ES6、77バイト

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

(これは匿名のfnです)

入力は、上記のgrepの入力例と同じです


prompt()を使用して入力を行っている場合は、を使用して出力しないでくださいalert()?(あるいはこれを機能にするだけです。)
ニール

@ニールありがとう、私はアノンを使用しました。fn
username.ak
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.