Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 26-01-2013 16:00:12
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
[Python] Codage par Système Monôme-Binôme
Bonjour,
Suite à la discussion ouverte par Basile2 http://www.bibmath.net/forums/viewtopic.php?id=5806, je me suis penché sur le système de codage dit "Monôme-Binôme". Dans ce système, chaque lettre du texte d'origine est codé tantôt par un nombre à un seul chiffre tantôt par un nombre à deux chiffres, selon son emplacement dans une grille qu'on doit établir avant.
C'est une variante du "carré de Polybe", quoiqu'ici la grille soit rectangulaire de 3 lignes sur 10 colonnes.
On laisse une ligne sans coordonnée : les lettres présentes sur cette ligne seront codées sur un seul chiffre et on affecte une valeur aux deux suivantes : dans mon exemple, 7 et 4. Les lettres figurant sur ces deux lignes seront codées sur deux chiffres : n° ligne*10+n° colonne.
On laisse vides les 2 colonnes de la première ligne dont les nos sont ceux des 2e et 3e ligne. J'ai choisi de coder les espaces en les remplaçant préalablement par _ pour une meilleure visibilité visibilité.
Sans clé.
#!/usr/bin/env python
# -*- coding: Latin-1 -*-
from textwrap import wrap
def prepare(PhraseDepart):
li1=["âà","éèêë","îï","ô","ûü","ç"]
li2=["A","E","I","O","U","C"]
# Remplacement des caractères accentués éventuels
for i,mot in enumerate(li1):
repl=li2[i]
for lettre in mot:
PhraseDepart=PhraseDepart.replace(lettre,repl)
for lettre in ",.": # Suppression de la ponctuation
PhraseDepart=PhraseDepart.replace(lettre,"")
raseDepart=PhraseDepart.replace("'",' ').replace(" "," ") #remplace l'apostrophe par une espace et 2 espaces par sune eule
PhraseDepart=PhraseDepart.replace(" ",'_').upper() # Passage en majuscules
return PhraseDepart
def place_cle(cle,alpha):
texte=wrap(cle,1)
Clef=""
for lt in texte:
if lt in Clef:
pass
else:
Clef+=lt
for lt in Clef:
del alpha[alpha.index(lt)]
alpha=wrap(Clef,1)+alpha
return alpha
########################################
lignes=74
Cle = ""
Phrase="Dans tous les cas donc, ouvrez donc une nouvelle discussion \
pour votre question : cliquez pour cela sur Nouvelle discussion \
en haut et à droite de la page ' accueil du Forum concerné."
########################################
Clef=""
Phrase=prepare(Phrase)
code,grille,ch_l,cr="",[],[None,lignes//10,lignes%10],0
alpha=[chr(65+i) for i in range(26)]
alpha.append("_")
if Cle<>"":
alpha=place_cle(Cle,alpha)
# Constitution de la grille
for i in range(30):
if i==ch_l[1] or i==ch_l[2] or i>28:
lt=" "
cr+=(i==ch_l[1]or i==ch_l[2])
else:
lt=alpha[i-cr]
grille.append(lt)
# Affichage de la grille : le _ remplace l'espace (plus visible)
print " Grille de codage"
print
print " 0 1 2 3 4 5 6 7 8 9"
for j in range(3):
if j==0:
print " ",
for i in range(10):
print grille[10*j+i],
print
else:
print " "+str(ch_l[j])+" ",
for i in range(10):
print grille[10*j+i],
print
print
# Codage du texte
for lt in Phrase:
i=grille.index(lt)
if i<10:
code+=str(i)
else:
code+=str(ch_l[i//10]*10+i%10)
# Affichage formaté par groupe de 5 chiffres
print "Résultat :"
print
code_sortie=wrap(code,5)
for i,elem in enumerate(code_sortie):
if i %13 ==0 and i>0:
print
print elem,
Sortie :
Grille de codage
0 1 2 3 4 5 6 7 8 9
A B C D E F G H
7 I J K L M N O P Q R
4 S T U V W X Y Z _
Résultat :
30754 04841 76424 04873 54048 20404 83767 52487 64243 79547 48376 75248 42755
48757 64243 57373 54837 04024 24040 70767 54877 76427 94843 76417 95487 84254
04170 76754 82737 07842 54748 77764 27948 25730 48404 27948 75764 24357 37354
83704 02424 04070 76754 85754 89042 41485 41480 48379 76704 15483 54873 04877
08548 34802 24257 07348 34248 67679 42744 82767 52579 755
Avec clé.
On supprime les lettres en double, triple... de la clé, et on place la clé ainsi traitée en tête de la grille, puis on la complète par le reste de l'alphabet.
Avec Cle="DISCUSSION" , on obtient :
Grille de codage
0 1 2 3 4 5 6 7 8 9
D I S C U O N A
7 B E F G H J K L M P
4 Q R T V W X Y Z _Résultat :
09824 84265 24877 71248 39248 06834 86543 41714 74806 83485 87148 86543 71777
77148 01235 22168 48796 54148 43642 41714 84057 12421 68483 77140 57147 48796
54148 37177 94825 41488 65437 17777 71480 12352 21684 87184 87495 42487 14248
94804 16142 71480 71487 79487 99737 14804 89335 71177 48054 87264 15784 83683
71418 71
@+
Hors ligne







