チャレンジ
ようやくサンタが現在の金庫室に入る方法を見つけたので、エルフは何とかして彼の前にエルフが入り、プレゼントを盗んだことに気づきました!彼らはまだ金庫を離れる方法を理解していませんので、サンタはそれらすべてを捕まえようとしなければなりません。サンタとエルフはどちらも走り回るのに無限のエネルギーを持っていますが、残念ながらエルフはエネルギーの無限大を持っているので、どこにでもループで走ってしまうと、エルフは自由になります。
任意の2つのノード間に存在するn
ノードとe
エッジのグラフ、およびエルフとサンタの位置を考慮して、サンタが疲れる前に捕獲できるエルフの数を決定します。
追跡はターンベースです。各サイクルでは、最初にすべてのエルフが同時に移動し(互いに移動して同じノードに移動することもできます)、次にサンタが移動します。サンタがエルフと同じノードに移動した場合、サンタはそのエルフを捕らえました。各エルフは、1つのステップから1つのノードからその隣接ノードにのみ移動できます。最初は同じことがサンタにも当てはまりますが、サンタが捕まえたすべてのエルフに対して、サンタは1つの追加ステップを実行できます。したがって、サンタがエルフを捕まえた場合、サンタはノードからその隣の隣に移動できます。つまり、ノードに移動してから戻ることができます。ただし、この期間中、サンタはあまりにも速く走っているので、中間ステップで通過するエルフを捕まえません(したがって、彼がAにいる場合、AはBに接続され、BはCに接続され、エルフはオンになりますB、そしてサンタはA-> B-> Cに移動し、エルフはまだ捕まっていません)。ただし、サンタは一度にそれほど多くのステップを移動する必要はありません。彼は毎ターン最大1 +(捕獲されたエルフの数)まで移動します。
すべてのエルフは毎ターン移動する必要があり、エルフがサンタのノードに移動した場合、それらは捕まります。
すべてのエンティティ(エルフ、サンタ)は、最初は別個のノード上にあります。
仕様とルール
あなたのプログラムは理論的にはどんなサイズの入力でも動作するはずです。入力は、グラフ、エルフの位置、およびサンタの位置として与えられます。グラフは任意の適切な形式(ノードのリスト+エッジのリスト、エッジのリスト、隣接行列、サイクル表記など)で取得でき、グラフの入力形式(インデックスノードのリストなど)。出力は、サンタがキャッチできるエルフの最大数を示す単一の正の整数である必要があります。
テストケース
これらは、位置のエッジとノード番号のリストとして与えられます。
Input -> Output
[(0, 1), (1, 2)], [0, 2], 1 -> 2 # Easy win for Santa, the elves get themselves caught :P
[(0, 1), (1, 2), (2, 3), (3, 0)], [0, 1], 2 -> 2 # The elf opposite of Santa cannot escape but the other one can always just run away each turn, until Santa catches the first elf. Then he can easily just catch the rest.
[(0, 1), (1, 2), (2, 3), (3, 0)], [1], 0 -> 0 # Santa will never catch up
[(0, 1), (1, 2), (2, 3), (3, 0), (1, 4), (4, 5), ..., (10, 11), (11, 3)], [2, 6], 0 -> 2 # The first elf moves to either 1 or 3 and then gets caught. Then, Santa can use his 2-step move to catch up to the second elf no matter what.
サンタはエルフを1人も捕まえないか、すべてのエルフを捕まえることができると思うので、この課題は単に「エルフを捕まえることができるか」というヒントかもしれません
ルール
- 標準抜け穴が適用されます
- これはコードゴルフのチャレンジなので、バイト単位の最も短い答えが勝ちます
- 回答は受け付けられません
幸せなゴルフ!
注:このチャレンジシリーズは、Advent Of Codeからインスピレーションを得ました。このサイトとは関係ありません
1
です。2
ゼリー(/ ...)の回答を10バイト未満で投稿する。