Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Répondre
Résumé de la discussion (messages les plus récents en premier)
- Lutcho74
- 16-10-2009 17:36:48
Salut,
En faite nan il n'y a pas de problème...
C'est juste moi il devait être trop tard et en fait j'avais pas fait attention que c'était le prog de décryptage et j'y avais rentré des lettres ^^
Donc c'est bon j'ai supprimer la pseudo boucle...
@+
- yoshi
- 16-10-2009 07:30:38
Re,
C'est bon, j'ai fait l'essai et sans la boucle en plus, ça marche.
Ton message d'erreur est probablement dû au fait que tu n'as pas dû remodifier l'indentation (le décalage à gauche).
La prochaine fois note ton message d'erreur et donne-le : on pourra voir. En plus dans le message d'erreur, il y a le n° de ligne (et le nom du module incriminé), par ex line 36...
Alors tu vas dans la fenêtre de ton script tu cliques EDIT puis sur Go to line et tu y écris le n° 36 et ENTREE.
Hop, t'es sur la ligne incriminée...
@+
- Lutcho74
- 15-10-2009 21:52:09
Salut,
Oui c'est vrai que j'ai fait un petit bout de chemin depuis mes débuts :)
Pour le range(début,fin,pas) j'ignorai totalement...merci de me l'avoir appris :-)
Et pour le fait de supprimer la boucle...j'y est pensé, j'avais remarqué qu'elle faisait un seul tour et donc ne servait à rien mais si je la supprimait ça me mettais une erreur et j'avais pas envie de me compliquer la vie...c'était tard et j'avais surtout envie de fignoler ce prog pour en faire d'autres (j'ai refait l'algo de César (différent de ce que tu avais codé) et j'ai tenté le masque jetable(j'ai rencontré un problème au niveaux de la longueur de la clé mais je chercherai plus tard...))
Et bien merci pour l'explication sur le range...dès que je me sent je modifie le code et fait quelque essai avec le range :-)
@+ et merci pour ta remarque
- yoshi
- 15-10-2009 18:31:37
Salut,
C'est bien mon gars ! T'en as fait du chemin depuis ton premier post intitulé "Comment programmer un programme de crypt ?" Te souviens-tu ?
Bon, une remarque, puisque tu y tiens...
Une suggestion.
syntaxe de la boucle for :
for h in range(début,fin,pas) avec le pas (optionnel, non obligatoire), tu peux lui demander de compter de 2 en 2, de 3 en 3... etc
De plus à quoi sert ta boucle for j... ? j ne prend qu'une valeur j =0 et donc la boucle ne fonctionne qu'une fois : elle est donc inutile. Une boucle qui ne prend qu'une seule valeur de j, ce n'est pas une boucle.
Donc, tu devrais essayer ça :
pos=int(txt[h])-1
pos2=int(txt[h+1])-1
caract=polybe[pos][pos2]
print caract,
Ton code serait encore plus court.
Si ça ne marchait pas (mais il n'y a aucune raison), j'essayerai moi, mais là j'ai... la flemme !
>>> for h in range(0,l,2):
print h,
donne :
0 2 4 6 8
@+
- Lutcho74
- 14-10-2009 22:08:29
Salt,
J'ai galérai pendant un piti moment mais ça y est j'ai réussit à faire le module de décryptage :
liste,polybe=[],[]
for j in range (6):
for i in range(5):
liste.append(chr(65+5*j+i))
polybe.append(liste)
liste=[]
print "Le carré moderne de Polybe :"
for j in range (6):
for i in range(5):
print polybe[j][i],
print
print ""
print "Rentrez le message à décrypter :"
txt=raw_input("--> ")
txt=txt.replace(" ","")
l=len(txt)
print ""
print "Message décrypter :"
for j in range(1):
i=0
for h in range(l/2):
pos=int(txt[i])-1
pos2=int(txt[i+1])-1
caract=polybe[pos][pos2]
i+=2
print caract,
Remarques ? Critiques ?
@+
- Lutcho74
- 13-10-2009 12:15:41
Salut,
Ha oui en effet un carré n'est pas un rectangle ^^ je vais changé ça tout de suite et pour la réduction oui c'est claire que la boucle ne sert à rien ça aussi je vais le changé :)...
Merci pour ces remarques.
@+
- yoshi
- 13-10-2009 08:38:38
RE,
Bel effort, sauf que si un carré est un rectangle, un rectangle n'est pas forcément un carré : ça c'est de la Géométrie.
Et afficher un rectangle en disant : voilà le carré de Polybe, ça me gène.
Dis plutôt : Rectangle de chiffrement adapté du carré de Polybe ou qq ch comme ça...
Sinon, c'est nickel.
Une remarque quand même.
Le "carré de Polybe" que tu stockes dans la liste polybe pour l'afficher après ne sert à rien, il n'est plus réutilisé après : ça figurait ainsi dans mes exemples pour dissocier remplissage et affichage et te faciliter la compréhension du code.
Donc :
for j in range (6):
for i in range(5):
liste.append(chr(65+5*j+i))
polybe.append(liste)
liste=[]
print "Le carré de Polybe :"
for j in range (6):
for i in range(5):
print polybe[j][i],
peut être réduit en :
for j in range (6):
for i in range(5):
print chr(65+5*j+i),
@+
- Lutcho74
- 12-10-2009 22:00:33
Salut,
Donc le code donnerai :
def prepare(ma):
li1=["âà","éèêë","îï","ô","ûü","ç"]
li2=["A","E","I","O","U","C"]
i=0
# Remplacement des caractères accentués éventuels
for mot in li1:
repl=li2[i]
for lettre in mot:
ma=ma.replace(lettre,repl)
i+=1
for lettre in "',-;:!?.": # Suppression de la ponctuation
ma=ma.replace(lettre,"")
ma=ma.upper() # Passage en majuscules
return ma
liste,polybe=[],[]
for j in range (6):
for i in range(5):
liste.append(chr(65+5*j+i))
polybe.append(liste)
liste=[]
print "Le carré de Polybe :"
for j in range (6):
for i in range(5):
print polybe[j][i],
print
print "Entrez le texte à crypter :"
txt=raw_input("-->")
txt=prepare(txt)
txt=txt.replace(" ","")
for i in range(len(txt)):
pos=ord(txt[i])-65
vertical=str((pos/5)+1)
horizontal=str((pos%5)+1)
final=vertical+horizontal
print final,
Si tu vois des choses à modif...
Merci encore pour tes explications et ton aide.
@+
- Lutcho74
- 11-10-2009 22:26:59
Re,
Houla...! Il ma fallut écrire 2 tour de la boucle j pour comprendre :) ...ça me parraisait très bizarre mais c'est bon j'ai pigé !
Merki
bonne nuit
@+
- yoshi
- 11-10-2009 22:18:46
Re,
1. chr(65) --> A
5*j + i :
i varie de 0 à 4 ce qui fait que j'ajoute 0, 1, 2, 3, 4 à 5 * j et j varie de 0 à 5 :
donc quand j = 0
5*j + i varie de 5*0+0 à 5*0+4 , donc de 0 à 4 (ce qui nous fait 5 nombres)
donc quand j = 1
5*j + i varie de 5*1+0 à 5*1+4 , donc de 5 à 9 (ce qui nous fait 5 nombres)
et j'ajoute tout ça 65 ce qui me donne tous les nombres de 65 à 94...
Tiens regarde:
for i in range(5):
print 65+5*j+i,
m'affiche :
70 71 72 73 74
75 76 77 78 79
80 81 82 83 84
85 86 87 88 89
90 91 92 93 94
le 5*j+i remplace le e+=1 de ton code
@+
PS bin cherche pourquoi il y a erreur
- Lutcho74
- 11-10-2009 22:08:45
Re,
Moi ce que je comprend pas c'est le : 65+5*j+i après le liste.append(chr()) et le 5*j+i après le print liste[],
Merki d'avnce
A+
PS: pour le fait de tripatouiller le code a chaque fois que j'ésaye ça me mes une erreur ^^ donc j'essaye plus...
- yoshi
- 11-10-2009 22:01:50
Salut,
Je ne vois pas ce qui t'échappe...
J'utilise deux boucles imbriquées
1. d'abord soit pour constituer une liste classique, soit une liste de listes
2. ensuite pour afficher soit ta liste, soit la liste de listes sous forme d'un rectangle :
* dans la boucle for i... après le print il y a une virgule pour forcer l'affichage sur la même ligne
* puis à l'extérieur de la boucle for i, mais à l'intérieur de la boucle for j... j'ajoute un autre print sans virgule.
Ceci pour forcer le changement de ligne.
C'est ça que tu ne piges pas ?
Encore une fois, fais des essais,n tripatouille le code : tu finiras par piger alors...
@+
- Lutcho74
- 11-10-2009 21:42:02
Salut,
Houlaa ! Merci pour ton aide :) ! Mais je suis perdue dès le premier code :(...
pour le début de ton deuxième message j'ai tout compris mais alors tes deux boucles avec le .append() et le print ...
je ne comprend pas comment ça marche...
Merci d'avance pour tes explications.
@+
- yoshi
- 11-10-2009 10:12:59
Re,
Complément de formation...
1. On n'accède pas à un élément d'une liste de listes comme dans une liste simple :
>>> len(liste)
4
La longueur donnée est celle du nombre de listes qui compose la liste
Tu dois donc donner deux index pour accéder à un élément :
'A'
Moyennant quoi index marche aussi :
1
Mais attention à ne pas te tromper de n° de liste interne :
Traceback (most recent call last):
File "<pyshell#55>", line 1, in <module>
list[2].index('L')
ValueError: list.index(x): x not in list
Mais même avec une liste de liste, tu n'as pas besoin de la méthode index()...
for j in range (6):
for i in range(5):
liste.append(chr(65+5*j+i))
polybe.append(liste)
liste=[]
for j in range (6):
for i in range(5):
print polybe[j][i],
Ce qui donne à l'affichage :
F G H I J
K L M N O
P Q R S T
U V W X Y
Z [ \ ] ^
Maintenant tu veux savoir où est le K (par exemple) :
for j in range (6):
for i in range(5):
liste.append(chr(65+5*j+i))
polybe.append(liste)
liste=[]
for j in range (6):
for i in range(5):
print polybe[j][i],
pos=ord('K')-65
print "Ordre de K depuis la lettre A -->",pos
print "Position de K :"
print "(N° de liste, ordre dans la liste) =",(pos/5,pos%5)
print "La preuve :"
print "polybe[2][0] =",polybe[2][0]
print "polybe[2].index('K') =",polybe[2].index('K')
Résultat :
F G H I J
K L M N O
P Q R S T
U V W X Y
Z [ \ ] ^
Ordre de K depuis la lettre A --> 10
Position de K :
(N° de liste, ordre dans la liste) = (2, 0)
La preuve :
polybe[2][0] = K
polybe[2].index('K') = 0
Voilà de quoi méditer...
@+
- yoshi
- 10-10-2009 18:30:07
Salut,
Le plus simple c'est de faire comme pour mes carrés magiques, une seule liste de 30 lettres.
Et le n° j donnera la position du paquet de 6 : il n'y aura que toi qui saura que n'est pas un rectangle parce que tu peux l'afficher comme tel :
Regarde :
for j in range (6):
for i in range(5):
liste.append(chr(65+5*j+i))
for j in range (6):
for i in range(5):
print liste[5*j+i],
print
print
print liste.index('R')
@+







