Permutation circulaire d'une chaine de caractères

Résolu/Fermé
Taranis33 Messages postés 9 Date d'inscription lundi 22 décembre 2014 Statut Membre Dernière intervention 31 décembre 2014 - 22 déc. 2014 à 11:46
mamiemando Messages postés 33058 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 11 avril 2024 - 28 déc. 2014 à 20:48
Bonjour à tous,

Je voudrais écrire la fonction suivante sur spyder :permutation(chaine, x); qui retourne la chaîne après une permutation de x lettres vers la droite, en supposant que x est positif et inférieur à la longueur de la chaîne.

Le soucis c'est que je n'ai aucune idée pour débuter et que mes compétences sur python sont très limitées... Donc toutes vos suggestions sont les bienvenues !

Merci.

1 réponse

mamiemando Messages postés 33058 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 11 avril 2024 7 744
23 déc. 2014 à 14:07
Pour commencer je t'invite à lire un cours de python, car c'est un exercice très simple.
https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python

En python ça s'écrit assez facilement : si tu as une chaîne s, alors s[i:j] correspond à la sous-chaîne allant du caractère i au caratère j. Tu peux concaténer deux chaînes avec l'opérateur +.

(mando@velvet) (~) $ python
Python 2.7.8 (default, Oct 18 2014, 12:50:18)
[GCC 4.9.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = "abcdef"
>>> s[0:3]
'abc'


Maintenant réfléchis avec un papier et un crayon sur comment tu découperais la chaîne s et comment tu réassemblerais les morceaux pour obtenir le bon résultat.

Suppose dans mon exemple que tu veuilles décaler de d = 2 caractères à droite. Alors en gros tu vas obtenir "ef" suivi de "abcd" :

>>> s[4:6] + s[0:4]
'efabcd'


Maintenant regardons les valeurs significatives : 6 correspond à la longueur de la chaîne s (
len(s)
) et 4 correspond à 6 - 2 (ie
len(s) - d
).

>>> d = 2
>>> s[(len(s)-d):len(s)] + s[0:(len(s)-d)]
'efabcd'


Écrire ça sous forme de fonction devrait maintenant être une formalité.

Bonne chance
1
Taranis33 Messages postés 9 Date d'inscription lundi 22 décembre 2014 Statut Membre Dernière intervention 31 décembre 2014
24 déc. 2014 à 10:02
Oui en effet ce n'est pas bien difficile... Et c'est tout de suite beaucoup plus clair. Merci pour le lien sur le cours concernant python, je l'avais déjà vaguement survolé pour voir s'il n'y avait pas quelques fonctions intéressantes.

En tout cas merci beaucoup !
0
mamiemando Messages postés 33058 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 11 avril 2024 7 744
24 déc. 2014 à 15:14
Ok, je bascule ce sujet en résolu car je pense que tu as l'essentiel du matériel. Si tu es bloqué n'hésite pas à demander des éclaircissements.

Bonne chance, et bonnes fêtes
0
Taranis33 Messages postés 9 Date d'inscription lundi 22 décembre 2014 Statut Membre Dernière intervention 31 décembre 2014
27 déc. 2014 à 11:28
Je viens de me rendre compte que le programme que vous m'avez donné contenait des erreurs.

En effet,si je l'applique pour une chaine s=abcde et un décalage x=2, Python affiche comme résultat 'deabc'. Or, il faut que le programme affiche comme résultat : 'cdeab'.

Voici les modifications que j'ai apporté :

s=0
s= input("entrer une chaine à permuter :")
x=0
x=int(input("entrer un décalage x :"))


def permutation(s,x):
s= s[(len(s[:-1])-x):len(s)] + s[0:(len(s)-x)] <=== Changement
print (s[:-1]) <=== Changement

Maintenant le programme fonctionne bien :

- ce n'est plus s[(len(s)-d):len(s)] + s[0:(len(s)-d)], mais : s[(len(s[:-1])-x):len(s)] + s[0:(len(s)-x)].

- on demande d'afficher print (s[:-1]) et non plus print(s).

En tout cas merci beaucoup de m'avoir donné la base pour arriver à coder ce programme !
0
mamiemando Messages postés 33058 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 11 avril 2024 7 744
28 déc. 2014 à 20:48
Merci pour ces précisions et surtout bravo d'y être arrivé. Dans mon cas je partais du principe qu'on décalait les caractère vers le droite (donc le caractère 1 arrive en position 3, etc).

Bonne continuation et bonnes fêtes :)
0