[TPC-C] #1 Cifrado César

Iniciado por Once, Enero 31, 2014, 03:52:38 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Enero 31, 2014, 03:52:38 AM Ultima modificación: Febrero 08, 2014, 05:38:35 PM por WhiZ
The Python Challenges
N°1 Cifrado César
Criptografía




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 (No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)
Sólo se acepta un código por participante.

Los criterios de evaluación son los mismos establecidos en No tienes permitido ver los links. Registrarse o Entrar a mi cuenta post


Enlaces de ayuda:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


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.







No tienes permitido ver los links. Registrarse o Entrar a mi 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  :)

Enero 31, 2014, 09:10:30 AM #2 Ultima modificación: Enero 31, 2014, 09:21:27 AM por 79137913
HOLA!!!

Codigo enviado.

Código: python
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!!!
"Algunos creen que soy un bot, puede que tengan razon"
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

*Shadow Scouts Team*                                                No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi 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!







No tienes permitido ver los links. Registrarse o Entrar a mi 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.

El que se respeten las mayusculas modifica en algo la calificacion? o es obligatorio que el texto sea devuelto en minusculas?

No tienes permitido ver los links. Registrarse o Entrar a mi 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 los links. Registrarse o Entrar a mi 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!







No tienes permitido ver los links. Registrarse o Entrar a mi 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

No tienes permitido ver los links. Registrarse o Entrar a mi 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 tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi 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 No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y me devuelve dvgCdvg1frp esa C que esta en negrita, esta permitida? o el texto cifrado tambien tiene que estar en minusculas?

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Otra pregunta: La devolucion del texto cifrado puede contener mayusculas? Osea digamos que cifro No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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. No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y No tienes permitido ver los links. Registrarse o Entrar a mi cuenta deben dar la misma salida: [email protected]

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Febrero 01, 2014, 01:35:00 AM #10 Ultima modificación: Febrero 01, 2014, 01:39:51 AM por KrossPock
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Otra pregunta: La devolucion del texto cifrado puede contener mayusculas? Osea digamos que cifro No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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. No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 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

#!/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 (?

Febrero 01, 2014, 11:27:42 AM #11 Ultima modificación: Febrero 01, 2014, 11:30:13 AM por KrossPock
Tanto en la linea 4, como en la 11, del segundo codigo me parece que te confundiste:

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


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

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Tanto en la linea 4, como en la 11, del segundo codigo me parece que te confundiste:

Código: python
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
Sigueme en Twitter : @Sankosk
Estos nuevos staff no tienen puta idea XD

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!







No tienes permitido ver los links. Registrarse o Entrar a mi 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

No tienes permitido ver los links. Registrarse o Entrar a mi 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!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Enviado entonces
Sigueme en Twitter : @Sankosk
Estos nuevos staff no tienen puta idea XD

Febrero 08, 2014, 05:20:03 PM #17 Ultima modificación: Febrero 08, 2014, 05:40:35 PM por WhiZ
Publicación de códigos

11Sep
Código: python
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
#/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
#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
#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
#!/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
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


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


Wii gane este  ;D mas tarde vere los demas code para robar ideas jejej