Bot ivre poli à courte vue sur un champ de mines

11

Comme le titre peut le suggérer, ce problème est semi-inspiré du Polite Near-Sighted Drunk Bot par @NP

Notre pauvre bot est placé sur une grille cartésienne à l'origine, et après chaque minute, il se déplace de 1 unité dans l'une des quatre directions (Haut, Bas, Gauche, Droite).

Après n minutes, toutes les mines latentes sur la grille s'activent, tuant tout pauvre bot qui pourrait se retrouver sur elles. Les mines sont situées à toutes les coordonnées entières satisfaisant l'équation | y | = | x |.

Défi

Vous recevrez n , le nombre de minutes avant l'explosion des mines, en entrée et en sortie, vous devez trouver la probabilité que le bot soit mort .

Entrée : Un nombre naturel représentant n .

Sortie : Soit p / q la probabilité que le bot soit mort , où p et q sont des nombres entiers premiers (q ne peut pas être 0, mais p le peut). Sortie p.

Règles

  • Votre algorithme ne doit pas fonctionner en temps exponentiel ou supérieur. Il devrait idéalement fonctionner en temps polynomial ou moins.
  • Votre algorithme doit être capable de gérer des entrées n<20 (peut être ajusté s'il est trop difficile) dans un délai raisonnable.
  • Il s'agit d'un défi de .
  • Itérer sur toutes les possibilités pour un n donné ne sera certainement pas accepté comme réponse.

Cas de test

1->0

2->3

4->39

6->135

8->7735

10->28287

Exemple de calcul pour n = 6

Nous avons 4 mouvements possibles: U, D, R et L. Le nombre total de chemins qui pourraient être empruntés est 4 ^ 6 ou 4096. Il y a 4 cas possibles qui atterrissent le long de la ligne y = x: x, y = ± 1; x, y = ± 2; x, y = ± 3; ou x = y = 0. Nous compterons le nombre de façons de finir à (1,1), (2,2) et (3,3), les multiplier par 4 pour tenir compte des autres quadrants et ajouter ceci au nombre de façons de finir à (0,0).

Cas 1: Le bot se termine à (3, 3). Pour que le bot se retrouve ici, il doit avoir eu 3 mouvements à droite et 3 mouvements vers le haut. En d'autres termes, le nombre total de façons d'arriver ici est le moyen de réorganiser les lettres dans la séquence RRRUUU, qui est de 6 choisir 3 = 20.

Cas 2: Le bot se termine à (2,2). Pour que le bot se retrouve ici, il aurait pu avoir 2 mouvements vers le haut, 3 mouvements vers la droite et 1 mouvement vers la gauche; ou 2 mouvements à droite, 3 mouvements vers le haut et 1 mouvement vers le bas. Ainsi, le nombre total de façons d'arriver ici est la somme des façons de réorganiser les lettres dans les séquences RRRLUU et UUUDRR, qui sont toutes les deux (6 choisissez 1) * (5 choisissez 2) = 60, pour un total de 120 possibilités .

Cas 3: Le bot se termine à (1,1). Pour que le bot se retrouve ici, il aurait dû y avoir: 1 mouvement à droite, 3 mouvements vers le haut et 2 mouvements vers le bas. Dans ce cas, le nombre de façons de réorganiser les lettres dans la séquence RUUUDD est (6 choisissez 1) * (5 choisissez 2) = 60.

1 mouvement vers le haut, 3 mouvements vers la droite et 2 mouvements vers la gauche. Dans ce cas, le nombre de façons de réorganiser les lettres dans la séquence URRRLL est (6 choisissez 1) * (5 choisissez 2) = 60.

2 mouvements à droite, 1 mouvement à gauche, 2 mouvements vers le haut et 1 mouvement vers le bas. Dans ce cas, le nombre de façons de réorganiser les lettres dans la séquence UUDRRL est (6 choisissez 1) * (5 choisissez 1) * (4 choisissez 2) = 180.

Ainsi, le nombre total de façons de se retrouver à (1,1) est de 300.

Cas 4: Le bot se termine à (0,0). Pour que le bot se retrouve ici, il aurait dû avoir:

3 mouvements à droite et 3 mouvements à gauche. Dans ce cas, le nombre de façons de réorganiser les lettres dans la séquence RRRLLL est (6 choisissez 3) = 20.

3 mouvements vers le haut et 3 mouvements vers le bas. Dans ce cas, le nombre de façons de réorganiser les lettres dans la séquence UUUDDD est (6 choisissez 3) = 20.

1 mouvement à droite, 1 mouvement à gauche, 2 mouvements vers le haut et 2 mouvements vers le bas. Dans ce cas, le nombre de façons de réorganiser les lettres dans la séquence RLUUDD est (6 choisissez 1) * (5 choisissez 1) * (4 choisissez 2) = 180.

1 mouvement vers le haut, 1 mouvement vers le bas, 2 mouvements vers la droite et 2 mouvements vers la gauche. Dans ce cas, le nombre de façons de réorganiser les lettres dans la séquence RRLLUD est (6 choisissez 1) * (5 choisissez 1) * (4 choisissez 2) = 180.

Ainsi, le nombre total de façons de se retrouver à (0,0) est de 400.

En additionnant ces cas, nous obtenons que le nombre total de façons de se retrouver sur | y | = | x | est 4 (20 + 120 + 300) + 400 = 2160. Ainsi, notre probabilité est 2160/4096. Lorsque cette fraction est entièrement réduite, elle est de 135/256, donc notre réponse est 135 .

Don mille
la source
J'aime le défi, mais je pense qu'il serait avantageux d'inclure un exemple concret pour l'un des très petits cas de test (2 ou 3) par exemple.
M. Xcoder
@ Mr.Xcoder J'en ajouterai un quand j'aurai le temps.
Don Thousand
2
Défi intéressant. Notez que l'utilisation du mot "idéalement" dans une règle n'en fait pas une règle. Il serait utile de dire définitivement d'une manière ou d'une autre.
trichoplax
1
Mais personne ne parle d'algorithme d'apprentissage de première génération?
Programmes Redwolf
1
@RedwolfPrograms ahaha yea mais ce bot a le nom le plus cool
Don Thousand

Réponses:

17

Python 2 , 65 octets

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

Essayez-le en ligne!

La probabilité que le bot soit mort peut s'exprimer comme suit:

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

et le binôme est égal à lorsque n'est pas entier.0n/2

On peut raisonner comme ça. Quelle est la probabilité que le bot atterrisse sur la ligne ? Cela se produit si le nombre total de mouvements vers le haut et vers la gauche est égal au nombre total de mouvements vers le bas et vers la droite. C'est la même probabilité que, disons, vous lancez une pièce fois et obtenez autant de queues que de têtes. Vous devez choisir flips pour être les têtes de flips, ce qui peut être fait de façons, de séquences possibles dans l'ensemble, donnant une probabilitéy=xnn/2n(nn/2)2n

s=12n(nn/2)

La probabilité d'atterrir sur la ligne est également . Ainsi, la probabilité d'atterrissage de chaque ligne est la somme de ceux - ci ou , sauf nous compter deux fois la probabilité d'atterrissage de dans les deux lignes, et doit soustraire à compenser.s 2 s x = y = 0y=-Xs2sX=y=0

Il s'avère que la probabilité d'atterrir sur est juste , le produit de la probabilité d'atterrir sur chaque ligne. Nous pouvons affirmer que les événements sont indépendants comme suit: si nous choisissons une séquence aléatoire de nombres égaux de "Haut ou Gauche" et "Bas ou Droite" pour atterrir sur et de même avec "Haut ou Droite" et "Bas ou Gauche "pour , nous pouvons les combiner de manière unique en une séquence de haut, bas, gauche, droite en prenant l'intersection des paires de directions à chaque position.s 2 x = y x = - yX=y=0s2X=yX=-y

Ainsi, la probabilité d'atterrir sur ou est .x = - y 2 s - s 2X=yX=-y2s-s2

Le code calcule le binôme utilisant cette expression comme avec base . Pour extraire le numérateur de la fraction de probabilité, nous notons que le dénominateur est une puissance de 2, nous utilisons donc l'expression pour diviser la puissance maximale de 2 est , exprimée comme l'astuce classique .(nn/2)(b+1)**n/b**(n/2)%bb=2**nr/(r&-r)rr&-r

La solution est jouée en écrivant comme afin que ne soit référencé qu'une seule fois, et en travaillant sans les fractions pour rester dans les entiers. Le calcul est polynomial-temps en même avec la façon funky de calculer des binômes.2s-s21-(1-s)2s1/2nn


Après avoir écrit la preuve de la probabilité de la mort du bot, j'ai trouvé un moyen peut-être plus propre de le prouver et de le présenter.

Gardons une trace des valeurs de et après chaque déplacement du bot. Chacune des quatre directions vers le haut, le bas, la gauche et la droite incrémente ou décrémente chacune de et , les quatre directions correspondant aux quatre combinaisons.une=X+yb=X-yuneb

Ainsi, un mouvement aléatoire équivaut à ajouter au hasard à et indépendamment à . Cela équivaut à faire des marches aléatoires séparées sur et .±1une±1buneb

Maintenant, le robot se termine sur la ligne ou exactement quand ou . Ainsi, la probabilité de terminer par est et de même pour . Comme les marches sont indépendantes, la probabilité que et soit , donc la probabilité qu'au moins un soit zéro est le complément .X=yX=-yune=0b=0une=0s=12n(nn/2)b=0une0b0(1-s)21-(1-s)2

xnor
la source
3
Fantastique! J'attendais que quelqu'un dérive ça. Je n'imaginais pas que ce soit aussi rapide. L'inconvénient est maintenant que la plupart des autres réponses n'auront pas à trop réfléchir :(. Excellent +1
Don Thousand
profitez de la petite prime (vous n'avez pas grand chose à donner, désolé)
Don Thousand
1
@RushabhMehta Merci, c'est très gentil de votre part! Votre générosité m'a motivé à rédiger une preuve plus nette à laquelle j'ai pensé par la suite.
xnor
La véritable source d'inspiration pour ce problème était le problème 11 d'AIME I 2014, si vous voulez le vérifier.
Don Thousand