The Python Challenges
el regreso
Reto #1: phonewords
(http://www.geeksforgeeks.org/wp-content/uploads/phoneKeyboard.png)
La idea de este reto es implementar un script que reciba un string y sea capaz de convertir cada caracter del string a su respectivo número en el teclado de un teléfono.Consideraciones
- Si en el string hay un caracter que no representa una letra debe ser ignorado
- Los espacios se deben conservar
- El string que recibirá la función puede contener letras tano en mayúsculas como en minúsculas
Ejemplos
codificar("Underc0de.org") - > 86337233674
codificar("Esto es una prueba") -> 3786 37 862 774322
Reglas
- TODAS las dudas preguntarlas en este mismo post, bajo ninguna circunstancia se resuelven dudas por privado/mp.
- LA solución debe estar escrita en Pytohn 3.*
- Seguir en la medida de lo posible las PEP8.
- La elegancia de la solución otorga puntos extra.
- Cumplir con la plantilla. (Importante puesto que la calificación la realiza un script automáticamente)
Este reto lo gana el script más rápido
Plantilla
def codificar(mensaje):
return None
Enviar la solución por mp a @Once con el asunto: "[TPC-R] Reto #1". El reto cerrará el domingo a las 23:59 horas. Hora Colombiana.
Saludos!
Soluciones de los participantes (en orden de llegada):
@n1sendev (https://underc0de.org/foro/index.php?action=profile;u=68000)#Script hecho para el reto: [TPC-R] Reto #1: Phonewords. Underc0de.org
#Hecho por n1sendev, año 2017
def codificar(string):
alfa_num = {'A':'2', 'B':'22', 'C':'222', 'D':'3', 'E':'33',
'F':'333', 'G':'4', 'H':'44', 'I':'444', 'J':'5', 'K':'55', 'L':'555',
'M':'6','N':'66', 'O':'666', 'P':'7', 'Q':'77', 'R':'777', 'S':'7777',
'T':'8', 'U':'88', 'V':'888', 'W':'9', 'X':'99', 'Y':'999', 'Z':'9999',
' ':' '}
with open("codificado.txt", 'w') as archivo:
archivo.write("Inicio mensaje Codificado:\n")
archivo.write("==============================\n")
for char in string:
for alfa in alfa_num:
if char == alfa:
codi = alfa_num[char]
archivo.write(codi)
else:
pass
archivo.write("\n==============================\n")
archivo.write("Fin mensaje codificado")
print('\nSe ha guardado el texto codificado en el archivo "codificado.txt"')
return None
def main():
string_org = input("Introduce una cadena para codificar: ")
codificar(string_org.upper())
if __name__ == '__main__':
main()
Observaciones: Primero, el reto no cumple con la plantilla y segundo, @n1sendev entendió mal el reto y el código no hace lo que se pide.
@cr4id3r
import re
CONVERSION_DICT = {
'1': '',
'2': 'ABC',
'3': 'DEF',
'4': 'GHI',
'5': 'JKL',
'6': 'MNO',
'7': 'PQRS',
'8': 'TUV',
'9': 'WXYZ',
}
def codificar(mensaje):
if mensaje:
string_to_return = re.sub('[^A-Z| ]', '', mensaje.upper())
for conversion_key, conversion_value in CONVERSION_DICT.items():
if conversion_value:
replace_pattern = '[' + '|'.join([letter for letter in conversion_value]) + ']'
string_to_return = re.sub(replace_pattern, conversion_key, string_to_return)
return string_to_return
else:
print("Need a string to convert")
if __name__ == '__main__':
desired_conversion = input('Introduce el string: ')
print(codificar(desired_conversion))
Observaciones: Usa ocho espacios como identación, no cumple con las PEP8
@po6xsecpo
pad = {
"a":2,"d":3,"g":4,"j":5,"m":6,"p":7,"s":7,"v":8,
"b":2,"e":3,"h":4,"k":5,"n":6,"q":7,"t":8,"w":9,
"c":2,"f":3,"i":4,"l":5,"o":6,"r":7,"u":8,"x":9,
"y":9,"x":9}
def codificar(mensaje):
converted = list()
for c in mensaje:
try:
converted.append(pad[c.lower()])
except:
if(c==" "):converted.append(c)
converted =''.join([str(c) for c in converted])
Observaciones: No cumple con la plantilla. Olvidó retornar el valor
@larry852
def codificar(mensaje):
letras = '--abc-def-ghi-jkl-mno-pqrs-tuv-wxyz'
teclado = letras.split('-')
respuesta = ''
for letra in mensaje:
for index, tecla in enumerate(teclado):
if letra == ' ':
respuesta += ' '
break
elif tecla is not None and letra.lower() in tecla:
respuesta += str(index)
break
return respuesta
print("Underc0de.org --> " + codificar("Underc0de.org"))
print("$$$$$$Underc0de.org$$$$$$ --> " + codificar("$$$$$$Underc0de.org$$$$$$"))
print("Esto es una prueba --> " + codificar("Esto es una prueba"))
Observaciones: N/A
Puntaje
Señores, ya los scripts están evaluados, no los publico ahora mismo porque aún me falta contar con los bonos y las penalizaciones. Lo que les puedo decir es que se realizaron seis pruebas para verificar que los scripts cumplieran los requisitos, cada una de estas pruebas se corrió 100 veces, se midió el tiempo de ejecución y se tomó el promedio.
Una vez calculado el promedio de ejecución, el puntaje para la prueba se calculó usando la función: e^(-t) donde t es el promedio de ejecución del script.
Saludos!
REsultados
Bueno señores, estás son las pruebas, lastimosamente
@n1sendev (https://underc0de.org/foro/index.php?action=profile;u=68000) no pasó ninguna
(https://imgur.com/2f7LbECl.png)
Lástimosamente para este reto hubo penalizaciones:
@Cr4id3r (https://underc0de.org/foro/index.php?action=profile;u=29249) por usar identaciones a ocho espacios
0.0005 s@po6xsecpo (https://underc0de.org/foro/index.php?action=profile;u=37409) por no cumplir con la plantilla:
0.0005 sLos puntos por elegancia en la solución se los llevó:
@larry852 (https://underc0de.org/foro/index.php?action=profile;u=50833) 0.0005 sAl final, la ecuación para calcular el puntaje es: e^-(t-bonificacion+penalizacion)
Los resultados entonces son:
(https://imgur.com/9YIvitul.png)
Ganados
@larry852 (https://underc0de.org/foro/index.php?action=profile;u=50833)
Estad pendientes, el
miércoles sale otroo reto, esta vez una más clásico.
Saludos!
Felicidades tanto a los participantes, como al ganador, y al staff :)
que acaban de ver mis ojos!! :D :D
¿cada cuánto tiempo salen estos retos?
recién acabo de verlo y la verdad que interesantes si están ;D
No tienes permitido ver enlaces.
Registrate o Entra a tu cuenta
que acaban de ver mis ojos!! :D :D
¿cada cuánto tiempo salen estos retos?
recién acabo de verlo y la verdad que interesantes si están ;D
Hola
@BlueNet (https://underc0de.org/foro/index.php?action=profile;u=63096), la idea es que salgan dos por semana, los
miércoles unos retos "cortos" y los
viernes retos un poco más largos, el segundo reto se ha tardado un poco porque un usuario tenía una idea, pero no hemos logrado cuadrar nada.
Estate pendiente que igual hoy por la tar o máximo mañana sale el segundo reto.
Saludos!
Recien acabo de llegar al foro y parece que el reto a terminado... De igual forma dejo otra solucion mas, Ojala haya mas retos!
#!/usr/bin/env python
def encode(text):
result = ''
keys = ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv,' 'wxyz']
for char in text:
result += ' ' if char == ' ' else ''
for i, key in enumerate(keys):
result += str(i+2) if char.lower() in key else ''
return result
print 'Undercode.org', '->', encode('Undercode.org')
print 'Esto es una prueba', '->', encode('Esto es una prueba')