バックグラウンド
インシデントは、トークンのリストが事前に決定されておらず、入力から推測されるという点で、かなり珍しいプログラミング言語です。そのため、インシデントプログラムのトークン化は、特に効率的に行う場合は特に困難です。このタスクは、それを自分で行うことです。
タスク
プログラムには入力として文字列が与えられます。インシデントがトークン化に使用するアルゴリズムは次のとおりです。
- 入力の部分文字列として発生するすべての文字列を正確に3つの方法で識別します(つまり、入力内にその文字列が正確に3回出現します)。
- 別のそのような文字列の部分文字列であり、これらのいずれかの文字列を破棄し(例えば、入力のために
ababab
、唯一の残りの文字列は次のようになりab
ません、a
またはb
ので、a
とb
の両方のサブストリングですab
)。 - 入力内で重複する文字列を破棄します。(たとえば、の
aaaa
3つのコピーが含まれていますaa
が、これらのコピーは2番目と3番目の文字で重複しているため、破棄されます。同様に、のabababa
3つのコピーab
と3つのコピーがba
ありますが、2番目から6番目の文字はそれぞれ重なりab
とba
、両方そうab
とba
)は廃棄されるであろう。 - この時点で残っている文字列は、プログラムで使用されるトークンです。元の入力をこれらのトークンのシーケンスにトークン化します(前のステップでの破棄のため、それを行う方法は1つしかありません)。トークンの一部ではない入力の文字はコメントとして扱われ、破棄されます。
プログラムは入力として文字列を受け取り、出力として文字列の対応するトークン化(それぞれが文字列として表されるトークンのリスト)を返す必要があります。さらに、これは少なくとも中程度の効率で実行する必要があります。具体的には、プログラムは2次時間( "O(n²)")以上で実行する必要があります。(ちなみに、2次よりも速くなることはほぼ確実に可能ですが、これは最高速のアルゴリズムではないため、複雑な範囲内に収まる最高のアルゴリズムを自由に使用してください。)
明確化
- 理論上、インシデントプログラムには256オクテットのいずれかを含めることができますが、このチャレンジの目的では、プログラムが印刷可能なASCII(スペースを含む)、および改行とタブから形成された入力のみを処理することは許容されます。(すべての既知のインシデントプログラムは、このサブセットに制限されています)。スペース/改行/タブは特別ではなく、トークンの途中に表示されることに注意してください。インシデントは256オクテットすべてを不透明として扱います。
- 「二次時間」の定義は、「入力のサイズが2倍になった場合、プログラムは定数に4倍を加えただけ遅くなります」、つまりt(x)がプログラムにかかる最大時間サイズxの入力を処理する場合、すべてのxに対してt(2 x)<4 t(x)+ kとなるような定数kが必要です。文字列の比較には、文字列の長さに比例した時間がかかることに注意してください。
- あなたのプログラムは理論的には無制限のメモリを持ち、無制限の整数を使用するあなたの言語の(おそらく仮定の)バリアントで実行される場合、任意の長さの入力プログラムを処理できるはずです言語の整数またはメモリは実際には有限の大きさです)。(複雑さを計算する目的で)入力の長さ以下の整数を一定時間で比較できると仮定することができます(たとえば、入力を単一の整数、彼らは持っている桁数に比例して比較するのに時間がかかります)。
- 上記のアルゴリズムと同じ手順に従わない場合でも、同じ結果が得られる限り、複雑性の範囲内に収まる任意のアルゴリズムを使用できます。
- このパズルは、実際に出力をフォーマットすることではなく、入力をトークン化することに関するものです。ご使用の言語でリストを出力する最も自然な方法があいまいな形式を含む場合(たとえば、文字列にリテラル改行が含まれる場合は改行で区切られ、文字列間に区切り文字がない場合)、出力があいまいになるという事実を心配しないでください(リストが実際に構築されている限り)。テストを支援するために、明確な出力を生成するサブミッションの2番目のバージョンを作成することもできますが、元のバージョンはスコアリングにカウントされるバージョンです。
テストケース
次の入力文字列の場合:
aaabcbcbcdefdfefedghijghighjkllkklmmmmonono-nonppqpq-pqprsrsrstststuvuvu
プログラムは次の出力リストを生成する必要があります。
a a a bc bc bc d e f d f e f e d gh gh gh k l l k k l pq pq pq u u u
勝利条件
これはcode-golfであるため、バイト単位で測定された最短の有効な(つまり、正しい入出力動作と実行に十分な高速)プログラムが勝ちます。