[TPC-R] Reto #1: Phonewords

Iniciado por Once, Diciembre 08, 2017, 12:15:03 AM

Tema anterior - Siguiente tema

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

The Python Challenges
el regreso
Reto #1: phonewords


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

Código: python
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

Código: python
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!







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

Soluciones de los participantes (en orden de llegada):

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

Código: python
#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

Código: python
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

Código: python
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

Código: python
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!







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

REsultados

Bueno señores, estás son las pruebas, lastimosamente @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta no pasó ninguna


Lástimosamente para este reto hubo penalizaciones:
@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta por usar identaciones a ocho espacios 0.0005 s
@No tienes permitido ver los links. Registrarse o Entrar a mi cuenta por no cumplir con la plantilla: 0.0005 s

Los puntos por elegancia en la solución se los llevó: @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta 0.0005 s

Al final, la ecuación para calcular el puntaje es: e^-(t-bonificacion+penalizacion)

Los resultados entonces son:



  • larry852
  • po6xsecpo
  • Cr4id3r

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

Estad pendientes, el miércoles sale otroo reto, esta vez una más clásico.

Saludos!







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

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







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

Recien acabo de llegar al foro y parece que el reto a terminado... De igual forma dejo otra solucion mas,  Ojala haya mas retos!

Código: python

#!/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')