Underc0de

Programación Scripting => Python => Mensaje iniciado por: Once en Enero 31, 2014, 03:52:38 AM

Título: [TPC-C] #1 Cifrado César
Publicado por: Once en Enero 31, 2014, 03:52:38 AM
The Python Challenges
N°1 Cifrado César
Criptografía


(http://upload.wikimedia.org/wikipedia/commons/2/2b/Caesar3.svg)

Objetivo:
Programar las funciones necesarias que permitan codificar y decodificar un mensaje usando el cifrado César teniendo en cuenta los siguientes aspectos:
   

       
  • La salida debe ser en minúsculas.
  • Se deben respetar los caracteres no alfabéticos.
  • No se tiene en cuenta la letra ñ.

La fecha máxima de entrega es para el Viernes 7 de Febrero. los códigos deben ser enviados por mp a los moderadores (11Sep (http://underc0de.org/foro/profile/11Sep) y WhiZ (http://underc0de.org/foro/profile/WhiZ/))
Sólo se acepta un código por participante.

Los criterios de evaluación son los mismos establecidos en este (http://underc0de.org/foro/python/the-python-challenges/) post


Enlaces de ayuda:
Cifrado César [es] (http://es.wikipedia.org/wiki/Cifrado_C%C3%A9sar)
Función ord() [en] (http://docs.python.org/2/library/functions.html#ord)
Función chr() [en] (http://docs.python.org/2/library/functions.html#chr)
Método lower() [en] (http://docs.python.org/2/library/stdtypes.html#str.lower)


Ganador:


Al momento de evaluar, se respetaron los criterios establecidos desde un principio, a saber:

    - Portablidad

    - Número de librerías utilizadas

    - Legibilidad (según las normativas establecidas por la PEP-8).

    - Eficacia:
        -> La salida debe ser en minúsculas
        -> Se deben respetar los caracteres no alfabéticos
        -> No se tiene en cuenta la letra ñ
        -> El (des)cifrado de los caracteres alfabéticos es correcto

Por cumplir con todos ellos (siendo el único en cumplir el último), el ganador es:

deni_celine


Nota:  Todas la dudas acerca de este reto van en este hilo.
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: deni_celine en Enero 31, 2014, 05:21:52 AM
me parecío super buena la iniciativa, llevo super poquito en el foro y así uno se motiva a participar y aprender :D A todo esto, alguna versión de python en específico, algo tarde la pregunta si, solo tengo la 2.7 en este pc  :)
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: 79137913 en Enero 31, 2014, 09:10:30 AM
HOLA!!!

Codigo enviado.

Código (python) [Seleccionar]
for x in-2,2:print" 3 1 9R7u3l1e9z7"[::x]

Estoy seguro que en legibilidad no les va a gustar, hay mucho golfing (reduccion de codigo).

GRACIAS POR LEER!!!
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: Once en Enero 31, 2014, 05:34:43 PM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
me parecío super buena la iniciativa, llevo super poquito en el foro y así uno se motiva a participar y aprender :D A todo esto, alguna versión de python en específico, algo tarde la pregunta si, solo tengo la 2.7 en este pc  :)

Genial, esa esa es la idea de los retos. Lo ideal sería usar Python 2.7.

Saludos!

CitarEstoy seguro que en legibilidad no les va a gustar, hay mucho golfing (reduccion de codigo).

Es verdad, pero la legibilidad no es lo único que cuenta.

Saludos!
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: KrossPock en Enero 31, 2014, 11:19:54 PM
Cuando se refiere a caracteres no alfabéticos, tienen que estar todos? Me refiero a los de la tabla extendida de ascii, todos esos simbolitos que solo sirven para hacer dibujos.

Como estos: Œ, œ, Š,š, Ÿ, †, ‡, etc. No se puede poner un rango de caracteres? por ejemplo todos los caracteres de valor decimal entre 32 y 126.

El que se respeten las mayusculas modifica en algo la calificacion? o es obligatorio que el texto sea devuelto en minusculas?
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: Once en Enero 31, 2014, 11:35:40 PM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Cuando se refiere a caracteres no alfabéticos, tienen que estar todos? Me refiero a los de la tabla extendida de ascii, todos esos simbolitos que solo sirven para hacer dibujos.

Como estos: Œ, œ, Š,š, Ÿ, †, ‡, etc. No se puede poner un rango de caracteres? por ejemplo todos los caracteres de valor decimal entre 32 y 126.

Claro, con caracteres no alfabéticos se refiere a los signos de puntuación y demás que se usan comunmente para escribir, no a los demás caracteres de la tablas ascii, así que puedes trabajar perfectamente en ese rango.

No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
El que se respeten las mayusculas modifica en algo la calificacion? o es obligatorio que el texto sea devuelto en minusculas?

Sip, es una condición (por lo tanto es obligatorio) que el resultado sea en minúsculas. Si tienes algún problema mira en los enlaces de ayuda o simplemente pregunta.

Saludos!
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: KrossPock en Febrero 01, 2014, 12:15:22 AM
Otra pregunta, el espacio se respeta no?, osea no hay que cifrarlo.

Programo hace dos dias en python, y solo se hacer programacion estructurada, pero veamos que sale jaja
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: Once en Febrero 01, 2014, 12:19:18 AM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Otra pregunta, el espacio se respeta no?, osea no hay que cifrarlo.

Programo hace dos dias en python, y solo se hacer programacion estructurada, pero veamos que sale jaja

Claro, los espacios se respetan también :P

Si no logras codear las funciones (aunque en Python no es difícil) no hay problema con que nos envíes dos scripts, uno para cifrar y el otro para descifrar.

Saludos!
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: KrossPock en Febrero 01, 2014, 12:52:04 AM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Otra pregunta, el espacio se respeta no?, osea no hay que cifrarlo.

Programo hace dos dias en python, y solo se hacer programacion estructurada, pero veamos que sale jaja

Claro, los espacios se respetan también :P

Si no logras codear las funciones (aunque en Python no es difícil) no hay problema con que nos envíes dos scripts, uno para cifrar y el otro para descifrar.

Saludos!

No, ese no es el problema, si miras el post  de abajo, es uno mio con justamente mi primer script que es un cifrador cesar jajaja. Pero usa otro metodo, y unicamente cifra numeros y letras, asi que me puse a codear ahora otra funcion con el metodo de la suma con la funcion ord().

Otra pregunta: La devolucion del texto cifrado puede contener mayusculas? Osea digamos que cifro [email protected] y me devuelve dvgCdvg1frp esa C que esta en negrita, esta permitida? o el texto cifrado tambien tiene que estar en minusculas?
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: Once en Febrero 01, 2014, 01:13:56 AM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Otra pregunta: La devolucion del texto cifrado puede contener mayusculas? Osea digamos que cifro [email protected] y me devuelve dvgCdvg1frp esa C que esta en negrita, esta permitida? o el texto cifrado tambien tiene que estar en minusculas?

Nop, esa C no está permitida, la salida deberia ser: [email protected] (la @ y el . no se modifican, pero el resto sí) la salida debe ser en minúsculas pero la entrada puede ser de cualquier tipo. [email protected] y [email protected] deben dar la misma salida: [email protected]

Saludos!
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: KrossPock en Febrero 01, 2014, 01:35:00 AM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Otra pregunta: La devolucion del texto cifrado puede contener mayusculas? Osea digamos que cifro [email protected] y me devuelve dvgCdvg1frp esa C que esta en negrita, esta permitida? o el texto cifrado tambien tiene que estar en minusculas?

Nop, esa C no está permitida, la salida deberia ser: [email protected] (la @ y el . no se modifican, pero el resto sí) la salida debe ser en minúsculas pero la entrada puede ser de cualquier tipo. [email protected] y [email protected] deben dar la misma salida: [email protected]

Saludos!

Recien me doy cuenta que lei mal las reglas, pense que los caracteres no alfabeticos tenian que ser cifrados tambien, y lo peor de todo es que me doy cuenta de esto cuando ya termine la funcion... Igual hago un par de retoques y se soluciona.

Eso quiere decir que este codigo que habia hecho se adapta a las reglas, solo que es sensible a mayusculas jaja:

Código (python) [Seleccionar]

#!/usr/bin/python

import sys

def help():
        print """
#################################
#       [Des]Cifrador Cesar     #
#       version 1.0             #
#       by Krosspock            #
#################################

uso: -[c|d] -n [num] -t 'texto entre comillas'

-c      Cifrar cadena
-d      Descifrar cadena
-n      Numero de desplazamientos
-t      Texto a cifrar / descifrar
-h      Muestra esto

"""
        sys.exit()

def cesar(cd, n, t):

        abc =                           ('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','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','0','1','2','3','4','5','6','7','8','9')
        i = 0
        ia = 0
        resultado = ''
        n = int(n)

        while (i <= len(abc) - 1):
       
                if (txt[ia] == abc[i]):
                        if (cd == 'd'):
                                resultado = resultado + abc[i-n]
                        else:
                                resultado = resultado + abc[i+n]
                        ia = ia + 1
                        if (ia == len(txt)):
                                return resultado
                        i = 0
                else:
                        i = i + 1
                        if (i == len(abc) - 1):
                                resultado = resultado + txt[ia]
                                ia = ia + 1
                                if (ia == len(txt)):
                                        return resultado
                                i = 0

if (len(sys.argv) <= 1):
        print """
#################################
#       [Des]Cifrador Cesar     #
#       version 1.0             #
#       by Krosspock            #
#################################

uso: -[c|d] -n [num] -t 'texto entre comillas'

-c      Cifrar cadena
-d      Descifrar cadena
-n      Numero de desplazamientos
-t      Texto a cifrar / descifrar
-h      Muestra esto

"""
        sys.exit()

i = 1
n = 0
txt = ''

while (i < len(sys.argv)):
        if (sys.argv[i] == '-h'):
                help()
        elif (sys.argv[i] == '-c'):
                q = 'c'
        elif (sys.argv[i] == '-d'):
                q = 'd'
        elif (sys.argv[i] == '-n'):
                num = sys.argv[i+1]
                i = i + 1
        elif (sys.argv[i] == '-t'):
                txt = sys.argv[i+1]
                i = i + 1
        else:
                print 'Error! los parametros usados no son correctos, escribe -h para ayuda'
        i = i + 1

print cesar(q,num,txt)


Igual voy a prensentar el otro con las sumas de la tabla ascii, me parece que es mas eficiente

Edit: Ahora que lo veo bien, la funcion que puse mas arriba tiene una falla, jajaj no es bueno programar un sabado a las 2 de la mañana gente (?
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: KrossPock en Febrero 01, 2014, 11:27:42 AM
Tanto en la linea 4, como en la 11, del segundo codigo me parece que te confundiste:

Código (python) [Seleccionar]
encode += chr((lambda x, y: ord(x) + y)(i, 2))

Al final me parece que tiene que ir (i,n) no (i,2)
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: Sanko en Febrero 01, 2014, 11:31:29 AM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Tanto en la linea 4, como en la 11, del segundo codigo me parece que te confundiste:

Código (python) [Seleccionar]
encode += chr((lambda x, y: ord(x) + y)(i, 2))

Al final me parece que tiene que ir (i,n) no (i,2)

Sip :D las prisas, gracias por avisar ya edito
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: Once en Febrero 01, 2014, 02:31:46 PM
Creo que está clalro que es un reto y los códigos NO se publican. A KrossPock no se le descalifica simplemente porque el código está publicado en foro desde antes del inicio del reto.

Saludos!
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: deni_celine en Febrero 01, 2014, 04:53:47 PM
Jajaja sip eso me parecía raro que los publicaran. Puedo enviar una version 0.2 ? Mis funcipnes estan bien pero el resto del código q envíe apesta xd
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: Once en Febrero 01, 2014, 05:28:46 PM
No tienes permitido ver enlaces. Registrate o Entra a tu cuenta
Jajaja sip eso me parecía raro que los publicaran. Puedo enviar una version 0.2 ? Mis funcipnes estan bien pero el resto del código q envíe apesta xd

Claro, pero ten en cuenta que el código que evaluamos es el último que nos envíen (Pero no abusen de nosotros :p).

PD: Espero se estén divirtiendo porque se vienen un par de sorpresas.

Saludos!
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: Sanko en Febrero 02, 2014, 07:55:33 AM
Enviado entonces
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: WhiZ en Febrero 08, 2014, 05:20:03 PM
Publicación de códigos

11Sep
Código (python) [Seleccionar]
def lst(byte, add):
    if "a" <= byte <= "z":
        return chr(((ord(byte) + (-97 + add)) % 26) + 97)
    else:
        return byte

print "".join((lst(x, 3) for x in "underc0de".lower()))  # Cifrar
print "".join((lst(x, -3) for x in "underc0de".lower())) # Descifrar


WhiZ
Código (python) [Seleccionar]
#/usr/bin/env python
# -*- encoding: utf8 -*-

class Cesar(object):

    def chequear(self, texto, desplazamiento):
        texto = str(texto).lower()

        try:
            desplazamiento = int(desplazamiento)

            if desplazamiento < 0:
                deplazamiento = -(desplazamiento)

            while desplazamiento > 25:
                desplazamiento -= 26

            return (texto, desplazamiento)

        except ValueError:
            print "desplazamiento debe ser un entero"
            exit()

    def cifrar(self, texto, desplazamiento=3):

        texto, desplazamiento = self.chequear(texto, desplazamiento)

        cifrado = ""

        for letra in texto:
            valor = ord(letra)

            if 97 <= valor <= 122:
                valorDesplazado = valor + desplazamiento

                if valorDesplazado > 122:
                    valorDesplazado -= 26

                letraDesplazada = chr(valorDesplazado)

                cifrado = cifrado + letraDesplazada

            else:
                cifrado = cifrado + letra

        return cifrado

    def descifrar(self, texto, desplazamiento=3):

        texto, desplazamiento = self.chequear(texto, desplazamiento)

        descifrado = ""

        for letra in texto:
            valor = ord(letra)

            if 97 <= valor <= 122:
                valorDesplazado = valor - desplazamiento

                if valorDesplazado < 97:
                    valorDesplazado += 26

                letraDesplazada = chr(valorDesplazado)

                descifrado = descifrado + letraDesplazada

            else:
                descifrado = descifrado + letra

        return descifrado


sacra

Código (python) [Seleccionar]
#Título:    Script encode,decode python
#Versión:    beta1
#Autor:    Saqra
#Estado:    Activo
#Tipo:    Proceso
#Creado:    03/02/2014
def datos(data):
    lista=[]
    dicc={1:'A',2:'B',3:'C',4:'D',5:'E',6:'F',7:'G',8:'H',9:'I',10:'J',11:'K',12:'L',13:'M',14:'N',15:'O',16:'P',17:'Q',18:'R',19:'S',20:'T',21:'U',22:'V',23:'W',24:'X',25:'Y',26:'Z'}
    for i in data:
        for j in dicc.keys():
            if(i==dicc[j]):
                lista.append(j)       
    return lista   



def codificar(p,n):
    l=datos(p)
    l1=[i+n for i in l]
    l2=[i%26 for i in l1]
    dicc={1:'A',2:'B',3:'C',4:'D',5:'E',6:'F',7:'G',8:'H',9:'I',10:'J',11:'K',12:'L',13:'M',14:'N',15:'O',16:'P',17:'Q',18:'R',19:'S',20:'T',21:'U',22:'V',23:'W',24:'X',25:'Y',26:'Z'}
    nueva_palabra=''
    for j in l2:
        for h in dicc.keys():
            if(j==h):
                nueva_palabra=nueva_palabra+dicc[h]
    return nueva_palabra.lower()
   
def decodificar(p,n):
    l=datos(p)
    l1=[i-n for i in l]
    l2=[i%26 for i in l1]
    dicc={1:'A',2:'B',3:'C',4:'D',5:'E',6:'F',7:'G',8:'H',9:'I',10:'J',11:'K',12:'L',13:'M',14:'N',15:'O',16:'P',17:'Q',18:'R',19:'S',20:'T',21:'U',22:'V',23:'W',24:'X',25:'Y',26:'Z'}
    nueva_palabra=''
    for j in l2:
        for h in dicc.keys():
            if(j==h):
                nueva_palabra=nueva_palabra+dicc[h]
    return nueva_palabra.lower()



print 'opcion 1 codificar'
print 'opcion 2 decodificar'
opcion=raw_input("ingrese opcion :")
palabra=raw_input("ingrese palabra:")
nro=raw_input("ingrese numero de saltos:")
palabra2=palabra.upper()
if(int(opcion)==1):
    print codificar(palabra2,int(nro))
if(int(opcion)==2):
    print decodificar(palabra2,int(nro))


Sanko

Código (python) [Seleccionar]
#Params: | x -> texto a cifrar o descifrar | y -> desplazamiento | z -> 1 = cifrar, otro valor = decode
print "".join((lambda x, y, z: [chr(ord(a) + y % 255) if z == 1 else chr(ord(a) - y % 255) for a in x.lower()])('sanko', 2, 1))


deni_celine

Código (python) [Seleccionar]
#!/usr/bin/python

titulo="""
************************************
* CifradoCEsar by deni_celine, yo  *
* para TPC-1 del foro underc0de :D *
************************************
"""

# Clase con las funciones
class Cesar:
  '''Cifrado Cesar, tambien conocido como cifrado por dsplazamiento'''
 
  desplaza = 3 

  def __init__(self,valor=3):
    self.desplaza = valor

  def cifrar(self,clave):
    '''Retorna un mensaje cifrado'''
    return ''.join([(chr(ord(c)+self.desplaza) if (ord(c)+self.desplaza)<122 else chr(ord(c)-26+self.desplaza)) if (ord(c)>96 and ord(c)<123) else chr(ord(c)) for c in clave.lower()])

  def descifrar(self,clave):
    '''Retorna el mensaje original'''
    return ''.join([(chr(ord(c)-self.desplaza) if (ord(c)-self.desplaza)>96 else chr(ord(c)+26-self.desplaza)) if (ord(c)>96 and ord(c)<123) else chr(ord(c)) for c in clave.lower()])

  def test(self,clave):
    '''Probar el funcionamiento de la clase'''
    cifrado = cesar.cifrar(clave)
    print "Msj cifrado :",cifrado
    print "Descifrado  :",cesar.descifrar(cifrado)


# Ejemplo de uso

print(titulo)
valor = raw_input("Setea el valor de desplazamiento [default=3] : ")
if(valor==""):
  valor = 3
else:
  try:
    valor = int(valor)
  except:
    print "Valor no vAlido, se usara el desplazamiento por defecto"
    valor = 3

cesar = Cesar(valor)

while (1):
  print("""
Menu
------
1 - cifrar mensaje
2 - descifrar
3 - mensaje de prueba

x - salir

""")
  opc = raw_input("Opc:")

  if (opc=="1"):
    mensaje = raw_input("Escribe tu mensaje:")
    print "Msj cifrado :",cesar.cifrar(mensaje)
  elif (opc=="2"):
    cifrado = raw_input("Escribe el mensaje a descifrar:")
    print "Descifrado  :",cesar.descifrar(cifrado)
  elif (opc=="3"):
    cesar.test("Este ez un mensaje de prueb@ Mnopq! aze xyz abc 15 9>")
  elif (opc.lower()=="x"):
    print "bye ;)"
    exit()
  else:
    print "opc no vAlida"

  pausa = raw_input("presiona ENTER para continuar")


79137913

Código (python) [Seleccionar]
def caesar(a,b):
e=""
for c in a.lower():
  d=ord(c)
  if d<97or d>122:e=e+c
  else:
   d=d+b
   if d>122:d=d-26
   e=e+chr(d)
return e
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: WhiZ en Febrero 08, 2014, 05:41:16 PM
Felicitaciones al ganador! Excelente trabajo el resto de los participantes!

Sigan así que en breve vendremos con más retos de The Python Challenges!

Saludos!
WhiZ
Título: Re:[TPC-C] #1 Cifrado César
Publicado por: deni_celine en Febrero 08, 2014, 08:21:03 PM
Wii gane este  ;D mas tarde vere los demas code para robar ideas jejej