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

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

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

Message par Shadow »

Bon bref, ont va pas en faire une montagne si ?
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

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

Message 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.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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
 
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

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

Message par GallyHC »

Bonjour,

Je confirme que cela donne bien : 24.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

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

Message 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 ?
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

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

Message par Shadow »

J'ai bien compris et je ne donnerais pas suite.
Et bien alors pourquoi tous ce cinéma alors ?
Bien à toi.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

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

Message par Shadow »

Bonjour,

Oui bien sur et je vous en remercie :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

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

Message 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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

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

Message 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))

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre