Page 3 sur 4

Re: [Résolu] Permutation de groupes de caractères

Publié : mar. 23/févr./2016 11:05
par Shadow
Bon bref, ont va pas en faire une montagne si ?

Re: [Résolu] Permutation de groupes de caractères

Publié : dim. 28/févr./2016 2:58
par Shadow
Je reviens vers vous.

Calculer toute les positions des objets est fastidieuse et très grande consommation de temps.
N'y à t-il aucun moment de faire ça autrement ?

Il dois bien exister un calcule pour ça non ?
Au lieux de tester chaque position...

Je parle pas de factoriel ici bien que peut être que c'est à base.
Mais par exemple si j'ai ceci:

Objet classé du plus petit au plus grand -> A, B, C, D
Une position d'objet au pif -> D, A, C, B

Comment je calcule le nombre de permutation sans passer par le test de chaque position ?
Si ont pouvais juste calculer se serait infiniment plus rapide au lieux de faire tous les tests.

Est ce que c'est possible au moins ?
Peut être en regardant leur position actuel ?

D est en première position, il étais en 4ème place avant, il à bougé de 3 place !
A à été rétrogradé à la 2ème place, il à bougé de 1 place !
C conserve ça position !
B est en dernière position, c'est à dire 4ème place, il à bougé de 3 place !

Ensuite quoi ?, 3 + 1 + 0 + 3 = 7 ?
Je doute fort que ce soit ça !

3 * 1 * 3 = 9 ?
Je ne sais pas !

Merci.

Re: [Résolu] Permutation de groupes de caractères

Publié : dim. 28/févr./2016 3:10
par falsam
Shadow a écrit :Comment je calcule le nombre de permutation sans passer par le test de chaque position ?
En passant par un test de factoriel.

Code : Tout sélectionner

Procedure.q Factoriel(n.q) 
  If n=0
    ProcedureReturn #True
  Else
    ProcedureReturn n*Factoriel(n-1)
  EndIf
EndProcedure 

Chaine.s = "A,B,C,D"

Debug "Nombre de combinaisons possibles " + Factoriel(CountString(Chaine, ",") + 1)

Re: [Résolu] Permutation de groupes de caractères

Publié : dim. 28/févr./2016 10:41
par Micoute
Bonjour falsam, il y a un problème dans ton code, pour moi quand on fait l'opération suivante : 1*2*3*4, on obtient 24, pourquoi obtient-on 66 au lieu de 24 ?

Ta procédure est différente de la mienne:

Code : Tout sélectionner

Procedure.q Factorielle(Nombre.q) ; - Calcul la factorielle d'un nombre
  If Nombre = 1 
    ProcedureReturn #true
  Else 
    ProcedureReturn Nombre * Factorielle(Nombre - 1) 
  EndIf 
EndProcedure
 

Re: [Résolu] Permutation de groupes de caractères

Publié : dim. 28/févr./2016 10:51
par falsam
Bonjour Micoute.
Micoute a écrit :il y a un problème dans ton code
Quand je teste la procédure que j'ai posté j'ai bien un résultat de 24.
Micoute a écrit :Ta procédure est différente de la mienne
ha bon ? c'est la meme que la mienne non ?

Ha si il y a quelques différences : :wink:
- Tu l'as nommé Factorielle au lieu de Factoriel
- Nombre au lieu de n
- J'aurais pu faire une récursivité de moins en mettant if n=1 au lieu de if n=0

Re: [Résolu] Permutation de groupes de caractères

Publié : dim. 28/févr./2016 11:00
par GallyHC
Bonjour,

Je confirme que cela donne bien : 24.

Cordialement,
GallyHC

Re: [Résolu] Permutation de groupes de caractères

Publié : dim. 28/févr./2016 12:25
par Micoute
C'est quand même bizarre, j'ai ré-essayé et j'ai toujours la même réponse : "Nombre de combinaisons possibles 66".

Dans ta procédure, tu utilises la fonction CountString dont la sortie "A,B,C,D" doit donner 4, là je suis d'accord, mais je ne comprends pas pourquoi le résultat est faux.

Je viens à nouveau de refaire l'opération et en tapant : Debug "Nombre de combinaisons possibles " + Str(Factoriel(CountString(Chaine, ",") + 1)), le résultat est bon.

Je travaille avec la version 5.42 Béta 5.

Re: [Résolu] Permutation de groupes de caractères

Publié : dim. 28/févr./2016 13:00
par falsam
De la version 4.20 à 5.42 Beta 5 le résultat est le même : 24

A noter qu'avec la version 4.20, il faut remplacer

Code : Tout sélectionner

Debug "Nombre de combinaisons possibles " + Factoriel(CountString(Chaine, ",") + 1)
par

Code : Tout sélectionner

Debug "Nombre de combinaisons possibles " + Str(Factoriel(CountString(Chaine, ",") + 1))
Il aurait fallu voir ton code comprenant la chaîne que tu envoies pour voir pourquoi tu vois 66 au lieu de 24.

Re: [Résolu] Permutation de groupes de caractères

Publié : dim. 28/févr./2016 13:34
par Shadow
Bonjour,

Falsam merci de ta réponse mais ce n'est pas ce que je veux dire
mon message est pourtant assez explicite non ?

Imagine que tu as 4 objet en vraie (Physique):

un Cube Rouge
une Sphère Bleu
un Triangle Vert
un Losange Jaune

Les couleurs et les forme, ont s'en fou c'est juste pour les différencier.
Trier dans l'ordre des couleurs et des formes.

Ont as donc: CR, SB, TV, LJ
Ok ?

Classer ça donne ceci: CR, LJ, SB, TV
Ok ?

Pour savoir toutes les permutation possible tu va faire
le calcule que tu ma donner, j'ai bien dit TOUTES !

Tu prends une calculette ou tu fais ça dans ta tête: 1 * 2 * 3 * 4 = 24 Ok ?
Et bien, ça c'est pour savoir LE NOMBRE TOTALE de permutation.

Mais imagine que les objet soit dans cette ordre-ci:
SB, CR, TV, LJ

Tu veux savoir le nombre de permutation qu'il a fallut jusque
cette organisation-ci, alors comment tu fais ça ?

A part noter toutes les permutation possible sur une feuille de papier tu
ne va pas pouvoir sauf si tu refais toutes les permutation à la main !
Ok ?

Alors si tu pouvais par un calcule savoir le nombre de permutation qu'il à fallut
faire pour en arriver jusque là, se serrait extrêmement plus simple !

Tu me suis mieux là ou toujours pas ?
Ici tu as 4 objet, c'est facile mais avec 10 ?

Re: [Résolu] Permutation de groupes de caractères

Publié : dim. 28/févr./2016 13:45
par falsam
Shadow a écrit :mon message est pourtant assez explicite non ?
Ben non ça ne l'était pas.
Shadow a écrit :Tu me suis mieux là ou toujours pas ?
J'ai bien compris et je ne donnerais pas suite.

Re: [Résolu] Permutation de groupes de caractères

Publié : dim. 28/févr./2016 16:42
par Shadow
J'ai bien compris et je ne donnerais pas suite.
Et bien alors pourquoi tous ce cinéma alors ?
Bien à toi.

Re: [Résolu] Permutation de groupes de caractères

Publié : dim. 28/févr./2016 21:37
par falsam
Shadow a écrit :Et bien alors pourquoi tous ce cinéma alors ?
Whaouu Monsieur monte sur ses grands chevaux. Contrairement à ce que tu dis, il n'y a pas de cinéma :

Pour résumé tu veux connaitre le nombre de combinaisons à partir d'une distribution.
Exemple la distribution ABCD dans cette ordre donnera 24 combinaisons possibles.
Jusque là c'était facile et mon code était dans ce sens.

Nouvelle demande de ta part : Si je sors la combinaison BCDE tu veux savoir combien de permutations il a fallu pour arriver à ça ?

J’espère que tu te rends bien compte que ce nombre de permutations pour arriver à ça peut varier suivant le mode de calcul utilisé ?

Je ne donnerais pas suite parce que tu as une solution dans tout ce qui a était dit parmi les 44 commentaires précédents :wink:

Tu as suffisamment usé de mon temps et surement des autres utilisateurs sur ce sujet.

Re: [Résolu] Permutation de groupes de caractères

Publié : lun. 29/févr./2016 11:48
par Shadow
Bonjour,

Oui bien sur et je vous en remercie :)

Re: [Résolu] Permutation de groupes de caractères

Publié : lun. 29/févr./2016 16:56
par SPH
Shadow a écrit :Pour savoir toutes les permutation possible tu va faire
le calcule que tu ma donner, j'ai bien dit TOUTES !

Tu prends une calculette ou tu fais ça dans ta tête: 1 * 2 * 3 * 4 = 24 Ok ?
Et bien, ça c'est pour savoir LE NOMBRE TOTALE de permutation.
Pour un nombre N d'objets, le nombre total de combinaisons possibles est bien N*(N-1)*(N-2)....
Par exemple, 4 objets peuvent etre combiné de 24 facons possibles (4*3*2*1)

Maintenant, ce que tu cherches est le nombre minimum d'echanges pour arriver a un arrangement precis.
Par exemple : 1,2,3,4 deviens 2,3,1,4
Et bien, le nombre d'echange est compris entre 1 et N-1
Par exemple, pour 4 elements (1,2,3,4), il faut entre 1 et 3 echanges seulement !
Exemple :
depart : 1,2,3,4
un echange : 2,1,3,4
un deuxieme echange : 2,3,1,4
fini

Re: [Résolu] Permutation de groupes de caractères

Publié : lun. 29/févr./2016 20:07
par SPH
Meilleur score : 8 pass pour 10 chiffres :P

Code : Tout sélectionner

Dim p(9)

For i=0 To 9
  p(i)=i
Next

For i=0 To 9
  Swap p(i),p(Random(9))
Next

pass=0

Repeat
  a$=""
For u=0 To 9
  a$+Str(p(u))
Next
Debug a$
;pass+1

For i=0 To 9
  If p(i)<>i
Swap p(i),p(p(i))
EndIf

a$=""
ok=0
For u=0 To 9
  a$+Str(p(u))
  If p(u)=u
    ok+1
  EndIf
  
Next
Debug a$
pass+1

If ok=10
  Goto fin
  EndIf
Next

Until ok=10
fin:

Debug("Pass = "+Str(pass))