Québec-Python


La solution du puzzle d'encryption

Par Bernard Chhun le dim 23 février 2014

Bonjour les pythonistas !

Nicolas Vanheuverzwijn a su relevé notre défi avec brio et rien de moins qu'en python 3 !

Rappelons-nous les détails du défi:

La chaîne de caractère à décoder

encoded = "So11025Mc6084So10404Nl12321Lo4096So12769Lo13689Lo40401So9604Sm10201So9801Cn12544Lo14641Lo13456Sm10816Lo6241So12100Cn2116Mn2304So12996Sm10609"

La réponse

decoded = u"iNfo@quÉbecpythOn.0rg"

Les indices et leurs significations

  • Ce qui abreuve Yggdrasil => Les racines de l'arbre légendaire pour suggérer l'utilisation de l'opération mathématique du même nom.
  • Son ode est unique => Répétez ode unique plusieurs fois et cela sonnera comme unicode
  • L'utilisation des regex n'est pas nécessairement conseillé => Pour vous mener sur une autre piste de solution...

La solution de Nicolas

#!/usr/bin/python3.2

import re
import math
import unicodedata

def decode(value):
    output = ""
    matches = re.findall("([a-zA-Z]{2})([0-9]+)", value)
    for match in matches:
        unicode_code_point = math.sqrt(float(match[1]))
        output += chr(int(unicode_code_point))
    return output

def encode(value):
    output = ""
    for c in value:
        c2 = ord(c)*ord(c)
        output += unicodedata.category(chr(c2)) + str(c2)
    return output

Notre solution en python 2.7

#!/usr/bin/python2.7
#coding: utf-8

import unicodedata, re, math

def qcpy_decoder(encoded):
    decoded = []

    regex = re.compile("\w{2}(\d+)")
    chars = regex.findall(encoded)

    for char in chars:
        new_char_number = int(math.sqrt(float(char)))
        new_char = unichr(new_char_number).encode('utf-8', 'replace')
        decoded.append(new_char)

    return "".join(decoded)

def qcpy_encoder(decoded):
    encoded = []

    for letter in unicode(decoded):
        number = ord(letter) ** 2
        unic = unichr(number)
        encoded.append(unicodedata.category(unic) + str(number))

    return "".join(encoded)

Merci à tout ceux qui ont pris le temps de participer au petit défi.

L'équipe de Québec-Python