アドベントチャレンジ2:現在のVault Raid!


9

<<前 へ次へ>>

チャレンジ

ようやくサンタが現在の金庫室に入る方法を見つけたので、エルフは何とかして彼の前にエルフが入り、プレゼントを盗んだことに気づきました!彼らはまだ金庫を離れる方法を理解していませんので、サンタはそれらすべてを捕まえようとしなければなりません。サンタとエルフはどちらも走り回るのに無限のエネルギーを持っていますが、残念ながらエルフはエネルギーの無限大を持っているので、どこにでもループで走ってしまうと、エルフは自由になります。

任意の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
サンタのエルフがこれまでに邪悪だったことを知っていればいいのに...
Xcoder氏、17

これを解決するためのアプローチは、おそらく次のとおり1です。2ゼリー(/ ...)の回答を10バイト未満で投稿する。
user202729 2017

ええと、サンタがすべてのエルフではなく一部のエルフをキャッチできる可能性があります(一部のエルフがサンタの位置から始まる可能性があります。エルフがサンタに自発的にエルフをキャッチさせた可能性はありますか?)
user202729

編集:最初の質問にはありませんが、おそらく2番目の質問にはあります。
user202729 2017

3
@ user202729サンタは3スペース移動する必要がないことに注意してください。彼は1から3スペースのどこにでも移動できます。これが混乱の原因かもしれません。
HyperNeutrino 2017

回答:


1

Wolfram言語(Mathematica)、129バイト

Block[{a=#},Clear@f;s_~f~e_:=If[s==e,1,s~f~e=0;s~f~e=Min[(hMax[#~f~h&/@a@s,Boole[h==s]])/@a@e]];Tr[Max[(e#3~f~e)/@#2]^#2]]&

オンラインでお試しください!

この質問に対する私の回答への同様のアプローチ。

この関数は、3つの引数を入力として受け取ります。関連付けとして表された隣接リスト(エッジリストから隣接リストを生成するツール)、エルフの位置、サンタの位置。

Clear[f]機能の提出は再利用可能でなければならないので、必要です。

以下のコードは、部分的に説明されたゴルフではないコードです。詳細は後で説明します。

reverseBoole = # != 0 &

(* Or@@{a, b} === reverseBoole[booleOr[Boole[{a, b}]]] *)
booleOr = Max

booleAnd = Min

(* Boole@f[s, e] = Santa can catch Elf ? *)

mainfunc = Block[{adjlist = #},
  Clear[f];
  f[s_, e_] := If[ s == e, f[s, e] = 1,
    f[s, e] = Boole[False];
    f[s, e] = booleAnd[
      (e1  booleOr[
        ( s1  f[s1, e1] ) /@ adjlist[s],
        Boole[e1 == s]
      ]) /@ adjlist[e]
    ]
  ];
  If [ 0 == booleOr[ ( e  f[#3, e] ) /@ #2 ] , 0, Length[#2] ]
]&

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.