地雷原の丁寧な近視の酔ったボット


11

タイトルが示すように、この問題は@NPのPolite Near-Sighted Drunk Botに半インスパイアされています

貧弱なボットは原点のデカルトグリッド上に配置され、1分ごとに4方向(上、下、左、右)のいずれかに1ユニット移動します。

n分後、グリッド上のすべての潜在的な地雷がアクティブになり、それらの上に自分自身を見つける可能性のある貧しいボットを殺します。鉱山は、式| y | = | x |を満たすすべての整数座標に配置されます。

チャレンジ

あなたは提供されますn個の入力として、地雷の爆発の前に、分の数を、出力として、あなたはボットである確率見つけなければならない死者を

入力nを表す自然数。

出力:ボットが死んでいる確率をp / qとします。ここで、pとqは比較的素数の整数です(qは0にはできませんが、pはできます)。出力p。

ルール

  • アルゴリズムを指数関数的またはそれ以上の時間で実行してはなりません。理想的には、多項式時間以下で実行する必要があります。
  • アルゴリズムnは、妥当な時間内に20未満の入力を処理できる必要があります(難しすぎる場合は調整可能)。
  • これは挑戦です。
  • 与えられたnのすべての可能性を反復することは、答えとして受け入れられることはほとんどありません。

テストケース

1->0

2->3

4->39

6->135

8->7735

10->28287

n = 6の計算例

U、D、R、およびLの4つの可能な移動があります。使用できるパスの合計数は4 ^ 6または4096です。線y = xに沿って着陸する4つの可能なケースがあります:x、y = ±1; x、y =±2; x、y =±3; またはx = y =0。最終的に(1,1)、(2,2)、および(3,3)になる方法の数をカウントし、それらに4を掛けて他の象限を考慮し、追加します。これは、最終的に(0,0)になる方法の数です。

ケース1:ボットは(3、3)で終了します。ボットがここで終了するためには、3回の正しい移動と3回の移動が必要です。言い換えると、ここに到達する方法の総数は、RRRUUUシーケンス内の文字を再配置する方法であり、6 = 3 = 20を選択します。

ケース2:ボットは(2,2)で終了します。ボットがここに到達するためには、上に2回、右に3回、左に1回移動する必要がありました。または、右に2回、上に3回、下に1回移動します。したがって、ここに到達する方法の総数は、シーケンスRRRLUUおよびUUUDRRの文字を再配置する方法の合計であり、両方とも(6から1を選択)*(5から2を選択)= 60、合計120の可能性。

ケース3:ボットは(1,1)で終了します。ボットがここに到達するためには、右に1回、上に3回、下に2回の移動が必要でした。この場合、RUUUDDシーケンス内の文字を再配置する方法の数は、(6から1を選択)*(5から2を選択)= 60です。

上に1回、右に3回、左に2回移動します。この場合、シーケンスURRRLLの文字を再配置する方法の数は、(6から1を選択)*(5から2を選択)= 60です。

右に2回、左に1回、上に2回、下に1回移動します。この場合、シーケンスUUDRRLの文字を再配置する方法の数は、(6から1を選択)*(5から1を選択)*(4から2を選択)= 180です。

したがって、最終的に(1,1)になるウェイの総数は300です。

ケース4:ボットは(0,0)で終了します。ボットがここに到達するためには、次のことが必要でした。

右に3回、左に3回移動します。この場合、RRRLLLシーケンスの文字を再配置する方法の数は(6を選択3)= 20です。

上に3回、下に3回移動します。この場合、UUUDDDシーケンスの文字を再配置する方法の数は(6を選択3)= 20です。

右に1回、左に1回、上に2回、下に2回移動します。この場合、シーケンスRLUUDDの文字を再配置する方法の数は、(6から1を選択)*(5から1を選択)*(4から2を選択)= 180です。

上に1回、下に1回、右に2回、左に2回移動します。この場合、シーケンスRRLLUDの文字を再配置する方法の数は、(6から1を選択)*(5から1を選択)*(4から2を選択)= 180です。

したがって、(0,0)で終わるウェイの総数は400です。

これらのケースを一緒に追加すると、最終的に| y |になる方法の総数がわかります。= | x | 4(20 + 120 + 300)+ 400 = 2160です。したがって、確率は2160/4096です。この割合が完全に減少すると、135 /256になるため、答えは135です。


私はこのチャレンジが好きですが、たとえば、非常に小さなテストケース(2または3)の1つに実際の例を含めることでメリットが得られると思います。
氏Xcoder

@ Mr.Xcoder時間があるときに追加します。
ドンサウザンド

2
興味深い挑戦。ルールで「理想的に」という言葉を使用すると、ルールではなくなることに注意してください。どちらか一方を明確に言うと便利です。
-trichoplax

1
しかし、第一世代学習アルゴリズムについて誰も話していないのですか?
Redwolfプログラム

1
@RedwolfPrograms AHAHAいやしかし、このボットは、クーラーの名を持っている
ドン・サウザンド・

回答:


17

Python 2、65バイト

def p(n):b=2**n;r=b*b-((~b)**n/b**(n/2)%-b)**2;print~n%2*r/(r&-r)

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

ボットが死んでいる確率は、次のように表現できます。

f(n)=2ss2, where s=12n(nn/2)

また、が完全でない場合、二項式はに等しいと理解されます。0n/2

このように推論できます。ボットがラインに着地する確率はどのくらいですか?これは、上下の動きの総数が上下の動きの総数に等しい場合に発生します。これは、たとえば、コインを回裏返し、テールと同じ数のテールを獲得する確率と同じです。あなたは選択する必要がありますの頭であることを反転させ反転し、で行うことができの通り、の確率を与え、全体的に可能なシーケンスy=xnn/2n(nn/2)2n

s=12n(nn/2)

線が着陸する確率もです。したがって、両方の行での着陸確率を二重にカウントすることを除いて、いずれかの行に着陸する確率はこれらまたは合計であり、それを差し引く必要があります。y=xs2sx=y=0

それが着陸する確率が判明であるだけ、各ライン上のランディングの確率の積。イベントは次のように独立していると考えることができます。「Up or Left」と「DownまたはRight」の等しい数のランダムシーケンスを選択してに着陸し、同様に「Up or Right」と「DownまたはLeft "場合、各位置で方向のペアの交差を取得することにより、上、下、左、右のシーケンスに一意に結合できます。x=y=0s2x=yx=y

したがって、またはに着陸する確率はです。x=yx=y2ss2

コードは、baseと同様に、この式を使用して二項を計算します。確率分数から分子を抽出するには、分母が2の累乗であることに注意してください。したがって、式を使用して2の最大累乗を除算し、古典的なビットトリックとして表されます。(nn/2)(b+1)**n/b**(n/2)%bb=2**nr/(r&-r)rr&-r

解決策は、をとして記述し、が1回だけ参照されるようにし、小数部が整数内に収まるようにすることです。ファンキーな二項計算方法でも、計算は多項式時間です。2ss21(1s)2s1/2nn


ボットが死ぬ確率の証拠を書いた後、私はそれを証明して提示するための、おそらくよりクリーンな方法を見つけました。

ボットが移動するたびに、との値を追跡しましょう。上、下、左、右の4つの方向はそれぞれ、とそれぞれをインクリメントまたはデクリメントし、4つの方向は4つの組み合わせに対応します。a=x+yb=xyab

したがって、ランダムな移動は、をにランダムに追加しを個別に追加することと同じです。これは、上の別のランダムウォークを行うと等価であると。a ± 1 b a b±1a±1bab

これで、ロボットは、またはとき、行または終了し。したがって、で終わる確率はあり、も同様です。ウォークは独立しているため、およびである確率はであるため、少なくとも1つがゼロである確率は補数です。x = y a = 0 b = 0 a = 0 s = 1x=yx=ya=0b=0a=0 b=0a0b01s211s2s=12n(nn/2)b=0a0b0(1s)21(1s)2


3
素晴らしい!私は誰かがこれを引き出すのを待っていました。こんなに高速だとは思いもしませんでした。。欠点は今、他の回答のほとんどは:(あまり考える必要はないだろうということである優れた1
ドン・サウザンド・

小さな賞金を楽しんでください(そんなに申し訳ありません)
ドンサウザンド

1
@RushabhMehtaありがとうございます、それはとても親切です!あなたの報奨金は、私が後で考えたよりクリーンな証拠を書く動機になりました。
xnor

この問題の本当のインスピレーションは、AIME I 2014問題11でした。
ドンサウザンド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.