Journal ROT13v2 en Python

Posté par .
Tags : aucun
0
11
déc.
2004
Voilà alors j'ai eu l'idée, rot13 marchant que sur les caractères, il fallait donc encrypter les caractères, alors très simple puisque 13+13=26 donc A + 26 = N + 26 (voilà comment marche rot13), il suffit de faire 1 + 5 = 6 + 5 (en gros hein, parce qu'ensuite on fout un modulo).

Du coup ROT13v2 donne : EBG68i7

Alors voilà l'implémentation en python, version masterisée et remixée de http://www.miranda.org/~jkominek/rot13/python/rot13.py(...)

-8<--------------------------------------------------------------------------------------
#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

def rot13(chaine):
result = ""
for x in range(len(chaine)):
byte = ord(chaine[x])
cap = (byte & 32)
byte = (byte & (~cap))
if (chaine[x] == ' '):
result = result + ' '
elif (byte >= ord('A')) and (byte <= ord('Z')):
byte = ((byte - ord('A') + 13) % 26 + ord('A'))
byte = (byte | cap)
result = result + chr(byte)
elif (byte >= 16) and (byte <= 25):
byte = ((byte - 16 + 5) % 10 + 16)
byte = (byte | cap)
result = result + chr(byte)
else:
result = result + chr(byte | cap)

return result
print "ROT13 DECODER/ENCODER"
print
text = raw_input("Type your text : ")
print "The result : " + rot13(text)
-8<--------------------------------------------------------------------------------------

En espérant que les geeks aimeront :)
  • # oupppsss

    Posté par . Évalué à 3.

    Voilà alors j'ai eu l'idée, rot13 marchant que sur les caractères, il fallait donc encrypter les caractères, alors très simple puisque 13+13=26 donc A + 26 = N + 26 (voilà comment marche rot13), il suffit de faire 1 + 5 = 6 + 5 (en gros hein, parce qu'ensuite on fout un modulo).

    A remplacer par chiffres
  • # A little bit more pythonic version

    Posté par . Évalué à 9.

    Il me semble...
    def rot13_v2_1(c):
        C = c.upper()
        d = ord(c)-ord(C)
        if 'A' <= C <= 'Z':
            return chr(((ord(C) - ord('A') + 13) % 26 + ord('A')) + d)
        elif '0'<=C <='9':
            return chr(((ord(C) - ord('0') + 5) % 10 + ord('0')))
        else:
            return c
    def rot13_v2(chaine):
        return "".join( map(rot13_v2_1, chaine) )
    
    if __name__=="__main__":
        print "ROT13 DECODER/ENCODER"
        print
        text = raw_input("Type your text : ")
        print "The result : " + rot13_v2(text)
    
    • [^] # Re: A little bit more pythonic version

      Posté par . Évalué à 0.

      C'est vrai, seulement j'ai codé ça à l'arrache, juste pour montrer les capacités de python à quelqu'un a qui j'apprend python.

      Merci, ça permet d'alléger et d'accélerer le code :)
  • # Allez je vous écrase tous ;-)

    Posté par (page perso) . Évalué à 4.

    >>> import codecs
    >>> rot13 = codecs.getencoder('rot13')

    >>> rot13('Deux lignes de code seulement ! ;-)')[0]
    'Qrhk yvtarf qr pbqr frhyrzrag ! ;-)'
    • [^] # Re: Allez je vous écrase tous ;-)

      Posté par . Évalué à 2.

      oui, mais non. Le monsieur a dit rot13v2, qui pourrait être quelque chose comme ça:


      >>> def rot13v2(chaine) :
      ... import codecs
      ... import string
      ... rot13=codecs.getencoder('rot13')
      ... return rot13(chaine)[0].translate(string.maketrans("","").replace("0123456789","5678901234"))
      ...
      >>> rot13v2("ROT13v2")
      'EBG68i7'


      Je suppose que c'est mieux de définir son propre codec, mais franchement j'ai la flemme ...

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.