Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

Répondre

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt neuf plus dix-neuf
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Retour

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 :

for h in range(0,l,2):
    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 !

>>> l =10
>>> 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 :

# -*- coding: cp1252 -*-

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 :

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

peut être réduit en :

print 'Mon "rectangle de Polybe" :'
for j in range (6):
    for i in range(5):
        print chr(65+5*j+i),
    print

@+

Lutcho74
12-10-2009 22:00:33

Salut,

Donc le code donnerai :

# -*- coding: cp1252 -*-

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 j in range(6):
    for i in range(5):
        print 65+5*j+i,
    print

m'affiche :

65 66 67 68 69
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 :

>>> list=[['C','D','E'],['F','G','A'],['B','I','J'],['K','L','M']]
>>> 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 :

>>> list[1][2]
'A'

Moyennant quoi index marche aussi :

liste[3].index('L')
1

Mais attention à ne pas te tromper de n° de liste interne :

>>> list[2].index('L')

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()...

liste,polybe=[],[]
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],
    print

Ce qui donne à l'affichage :

A B C D E
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) :

liste,polybe=[],[]
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],
    print
print
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
print "La preuve :"
print "polybe[2][0] =",polybe[2][0]
print "polybe[2].index('K') =",polybe[2].index('K')

Résultat :

A B C D E
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 :

liste=[]
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')

@+

Pied de page des forums