[Qualsiasi ling.] Stampare tutte le combinazioni con 6 carte
Qualsiasi linguaggio eccetto quelli funzionali, quelli che si possono eseguire solo su windows e a pagamento (come matlab) altrimenti non posso testare il codice. Grazie!!!
Ipotizzando di avere 6 carte nel mazzo: A♠ K♠ Q♠ A♣ K♣ Q♣
E tenendo conto che:
A♠ K♠ Q♠ equivale a A♣ K♣ Q♣
o
A♠ K♠ Q♣ equivale a A♣ K♣ Q♠
perchè la probabilità che escano sono uguali.
Conseguentemente, ora proviamo ad eliminare i semi e invetarcene 2 nuovi, "z" e "y": il primo seme è delle parima carta che viene estratta è la "z", il secondo seme è della seconda carta che viene estratta, se la carta è uguale alla precedente è la "y", se la carta è differente può essere sia la "z" che la "y".
EDIT: mi sono scordato di dire che le carte le dovrei ordinare dalla più alta alla più bassa. E i semi dovrebbero essere ordinati secondo "z" > "y", quindi esempi validi sono:
1) Az Ay Kz
2) Az Kz Qz
Esempi non validi sono:
1) Ay Az Kz
2) Az Ay Ky
3) Ay Ky Qy
Le combo che possiamo formare con questa interpretazione sono (estraendo 3 carte dal mazzo):
1) Az Ay Kz (che potrebbe equivalere a Az Ay Ky)
2) Az Ay Qz (che potrebbe equivalere a Az Ay Qy)
3) Az Kz Ky
4) Kz Ky Qy
5) Az Qz Qy
6) Kz Qz Qy
7) Az Kz Qz
8 ) Az Kz Qy
9) Az Ky Qz
10) Az Ky Qy
Ovviamente anche consigli teorici sono ben accetti. Attualmente cerco di controllare che semi estrarre controllando quali carte sono state inserite.
Ma forse creare prima un deck ordinato e rimuovere dal deck potrebbe essere una soluzione migliore.
EDIT 2: pensando potrei anche farle letteralmente tutte e poi creare una funzione che effettua il pruning... cosa ne pensate?
Ipotizzando di avere 6 carte nel mazzo: A♠ K♠ Q♠ A♣ K♣ Q♣
E tenendo conto che:
A♠ K♠ Q♠ equivale a A♣ K♣ Q♣
o
A♠ K♠ Q♣ equivale a A♣ K♣ Q♠
perchè la probabilità che escano sono uguali.
Conseguentemente, ora proviamo ad eliminare i semi e invetarcene 2 nuovi, "z" e "y": il primo seme è delle parima carta che viene estratta è la "z", il secondo seme è della seconda carta che viene estratta, se la carta è uguale alla precedente è la "y", se la carta è differente può essere sia la "z" che la "y".
EDIT: mi sono scordato di dire che le carte le dovrei ordinare dalla più alta alla più bassa. E i semi dovrebbero essere ordinati secondo "z" > "y", quindi esempi validi sono:
1) Az Ay Kz
2) Az Kz Qz
Esempi non validi sono:
1) Ay Az Kz
2) Az Ay Ky
3) Ay Ky Qy
Le combo che possiamo formare con questa interpretazione sono (estraendo 3 carte dal mazzo):
1) Az Ay Kz (che potrebbe equivalere a Az Ay Ky)
2) Az Ay Qz (che potrebbe equivalere a Az Ay Qy)
3) Az Kz Ky
4) Kz Ky Qy
5) Az Qz Qy
6) Kz Qz Qy
7) Az Kz Qz
8 ) Az Kz Qy
9) Az Ky Qz
10) Az Ky Qy
Ovviamente anche consigli teorici sono ben accetti. Attualmente cerco di controllare che semi estrarre controllando quali carte sono state inserite.
Ma forse creare prima un deck ordinato e rimuovere dal deck potrebbe essere una soluzione migliore.
EDIT 2: pensando potrei anche farle letteralmente tutte e poi creare una funzione che effettua il pruning... cosa ne pensate?
Risposte
Il problema dell'inversione del colore non lo vedo un gran problema perché ti basta richiedere che la carta più alta sia sempre di un determinato segno. Comunque stampare tutte le combinazioni ordinate non è diverso da stampare qualcosa come:
123
124
125
134
135
145
234
235
245
345
(l'esempio è con 5 carte)
123
124
125
134
135
145
234
235
245
345
(l'esempio è con 5 carte)
"vict85":
Il problema dell'inversione del colore non lo vedo un gran problema perché ti basta richiedere che la carta più alta sia sempre di un determinato segno.
Sicuro di ciò che affermi?
Potresti spiegarmi come funziona con due combo differenti come:
Az Ky Qz
e
Az Kz Qz
Dove ovviamente ci servono tutte e due.
Grazie mille della risposta
Non ho capito la tua domanda. Fissando il segno della carta più grande puoi avere Az Ky Qz ma non Ay Kz Qy.
"vict85":
Non ho capito la tua domanda. Fissando il segno della carta più grande puoi avere Az Ky Qz ma non Ay Kz Qy.
Appunto.
A me non serve SEMPRE il seme più alto.
Dipende dalla configurazione.
Az Ky Qz che equivarebbe a un A♠ K♠ Q♠ oppure a A♣ K♣ Q♣
e mi serve anche
Az Ay Kz che equivarebbe a A♠ A♣ K♠ oppure a A♣ A♠ K♣
Spero di essere stato più chiaro, altrimenti provo anche a descrivere perchè lo voglia fare così magari sarà possibile entrare meglio nella logica dell'algoritmo.
==========================
EDIT: attualmente sto risolvendo generando tutte le combo, e poi scrivendo vari algoritmi di pruning che eliminano le combo con probabilità di uscire statisticamente uguali.
Però sono sempre ben disposto ad ascoltare consigli.
Ok, quindi stavi già "fissando" il primo seme della lista. In questo caso non capisco allora che altre combo tu debba filtrare.
Per esempio supponi di avere
Per esempio supponi di avere
const char carte[6][3] = { "Az", "Ay", "Kz", "Ky", "Qz", "Qy" };allora l'ordine della carte è dato dall'indice nell'array e devi generare tutte le combinazioni ordinate di 3 carte la cui prima carta ha indice \(0\), \(2\) e \(4\). Tra cicli for dovrebbero risolvere il problema in modo abbastanza semplice
#include <iostream> int main( void ) { const char carte[6][3] = { "Az", "Ay", "Kz", "Ky", "Qz", "Qy" }; for( int i =0; i < 6; i += 2 ) { for( int j=i+1; j < 6; j++ ) { for( int k=j+1; k < 6; k++ ) { std::cout << carte[i] << " " << carte[j] << " " << carte[k] << std::endl; } } } }
"TommyB1992":
Qualsiasi linguaggio eccetto quelli funzionali
Ma cos
"vict85":
...
Il tuo source code ritorna:
Az Ay Kz
Az Ay Ky
Az Ay Qz
Az Ay Qy
Az Kz Ky
Az Kz Qz
Az Kz Qy
Az Ky Qz
Az Ky Qy
Az Qz Qy
Kz Ky Qz
Kz Ky Qy
Kz Qz Qy
Che non va bene, perchè per esempio:
Az Ay Kz
Az Ay Ky
Sono la stessa configurazione (ergo sono la stessa cosa, due assi e un K che ha lo stesso seme di uno dei due assi) con la stessa probabilità statistica di venire estratta. A me serve solo la prima.
Per essere correto il tuo codice dovrebbe ritornare:
Az Ay Kz
[strike]Az Ay Ky[/strike]
Az Ay Qz
[strike]Az Ay Qy[/strike]
Az Kz Ky
Az Kz Qz
Az Kz Qy
Az Ky Qz
Az Ky Qy
Az Qz Qy
Kz Ky Qz
[strike]Kz Ky Qy[/strike]
Kz Qz Qy
Non avevo notato questa possibilità. Ma non è difficile adattare il codice per quella trasformazione.
#include <iostream> int main( void ) { const char carte[6][3] = { "Az", "Ay", "Kz", "Ky", "Qz", "Qy" }; for( int i =0; i < 4; i += 2 ) { for( int k = i+2; k < 5; k+=2 ) { std::cout << carte[i] << " " << carte[i+1] << " " << carte[k] << std::endl; } for( int j=i+2; j < 5; j++ ) { for( int k=j+1; k < 6; k++ ) { std::cout << carte[i] << " " << carte[j] << " " << carte[k] << std::endl; } } } }
Ok per 3 carte, ma se fossero 9 carte estratte e usando tutto il mazzo di 52 carte?
Pensi che riadattato funzionerebbe comunque?
Pensi che riadattato funzionerebbe comunque?
No, la complessità cresce notevolmente (oltre che il numero di soluzioni). E fare 9 for annidati è impensabile.
Appunto, a me serviva qualcosa, magari di funzionale (anche se paradossalmente ho chiesto di non portarmi esempi con linguaggi funzionali).
Quindi tornando alle basi, la mia attuale soluzione è: generarle tutte e poi con un algoritmo tagliare quelle che non sono conformi alle mie necessità.
Che ne pensi?
Quindi tornando alle basi, la mia attuale soluzione è: generarle tutte e poi con un algoritmo tagliare quelle che non sono conformi alle mie necessità.
Che ne pensi?
Ma perché vuoi escludere non tanto un linguaggio (che ci sta, puoi dire "non lo conosco e non lo saprei tweakare") ma un intero paradigma?
Non mi sono spiegato bene, a me l'esempio funzionale va bene (e anche il codice funzionale).
E' il linguaggio funzionale che non voglio.
Questo perchè non sono in grado di utilizzarli (oltre a non capire la sinstassi) a differenza dei linguaggi di scripting/programmazione dove in genere basta installare il software ed eseguire lo script, oppure compilarlo.
E' il linguaggio funzionale che non voglio.
Questo perchè non sono in grado di utilizzarli (oltre a non capire la sinstassi) a differenza dei linguaggi di scripting/programmazione dove in genere basta installare il software ed eseguire lo script, oppure compilarlo.
Continuo a non capire; ti va bene un algoritmo funzionale in un linguaggio che conosci, ma non in uno che non conosci? E allora quale conosci?
"fmnq":
Continuo a non capire; ti va bene un algoritmo funzionale in un linguaggio che conosci, ma non in uno che non conosci? E allora quale conosci?
Esatto, ma anche se non lo conosco un linguaggio procedurale o ad oggetti lo capisco.
Un linguaggio funzionale, come haskell:
do let cycle1 = cycle [1,2,3,4] :: [Int] let (use_now, save_for_later) = splitAt 5 cycle1 putStrLn $ "I am totally using some values: " ++ show use_now let (use_more, save_more_for_later) = splitAt 5 save_for_later putStrLn $ "See, I can get some more: " ++ show use_more
o il LISP:
(defun demo-function (flag) (print 'entering-outer-block) (block outer-block (print 'entering-inner-block) (print (block inner-block (if flag (return-from outer-block 3) (return-from inner-block 5) ) (print 'This-wil--not-be-printed)) ) (print 'left-inner-block) (print 'leaving-outer-block) t) ) (demo-function t) (terpri) (demo-function nil)
Non saprei dove mettere le mani.
"TommyB1992":
Ok per 3 carte, ma se fossero 9 carte estratte e usando tutto il mazzo di 52 carte?
Scusa ma non sono sicuro di aver capito bene ciò che stai cercando di fare.
Ragioniamo direttamente sul caso generale del mazzo completo di 52 carte e 4 semi. La generica sequenza di 9 carte quali caratteristiche deve avere affinché valga come un'unica "combinazione"?
"Super Squirrel":
[quote="TommyB1992"]Ok per 3 carte, ma se fossero 9 carte estratte e usando tutto il mazzo di 52 carte?
Scusa ma non sono sicuro di aver capito bene ciò che stai cercando di fare.
Ragioniamo direttamente sul caso generale del mazzo completo di 52 carte e 4 semi. La generica sequenza di 9 carte quali caratteristiche deve avere affinché valga come un'unica "combinazione"?[/quote]
Guarda onestamente non so se mi servirà mai con 9 carte, però l'algoritmo "non dovrebbe" avere limitazioni (ergo metti il numero di carte come parametro e lui restituisce le combo), sono comunque sicuro che fino a 5 carte c'arrivo senza molti problemi.
Però provo comunque a farti un paio di esempi (scusa se li faccio da 5 carte ma, da 9 potrei finire domani, nota quante combo sono solo per una carta con un seme differente):
1) Az Kz Qz Jz Tz corrisponde a:
A♠ K♠ Q♠ J♠ T♠
A♣ K♣ Q♣ J♣ T♣
A♦ K♦ Q♦ J♦ T♦
A♥ K♥ Q♥ J♥ T♥
2) Az Kz Qz Jz Ty corrisponde a:
A♠ K♠ Q♠ J♠ T♣
A♠ K♠ Q♠ J♠ T♦
A♠ K♠ Q♠ J♠ T♥
A♣ K♣ Q♣ J♣ T♠
A♣ K♣ Q♣ J♣ T♦
A♣ K♣ Q♣ J♣ T♥
A♦ K♦ Q♦ J♦ T♠
A♦ K♦ Q♦ J♦ T♣
A♦ K♦ Q♦ J♦ T♥
A♥ K♥ Q♥ J♥ T♠
A♥ K♥ Q♥ J♥ T♣
A♥ K♥ Q♥ J♥ T♦
Come è possibile notare in questo modo, con una combinazione ne abbiamo coperte ben 12.
Dal punto di vista teorico penso di poter dare una descrizione del problema,
Sia \(\displaystyle R = \{1,\dotsc, 13\}\times\{ 1,\dotsc, 4 \} \) l'inseme delle 52 carte di un mazzo (ho destitto il segno con dei numeri per semplicità) e \(\mathfrak{S}_4\) il gruppo delle permutazioni di 4 elementi. Consideriamo quindi l'azione di \(\mathfrak{S}_4\) su \(R\) definita come \(\sigma\colon (m,n) \mapsto (m, \sigma(n))\).
Sia quindi \(\displaystyle D(R, 9) \) l'insieme dei sottoinsiemi di \(R\) di \(9\) elementi. Quello che TommyB1992 richiede è definire un algoritmo che trova un singolo elemento per ogni classe di equivalenza definita dall'azione di \(\mathfrak{S}_4\) su \(\displaystyle D(R, 9) \). Corretto?
Se il problema fosse contare le classi di equivalenza penso che punterei a sfruttare il teorema di enumerazione di Polya[nota]Pagina wiki del teorema.[/nota] (che sinceramente dovrei andare a riguardarmi).
Sia \(\displaystyle R = \{1,\dotsc, 13\}\times\{ 1,\dotsc, 4 \} \) l'inseme delle 52 carte di un mazzo (ho destitto il segno con dei numeri per semplicità) e \(\mathfrak{S}_4\) il gruppo delle permutazioni di 4 elementi. Consideriamo quindi l'azione di \(\mathfrak{S}_4\) su \(R\) definita come \(\sigma\colon (m,n) \mapsto (m, \sigma(n))\).
Sia quindi \(\displaystyle D(R, 9) \) l'insieme dei sottoinsiemi di \(R\) di \(9\) elementi. Quello che TommyB1992 richiede è definire un algoritmo che trova un singolo elemento per ogni classe di equivalenza definita dall'azione di \(\mathfrak{S}_4\) su \(\displaystyle D(R, 9) \). Corretto?
Se il problema fosse contare le classi di equivalenza penso che punterei a sfruttare il teorema di enumerazione di Polya[nota]Pagina wiki del teorema.[/nota] (che sinceramente dovrei andare a riguardarmi).