与えられた文字列で始まるメサはいくつですか?


11

次の条件が当てはまる場合、文字列の空でないリストをメサと呼びましょう。

  1. リストされた各文字列は空ではなく、最初の文字列に出現する文字のみを使用します。
  2. 連続する各文字列は、前の文字列よりも正確に1文字長くなります。
  3. リスト内の文字列は、リスト内の他の文字列のサブシーケンスではありません。

「メサ」という用語は、次のような視覚化からのものです(xsはさまざまなキャラクターになります)。

    xx..x
    xx..xx
    xx..xxx
    .
    .
    .
    xx..xxx..x 

NB:有限数のメサだけが特定の文字列で始まることは数学的な事実です。サブシーケンスと サブストリングの違いに注意してください。たとえば、「anna」は「banana」のサブシーケンス(サブストリングではない)です。

チャレンジ:

  • 任意の空でない英数字入力文字列を受け取り、その文字列で始まるメサの数を出力する最短のプログラムを作成します。

入力(stdin):

  • 空ではない英数字文字列。

出力(stdout):

  • 入力文字列で始まるメサの数。

得点:

  • 勝者は、バイト数が最も少ないプログラムです。

メサの例

で始まるメサは1つだけaです。

a

で始まるメサは1つだけaaです。

aa

多くのメサは以下で始まりabます:

ab        ab        ab        ab        (and so on)
          baa       aaa       bbb
                    bbba      bbaa
                              baaaa
                              aaaaaa

メサの一意性はどのように決定されますか?例えば、私が持っている可能性がありab、bbbちょうど第二項に停止させることにより、メサとして。それは有効ですか?または、できる限り長く作らなければならないのですか?また、複数の可能な再配置がある場合ですnth(のような用語はbaa、aba、aab)彼らは(もちろん、彼らはすべてのルールに従うの提供)だけでなく、別のメサなど、すべてのカウントのですか?
— mellamokb

@mellamokb-何らかの方法で異なる場合、それらは異なるメサです。例えば、ab、ab/baa、ab/bbb、ab/bbb/bbaa、ab/bbb/bbaa/baaaa、ab/bbb/bbaa/baaaa/aaaaaa異なるメサです。
— 解像度

@mellamokb-他の良い質問があります。たとえば、指定された文字列で始まる最大長のメサの数、およびその最大長は何ですか。これらの質問の他のバージョンは、指定されたサイズのアルファベットを修正し(アルファベットサイズが入力になります)、指定されたアルファベットの文字のみを使用するすべてのメサ(条件#1なしで再定義)を考慮します-ここでも有限数しかありません。
— 解像度

回答:



2

ルビー、142文字

m=->l{[*l[0].chars].repeated_permutation(l[-1].size+1).reduce(1){|s,x|l.any?{|y|x*''=~/#{[*y.chars]*'.*'}/}?s:s+m[l+[x*'']]}}
p m[[gets.chop]]

このアルゴリズムは建設的です。つまり、入力文字列のすべての可能なメサを構築し、カウントします。それはプログラムを本当に、本当に遅くします-しかし、ちょっと、それはcodegolfです。

実行例:

> a
1
> aa
1
> ab
43

長さ3(例えばaab)の非自明なバイナリ文字列で始まるすべてのメサが実行可能な長さであることを望んでいましたが、私は確信していません-あなたのプログラムはその例で約1時間実行されていました。注意:3文字以上の異なる文字を含む入力には、実行可能な出力はありません。たとえば、で始まるメサの一部はabc、7000番目のアッカーマン数より大きい長さを持ちます。
— 解像度

C#で最適化されたバージョンを作成しましたが、300,000エントリを生成した後aab、最初の10個程度の用語はすべて同じでした。したがって、2文字を超える場合には実行できない可能性があると思います。少なくとも、いくつかのインテリジェンスとヒューリスティックな計算なしではありません。
— mellamokb
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.