ここでの考え方は、ほぼ繰り返しパターンを生成することです。つまり、いくつかのサブシーケンスの繰り返しを回避するために、構築されるシーケンスは最後の瞬間に変更されます。タイプ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
本当にタイプだと思います。これは、いくつかのソリューションを合理化するのに役立つ可能性があります。ABA
B
n
?誰かがヒューリスティックな準貪欲アルゴリズムを提供する場合、非常に長い期間問題が発生しないことをどのように確認しますか?一般的な問題は興味深いものであり、パターンの一部の長さを制限するパターン回避については何も見つかりませんでした。誰かが一般的なレシピを作成できる場合、私はそれが最良のアプローチであると期待しています。