ここでの考え方は、ほぼ繰り返しパターンを生成することです。つまり、いくつかのサブシーケンスの繰り返しを回避するために、構築されるシーケンスは最後の瞬間に変更されます。タイプAAおよびABAのサブシーケンスは避けてください(BはAより長くありません)。
例:
説明をわかりやすくするために、小さな例をすべてリストすることから始めます。0から始めましょう。
有効:0 無効:00(AAパターン) 有効:01 無効:010(ABAパターン) 無効:011(AAパターン) 有効:012 有効:0120 無効:0121(ABAパターン) 無効:0122(AAパターン) 無効:01200(AAパターン) 無効:01201(ABAパターン; 01-2-01) 無効:01202(ABAパターン) 有効:01203
今で4は、証明はありませんが、だけが必要な何百もの文字のシーケンスを簡単に見つけたので、a は必要ないことを強く信じています0123。(おそらく、AAパターンを持たない無限ストリングを作成するために必要なのは3文字だけであることに密接に関連しています。これにはWikipediaのページがあります。)
入出力
入力は、単一の正のゼロ以外の整数nです。あなたはそれを仮定するかもしれませんn <= 1000。
出力は、n禁止パターン(AAまたはABA)のいずれかに一致するサブシーケンスのない文字シーケンスです。
入力と出力の例
>>> 1 0 >>> 2 01 >>> 3 012 >>> 4 0120 >>> 5 01203 >>> 50 01203102130123103201302103120132102301203102132012
ルール
0123使用できるのは文字のみです。- BはAよりも長くありません。これは
012345、次の6理由で従う必要がある状況を回避するためです0123451:1-2345-1。言い換えると、シーケンスは簡単で興味をそそらないものになります。 nハードコーディング以外の任意の方法で入力できます。- 出力は、どちらが簡単かによって、リストまたは文字列のどちらかになります。
- 力ずくはありません。の実行時間は、非常に遅いマシンでは数分程度、せいぜい1時間程度にする必要があります
n=1000。(これは、のすべてのn長さの順列をループするだけのソリューションを不適格にすることを目的としている{0,1,2,3}ため、トリックや類似のトリックは許可されていません。) - 通常どおり、標準の抜け穴は許可されていません。
- スコアはバイト単位です。これはコードゴルフなので、最も短いエントリが勝ちます(おそらく-ボーナスを参照)。
- ボーナス:各ステップで許可される最小の桁を選択します。場合
1と3シーケンス内の次の桁のための可能な選択肢があり、選びます1。スコアから5バイトを引きます。ただし、以下のメモに注意してください。
注意!
行き止まりは可能です。プログラムまたは関数はこれらを回避する必要があります。次に例を示します。
切り株:0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123021032012310213012031023013203123021320123102130120 切り株:0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201302103123013203102130120321023013203123021032012310213012031023013203123021320123102130123 切り株:012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301320312302103201231021301203102301320312302132012310320 切り株:012031021301231032013021031201321023012031021320123021031201302310320123021320310230120321023120130210312301320310213012032102301320312302103201231021301203102301320312302132012310321301203102130
これらの各シーケンスは、(を使用せずに4)これ以上拡張することはできません。ただし、最初の2つと2つ目の2つの間には決定的な違いがあることにも注意してください。Xこれをより明確にするために、共有された初期サブシーケンスをに置き換えます。
切り株:X2130120 切り株:X2130123 切り株:X320 切り株:X321301203102130
の最後の2桁Xは10であるため、次の桁の可能な選択肢は2およびのみ3です。選択すると2、シーケンスを終了する必要がある状況が発生します。貪欲なアルゴリズムはここでは機能しません。(とにかく、バックトラックなしではありません。)
n私のプログラムが見つける切り株は毎回平均10桁長くなる傾向があることを考えると、無限のシーケンスが存在することは確かです。セミグリーディアルゴリズムを任意の大きなシーケンスに対してテストする方法がわかりません。要件をn= 1000に制限して、それ以上高くする必要はありませんn。
AA本当にタイプだと思います。これは、いくつかのソリューションを合理化するのに役立つ可能性があります。ABAB
n?誰かがヒューリスティックな準貪欲アルゴリズムを提供する場合、非常に長い期間問題が発生しないことをどのように確認しますか?一般的な問題は興味深いものであり、パターンの一部の長さを制限するパターン回避については何も見つかりませんでした。誰かが一般的なレシピを作成できる場合、私はそれが最良のアプローチであると期待しています。