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 ndado a faccia nlaterale 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 nvalori dopo i rtiri.
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 rdove P(r, n)è almeno il 50%. La sfida è calcolare il ntermine di questa sequenza il più velocemente possibile.
La sfida
- Dato un
n, trova il più piccolordoveP(r, n)è maggiore o uguale0.5o del 50%. - Il tuo codice dovrebbe teoricamente gestire qualsiasi numero intero non negativo
ncome 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 ingressi1attraverso10000. - Controlleremo se le tue soluzioni sono corrette eseguendo la nostra versione del
R(n)tuo output per vedere seP(your_output, n) >= 0.5eP(your_output - 1, n) < 0.5, cioè che il tuo output sia effettivamente il più piccolorper 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
rtrane quellorche stiamo cercando, ma è necessario trovare il più piccolore non solordoveP(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!