Algoritmo di traduzione - combinazioni agli indici

0

Ho un mazzo di 52 carte da poker rappresentate come array di int - [0, 1, ... 51] .

Ci sono 2.598.960 combinazioni possibili di 5 carte. Posso generare tutte le combinazioni come questa:

#id      #combination
0 -       0,  1,  2,  3,  4
1 -       0,  1,  2,  3,  5
2 -       0,  1,  2,  3,  6
   ...omitted data..
2598957 - 46, 47, 49, 50, 51
2598958 - 46, 48, 49, 50, 51
2598959 - 47, 48, 49, 50, 51

Come posso trovare efficacemente #id per dato #combination e #combination per dato #id ?

    
posta Worker 28.04.2015 - 10:56
fonte

1 risposta

1

Per la prima carta hai 52 opzioni per il secondo hai 51 e così via. Devi codificare una sequenza c1 , c2 , c3 , c4 e c5 dove ci sono 52, 51, 50, 49, 48 opzioni resp.

Puoi regolare i numeri contando quanti dei numeri precedenti sono più piccoli: a5 = c5 - sum(x < c5 for x in [c1, c2, c3, c4])

puoi semplicemente codificarlo come un singolo intero output =(((a1*51 + a2)*50 + a3)*49 + a4)*48 + a5 .

puoi estrarlo usando l'operazione modulo e la divisione intero.

int input = //...

a5 = input%48;
input/=48;
a4 = input%49;
input/=49;
a3 = input%50;
input/=50;
a2 = input%51;
input/=51;
a1 = input;

E quindi è necessaria l'operazione inversa per riportarli tutti nella gamma [0..52) .

    
risposta data 28.04.2015 - 11:09
fonte

Leggi altre domande sui tag