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

#1 08-10-2009 22:35:54

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

[Python] Carré de Polybe ( problème de liste / find )

Bonjour,

Mon problème est le suivant :
J'ai fait un programme me permettant de reproduire un carré de Polybe façon moderne rafistolé par moi ^^ ... Bon pour ceux qui ne connaissent pas cette méthode de cryptage : elle consiste (dans la façon moderne) à mettre l'alphabet(sauf le 'w'...enfin pas pour moi) dans un tableau de 5 lignes et 5 colonnes (pour moi 5 colonnes et 6 lignes) bref par exemple 'A' correspondrait à 11...
et mon problème pour l'instant c'est que je n'ai pas trouvé d'autre moyen que de trouver la position d'une lettre dans une liste sans find...problème étant que find ne fonctionne pas avec les listes...

Alors ma question et la suivante : est il possible de contourné cela ?

Pour le code (pour la création du tableau seulement):

carre=[]
ligne=[]
e=0
for j in range (6):
    for i in range(5):
        ligne.append(chr(65+e))
        e+=1
    carre.append(ligne)
    ligne=[]

print carre

@+ et merci d'avance pour votre aide.

[EDIT] quelques petites modifs dans le texte...

Dernière modification par Lutcho74 (08-10-2009 22:53:17)


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#2 08-10-2009 22:45:01

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 991

Re : [Python] Carré de Polybe ( problème de liste / find )

Salut,

Et moi je ne comprends pas ça :

e n'ai pas trouvé d'autre moyen que de trouver la position d'une lettre dans le tableau sans find

Ca ne colle pas avec ton script qui ne cherche pas la position d'une lettre dans une liste mais qui écrit des lettres dans une liste à une position donnée...

Alors qu'est-ce que tu veux faire : Ecrire des lettres dans un "tableau" vide ou chercher la position d'une lettre précise dans un "tableau" déjà rempli ?

@+

PS
Je vois que tu es sorti d'affaire avec les boucles ! Grande nouvelle !


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 08-10-2009 22:50:18

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Carré de Polybe ( problème de liste / find )

Salut,

Mon script en faite créer le tableau seulement...étant donné que je n'est pas trouvé de moyen de trouver la position d'une lettre...par exemple si le message à coder c'est : "bonjour" et bien dans ce tableau je cherche le "b" donc ça position selon python c'est : 1(+1)=2 pour Polybe , donc ça sera sur la 2ème colonnes et pour la ligne par contre j'ai pas encore cherché à comment faire pour savoir...

@+


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#4 08-10-2009 22:53:14

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 991

Re : [Python] Carré de Polybe ( problème de liste / find )

OK,

Alors :

>>> liste=['D','E','A','F','B','C']
>>> liste.index('F')
3
>>>

N'oublie pas  que 3 c'est la 4e position puisqu'on commence à 0.

Voilà qui devrait résoudre ton problème.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#5 08-10-2009 22:57:00

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Carré de Polybe ( problème de liste / find )

Re,

A ok merci en effet ça resoud mon problème :)...!
Je n'était pas sur qu'il existait un équivalent pour les listes (j'ai chercher sur internet en vain...)

@+


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#6 08-10-2009 23:00:33

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 991

Re : [Python] Carré de Polybe ( problème de liste / find )

Additif :

En numérotant :
0 1 2 ..... 4
5............9
10.........14
15 16 17...19


etc...  Pour j (n) de ligne) de 0 à 5 et i de 0 à 4 (n° de colonne) , le nombre placé en ligne j et colonne i est :
5*j+i

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#7 09-10-2009 18:59:48

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 991

Re : [Python] Carré de Polybe ( problème de liste / find )

Re,

Et je complète encore.
Le nombre placé à l'intersection de la ligne j = 3 (la 4e) et de la colonne i = 2 (la 3e) est bien 5*3+2 = 17
Tu peux le constater sur le post précédent.
Réciproquement,, soit le nombre 23. Où est-il placé dans le tableau ?
23 = 5 * 4 + 3 (python --> 23/5 = 4 ; 23 % 5 = 3)
Ses coordonnées sont donc (i ; j) = (3 ; 4).

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#8 10-10-2009 18:59:22

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Carré de Polybe ( problème de liste / find )

Salut,

Bon apparemment ça ne marche pas avec les listes dans une liste...
Comment contourné ça ???
Pour ma part je pense qu'il faudrait créer 6 listes et qu'à chaque tour de boucle ça mette la liste de 5 lettres dans une liste différentes (mais je ne pense pas que ça soit la solution...ou alors tant qu'à faire ça pourquoi ne pas faire tout manuellement...)

Voici ce que j'ai fait...j'ai créer un liste normale pour faire la comparaison...:

carre=[]
ligne=[]
e=0
liste=["A","B","C"]
for j in range (6):
    for i in range(5):
        ligne.append(chr(65+e))
        e+=1
    carre.append(ligne)
    ligne=[]

print carre
print
print liste.index('A')
print carre.index('A')

Merci pour tes précédent message, ça va beaucoup m'aidé par la suite mais pour l'instant ça bloque ^^"

Merci d'avance pour une quelconque aide :)

@+

Dernière modification par Lutcho74 (10-10-2009 18:59:50)


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#9 10-10-2009 19:30:07

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 991

Re : [Python] Carré de Polybe ( problème de liste / find )

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

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#10 11-10-2009 11:12:59

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 991

Re : [Python] Carré de Polybe ( problème de liste / find )

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

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#11 11-10-2009 22:42:02

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Carré de Polybe ( problème de liste / find )

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.

@+

Dernière modification par Lutcho74 (11-10-2009 22:49:01)


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#12 11-10-2009 23:01:50

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 991

Re : [Python] Carré de Polybe ( problème de liste / find )

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

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#13 11-10-2009 23:08:45

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Carré de Polybe ( problème de liste / find )

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

Dernière modification par Lutcho74 (11-10-2009 23:09:30)


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#14 11-10-2009 23:18:46

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 991

Re : [Python] Carré de Polybe ( problème de liste / find )

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


Arx Tarpeia Capitoli proxima...

Hors ligne

#15 11-10-2009 23:26:59

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Carré de Polybe ( problème de liste / find )

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
@+


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#16 12-10-2009 23:00:33

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Carré de Polybe ( problème de liste / find )

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.

@+

Dernière modification par Lutcho74 (12-10-2009 23:00:51)


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#17 13-10-2009 09:38:38

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 991

Re : [Python] Carré de Polybe ( problème de liste / find )

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

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#18 13-10-2009 13:15:41

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Carré de Polybe ( problème de liste / find )

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.

@+


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#19 14-10-2009 23:08:29

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Carré de Polybe ( problème de liste / find )

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 ?

@+

Dernière modification par Lutcho74 (15-10-2009 14:49:30)


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#20 15-10-2009 19:31:37

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 991

Re : [Python] Carré de Polybe ( problème de liste / find )

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

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#21 15-10-2009 22:52:09

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Carré de Polybe ( problème de liste / find )

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


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

#22 16-10-2009 08:30:38

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 991

Re : [Python] Carré de Polybe ( problème de liste / find )

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

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#23 16-10-2009 18:36:48

Lutcho74
Membre
Lieu : Vitrolles
Inscription : 22-12-2008
Messages : 136
Site Web

Re : [Python] Carré de Polybe ( problème de liste / find )

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

@+

Dernière modification par Lutcho74 (16-10-2009 18:39:52)


La seule façon raisonnable de vivre en ce bas monde, c'est en dehors des règles.

Hors ligne

Réponse rapide

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)?
trente 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.

Pied de page des forums