Bot ubriaco quasi miope educato su un campo minato


11

Come può suggerire il titolo, questo problema è semi-ispirato dal Polite Near-Sighted Drunk Bot di @NP

Il nostro povero bot viene posizionato su una griglia cartesiana all'origine e, dopo ogni minuto, si sposta di 1 unità in una delle quattro direzioni (Su, Giù, Sinistra, Destra).

Dopo n minuti, tutte le miniere latenti sulla griglia si attivano, uccidendo qualsiasi bot povero che potrebbe trovarsi su di esse. Le mine si trovano su tutte le coordinate intere che soddisfano l'equazione | y | = | x |.

Sfida

Ti verrà fornito n , il numero di minuti prima dell'esplosione delle miniere, come input e come output, devi trovare la probabilità che il bot sia morto .

Input : un numero naturale che rappresenta n .

Output : lascia che la probabilità che il bot sia morto sia p / q, dove p e q sono numeri interi relativamente primi (q non può essere 0, ma p può). Uscita p.

Regole

  • L'algoritmo non deve essere eseguito in tempo esponenziale o superiore. Idealmente dovrebbe funzionare in un tempo polinomiale o inferiore.
  • L'algoritmo deve essere in grado di gestire input di n<20 (può essere regolato se troppo difficile) in un tempo ragionevole.
  • Questa è una sfida di .
  • L'iterazione su tutte le possibilità per una data n non sarà sicuramente accettata come risposta.

Casi test

1->0

2->3

4->39

6->135

8->7735

10->28287

Esempio di calcolo per n = 6

Abbiamo 4 possibili mosse: U, D, R e L. Il numero totale di percorsi che potrebbero essere presi è 4 ^ 6 o 4096. Esistono 4 casi possibili che atterrano lungo la linea y = x: x, y = ± 1; x, y = ± 2; x, y = ± 3; oppure x = y = 0. Conteremo il numero di modi per arrivare a (1,1), (2,2) e (3,3), moltiplicarli per 4 per tenere conto degli altri quadranti e aggiungere questo per il numero di modi per finire a (0,0).

Caso 1: il bot termina in (3, 3). Affinché il bot finisca qui, deve aver avuto 3 mosse giuste e 3 mosse in alto. In altre parole, il numero totale di modi per arrivare qui è il modo di riordinare le lettere nella sequenza RRRUUU, che è 6 scegli 3 = 20.

Caso 2: il bot termina in (2,2). Affinché il bot finisse qui, avrebbe potuto avere 2 mosse in alto, 3 mosse a destra e 1 a sinistra; oppure 2 mosse giuste, 3 mosse in alto e 1 mossa in basso. Pertanto, il numero totale di modi per arrivare qui è la somma dei modi per riorganizzare le lettere nelle sequenze RRRLUU e UUUDRR, che sono entrambe (6 scegli 1) * (5 scegli 2) = 60, per un totale di 120 possibilità .

Caso 3: il bot termina in (1,1). Affinché il bot finisse qui, avrebbe potuto avere: 1 mossa giusta, 3 mosse in alto e 2 mosse in basso. In questo caso, il numero di modi per riorganizzare le lettere nella sequenza RUUUDD è (6 scegli 1) * (5 scegli 2) = 60.

1 mossa in alto, 3 mosse a destra e 2 mosse a sinistra. In questo caso, il numero di modi per riordinare le lettere nella sequenza URRRLL è (6 scegli 1) * (5 scegli 2) = 60.

2 mosse a destra, 1 mossa a sinistra, 2 mosse in alto e 1 mossa in basso. In questo caso, il numero di modi per riordinare le lettere nella sequenza UUDRRL è (6 scegli 1) * (5 scegli 1) * (4 scegli 2) = 180.

Pertanto, il numero totale di modi per arrivare a (1,1) è 300.

Caso 4: il bot termina in (0,0). Affinché il bot finisse qui, avrebbe potuto avere:

3 mosse a destra e 3 mosse a sinistra. In questo caso, il numero di modi per riordinare le lettere nella sequenza RRRLLL è (6 scegli 3) = 20.

3 mosse in alto e 3 mosse in basso. In questo caso, il numero di modi per riordinare le lettere nella sequenza UUUDDD è (6 scegli 3) = 20.

1 mossa destra, 1 mossa sinistra, 2 mosse in alto e 2 mosse in basso. In questo caso, il numero di modi per riordinare le lettere nella sequenza RLUUDD è (6 scegli 1) * (5 scegli 1) * (4 scegli 2) = 180.

1 mossa in alto, 1 mossa in basso, 2 mosse a destra e 2 mosse a sinistra. In questo caso, il numero di modi per riorganizzare le lettere nella sequenza RRLLUD è (6 scegli 1) * (5 scegli 1) * (4 scegli 2) = 180.

Pertanto, il numero totale di modi per arrivare a (0,0) è 400.

Sommando questi casi insieme, otteniamo che il numero totale di modi per finire su | y | = | x | è 4 (20 + 120 + 300) + 400 = 2160. Pertanto, la nostra probabilità è 2160/4096. Quando questa frazione è completamente ridotta, è 135/256, quindi la nostra risposta è 135 .


Mi piace la sfida, ma penso che trarrebbe beneficio dall'includere un esempio funzionante per uno dei casi di test molto piccoli (2 o 3), ad esempio.
Mr. Xcoder,

@ Mr.Xcoder Ne aggiungerò uno quando avrò tempo.
Don Mille

2
Sfida interessante. Nota che l'uso della parola "idealmente" in una regola non la rende una regola. Sarebbe utile dire sicuramente in un modo o nell'altro.
trichoplax,

1
Ma nessuno parla dell'algoritmo di apprendimento della prima generazione?
Programmi Redwolf,

1
@RedwolfPrograms ahaha yea ma questo bot ha il nome più cool
Don Thousand

Risposte:


17

Python 2 , 65 byte

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

Provalo online!

La probabilità che il bot sia morto può essere espressa come:

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

e si intende che il binomio è uguale a quando non è intero.0n/2

Possiamo ragionare in questo modo. Qual è la probabilità che il bot atterri sulla linea ? Ciò accade se il numero totale di mosse su e sinistra è uguale al numero totale di mosse giù e destra. Questa è la stessa probabilità che, diciamo, lanci una moneta volte e ottieni tante code quante le teste. Devi scegliere flip per essere head di flip, che può essere fatto in modi, di possibili sequenze complessive, dando probabilitày=xnn/2n(nn/2)2n

s=12n(nn/2)

Anche la probabilità di atterrare sulla linea è . Quindi, la probabilità di atterraggio su entrambe le linee è la somma di questi o , tranne per il doppio conteggio della probabilità di atterraggio di in entrambe le linee e dobbiamo sottrarla per compensare.y=xs2sx=y=0

Si scopre che la probabilità di atterraggio su è solo , il prodotto della probabilità di atterraggio su ciascuna linea. Possiamo sostenere che gli eventi sono indipendenti come segue: se scegliamo una sequenza casuale di uguali numeri di "Su o Sinistra" e "Giù o Destra" per atterrare su e allo stesso modo con "Su o Destra" e "Giù o Sinistra "per , possiamo combinarli in modo univoco in una sequenza di Su, Giù, Sinistra, Destra prendendo l'intersezione delle coppie di direzioni in ciascuna posizione.x=y=0s2x=yx=y

Quindi, la probabilità di atterrare su o è .x=yx=y2ss2

Il codice calcola il binomio usando questa espressione come con base . Per estrarre il numeratore dalla frazione di probabilità, notiamo che il denominatore è una potenza di 2, quindi usiamo l'espressione per dividere la potenza massima di 2 , espressa come il classico trucco dei bit .(nn/2)(b+1)**n/b**(n/2)%bb=2**nr/(r&-r)rr&-r

La soluzione viene giocata scrivendo come modo che sia referenziato una sola volta, e lavorando senza le frazioni per rimanere all'interno degli interi. Il calcolo è tempo polinomiale in anche con il modo funky di calcolare i binomi.2ss21(1s)2s1/2nn


Dopo aver scritto la prova della probabilità che il bot muoia, ho trovato un modo forse più pulito per dimostrarlo e presentarlo.

Tenere traccia Let dei valori di e dopo ogni giocata della bot. Ognuna delle quattro direzioni su, giù, sinistra e destra sia incrementa o decrementa ciascuno di e , con le quattro direzioni corrispondenti alle quattro combinazioni.a=x+yb=xyab

Quindi, una mossa casuale equivale ad aggiungere casualmente a e indipendentemente a . Ciò equivale a fare passeggiate aleatorie separati su e .±1a±1bab

Ora, il robot termina sulla linea o esattamente quando o . Quindi, la probabilità di terminare con è e allo stesso modo per . Poiché le passeggiate sono indipendenti, la probabilità che e sia , quindi la probabilità che almeno una sia zero è il complemento .x=yx=ya=0b=0a=0s=12n(nn/2)b=0a0b0(1s)21(1s)2


3
Fantastico! Stavo aspettando che qualcuno ne ricavasse questo. Non immaginavo che fosse così veloce. Il rovescio della medaglia ora è che la maggior parte delle altre risposte non dovrà pensare troppo :(. Eccellente +1
Don Mille

goditi la piccola taglia (non hai molto da dare così dispiaciuto)
Don Mille

1
@RushabhMehta Grazie, è molto gentile da parte tua! La tua generosità mi ha motivato a scrivere una prova più pulita a cui ho pensato in seguito.
xnor

La vera ispirazione per questo problema è stato il problema 11 di AIME I 2014, se si desidera verificarlo.
Don Mille
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.