Diciamo che hai un dado a 20 facce. Inizi a lanciare quel dado e devi lanciarlo alcune dozzine di volte prima di lanciare finalmente tutti i 20 valori. Ti chiedi, di quanti tiri ho bisogno prima di avere una probabilità del 50% di vedere tutti i 20 valori? E quanti tiri di n
dado a faccia n
laterale devo tirare prima di tirare tutti i lati?
Dopo alcune ricerche, scopri che esiste una formula per calcolare la possibilità di far rotolare tutti i n
valori dopo i r
tiri.
P(r, n) = n! * S(r, n) / n**r
dove S(a, b)
indica numeri di Stirling del secondo tipo , il numero di modi per partizionare una serie di n oggetti (ogni rotolo) in k sottoinsiemi non vuoti (ogni lato).
Troverai anche la sequenza OEIS , che chiameremo R(n)
, che corrisponde al più piccolo r
dove P(r, n)
è almeno il 50%. La sfida è calcolare il n
termine di questa sequenza il più velocemente possibile.
La sfida
- Dato un
n
, trova il più piccolor
doveP(r, n)
è maggiore o uguale0.5
o del 50%. - Il tuo codice dovrebbe teoricamente gestire qualsiasi numero intero non negativo
n
come input, ma testeremo il tuo codice solo nell'intervallo di1 <= n <= 1000000
. - Per il punteggio, ci sarà prendere il tempo totale necessario per l'esecuzione
R(n)
su ingressi1
attraverso10000
. - Controlleremo se le tue soluzioni sono corrette eseguendo la nostra versione del
R(n)
tuo output per vedere seP(your_output, n) >= 0.5
eP(your_output - 1, n) < 0.5
, cioè che il tuo output sia effettivamente il più piccolor
per un daton
. - È possibile utilizzare qualsiasi definizione per
S(a, b)
nella propria soluzione. Wikipedia ha diverse definizioni che potrebbero essere utili qui. - È possibile utilizzare i componenti integrati nelle soluzioni, inclusi quelli che calcolano
S(a, b)
o anche quelli che calcolanoP(r, n)
direttamente. - È possibile codificare fino a 1000 valori di
R(n)
e un milione di numeri Stirling, sebbene nessuno di questi sia un limite rigido e può essere modificato se si può fare un argomento convincente per alzarli o abbassarli. - Non è necessario controllare ogni possibile
r
tran
e quellor
che stiamo cercando, ma è necessario trovare il più piccolor
e non solor
doveP(r, n) >= 0.5
. - Il tuo programma deve usare una lingua liberamente eseguibile su Windows 10.
Le specifiche del computer che testerà le tue soluzioni sono i7 4790k, 8 GB RAM
. Grazie a @DJMcMayhem per aver fornito il suo computer per i test. Sentiti libero di aggiungere i tuoi tempi non ufficiali per riferimento, ma i tempi ufficiali verranno forniti in seguito una volta che DJ potrà provarli.
Casi test
n R(n)
1 1
2 2
3 5
4 7
5 10
6 13
20 67 # our 20-sided die
52 225 # how many cards from a huge uniformly random pile until we get a full deck
100 497
366 2294 # number of people for to get 366 distinct birthdays
1000 7274
2000 15934
5000 44418
10000 95768
100000 1187943
1000000 14182022
Fammi sapere se hai domande o suggerimenti. Buona fortuna e buona ottimizzazione!