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/) postEnlaces 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_celineNota: Todas la dudas acerca de este reto van en este hilo.
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 :)
HOLA!!!
Codigo enviado.
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!!!
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!
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 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!
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 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 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 dvg
Cdvg1frp esa C que esta en negrita, esta permitida? o el texto cifrado tambien tiene que estar en minusculas?
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!
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:
#!/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 (?
Tanto en la linea 4, como en la 11, del segundo codigo me parece que te confundiste:
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 enlaces.
Registrate o Entra a tu cuenta
Tanto en la linea 4, como en la 11, del segundo codigo me parece que te confundiste:
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
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!
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 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!
Enviado entonces
Publicación de códigos
11Sepdef 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#/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#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#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#!/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")
79137913def 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